跳到主要内容

Java 语言基础

一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。

对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。 类:类是一个模板,它描述一类对象的行为和状态。 方法:方法就是行为,一个类可以有很多方法。逻辑运算、数据修改以及所有动作都是在方法中完成的。 实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。

Java 自带的关键字

分类关键字
访问控制privateprotectedpublic
类,方法和变量修饰符abstractclassextendsfinalimplementsinterfacenative
newstaticstrictfpsynchronizedtransientvolatileenum
程序控制breakcontinuereturndowhileifelse
forinstanceofswitchcasedefaultassert
错误处理trycatchthrowthrowsfinally
包相关importpackage
基本类型booleanbytechardoublefloatintlong
short
变量引用superthisvoid
保留字gotoconst

注意 ⚠️:虽然 true, false, 和 null 看起来像关键字但实际上他们是字面值,同时你也不可以作为标识符来使用。

Java 中的几种基本数据类型

Java 中有 8 种基本数据类型,分别为:

  1. 6 种数字类型:
    • 4 种整数型:byteshortintlong
    • 2 种浮点型:floatdouble
  2. 1 种字符类型:char
  3. 1 种布尔型:boolean

这 8 种基本数据类型的默认值以及所占空间的大小如下:

基本类型位数字节默认值取值范围
byte810-128 ~ 127
short1620-32768 ~ 32767
int3240-2147483648 ~ 2147483647
long6480L-9223372036854775808 ~ 9223372036854775807
char162'u0000'0 ~ 65535
float3240f1.4E-45 ~ 3.4028235E38
double6480d4.9E-324 ~ 1.7976931348623157E308
boolean1falsetrue、false

对于 boolean,官方文档未明确定义,它依赖于 JVM 厂商的具体实现。逻辑上理解是占用 1 位,但是实际中会考虑计算机高效存储因素。

另外,Java 的每种基本类型所占存储空间的大小不会像其他大多数语言那样随机器硬件架构的变化而变化。这种所占存储空间大小的不变性是 Java 程序比用其他大多数语言编写的程序更具可移植性的原因之一(《Java 编程思想》2.2 节有提到)。

注意:

  1. Java 里使用 long 类型的数据一定要在数值后面加上 L,否则将作为整型解析。
  2. char a = 'h'char :单引号,String a = "hello" :双引号。

包装类型

那么基本数据类型已经认识和了解,那我们来看看什么叫包装类型呢?

这八种基本类型都有对应的包装类分别为:ByteShortIntegerLongFloatDoubleCharacterBoolean

包装类型不赋值就是 Null ,而基本类型有默认值且不是 Null 。基本数据类型有默认值 比如 int 默认值为0,boolean 默认值为false。

Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False

两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。

什么叫自动拆装箱?:

  • 装箱:将基本类型用它们对应的引用类型包装起来;
  • 拆箱:将包装类型转换为基本数据类型;

示例:

int a = 10;
Integer b = new Integer(10);
System.out.println(a == b);
System.out.println(a == b.intValue());
System.out.println(a.equals(b));

常见面试题

  1. 什么叫自动拆箱和自动装箱?
  2. 什么叫包装类?
  3. 什么叫基本数据类型?
  4. 什么叫引用类型?
  5. Integer的 129 直接使用 == 129 返回false?

运算符

计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组:

  • 算术运算符
  • 关系运算符
  • 位运算符
  • 逻辑运算符
  • 赋值运算符
  • 其他运算符
  • 算术运算符

算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。

表格中的实例假设整数变量A的值为10,变量B的值为20:

符号操作符作用例子
+加法相加运算符两侧的值A + B 等于 30
-减法左操作数减去右操作数A – B 等于 -10
*乘法相乘操作符两侧的值A * B等于200
/除法左操作数除以右操作数B / A等于2
取余左操作数除以右操作数的余数B%A等于0
++自增操作数的值增加1B++ 或 ++B 等于 21
--自减操作数的值减少1B-- 或 --B 等于 19

++和-- 自增自减运算符 ++ 和 -- 运算符可以放在变量之前,也可以放在变量之后,当运算符放在变量之前时(前缀),先自增/减,再赋值;当运算符放在变量之后时(后缀),先赋值,再自增/减。例如,当 b = ++a 时,先自增(自己增加 1),再赋值(赋值给 b);当 b = a++ 时,先赋值(赋值给 b),再自增(自己增加 1)。也就是,++a 输出的是 a+1 的值,a++输出的是 a 值。用一句口诀就是:“符号在前就先加/减,符号在后就后加/减”。

关系运算符

== 检查如果两个操作数的值是否相等,如果相等则条件为真

!= 检查如果两个操作数的值是否相等,如果值不相等则条件为真

> 检查左操作数的值是否大于右操作数的值,如果是那么条件为真

< 检查左操作数的值是否小于右操作数的值,如果是那么条件为真

>= 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真

<= 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真

位运运算符

如果相对应位都是1,则结果为1,否则为0

| 如果相对应位都是 0,则结果为 0,否则为 1

^ 如果相对应位值相同,则结果为0,否则为1

按位取反运算符翻转操作数的每一位,即0变成1,1变成0

<< 按位左移运算符。左操作数按位左移右操作数指定的位数

>> 按位右移运算符。左操作数按位右移右操作数指定的位数

>>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充

逻辑运算符

&& 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真

|| 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真

称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false

三目运算符

condition ? expr1 : expr2

condition 为条件,expr1 为条件为真时返回的值,expr2 为条件为假时返回的值

示例:

int a = 10;
int b = (a > 5) ? 20 : 30;
System.out.println(b); // 输出:20

数组与循环

数组:一种用于存储多个值的数据结构

创建数组并且初始化值:

int[] arr = new int[5]{1,2,3,4,5};

数组arr的元素个数是5,那么数组arr的索引范围是0~4

比如:arr[0] 会是 1,arr[1] 会是 2,arr[2] 会是 3,arr[3] 会是 4,arr[4] 会是 5

那么我们怎么访问数组中的元素呢? 访问数组中的元素:

  • 通过索引下标访问
  • 通过循环访问

那么什么是循环呢?

循环:重复执行一段代码,直到满足某个条件为止。

循环的种类:

  • for循环
  • while循环
  • do...while循环

循环的语法:

for (初始化语句; 循环条件; 循环后置语句) { }

while (循环条件) { }

do { } while (循环条件);

//例子
for (int i = 0; i < 10; i++) {
System.out.println(i);
}

条件语句

条件语句:判断某个条件是否满足,满足则执行相应的代码。

java 有下面几种类型的条件语句:

  • if...else
  • switch...case
  • 三元运算符
if (条件) {}

else if (条件) {}

else {}

switch (表达式) {
case1: {}
break;
}

switch 语句的表达式必须为整型或枚举型,不能为字符串型 (但是在新版的 jdk17 可以使用字符串作为值判断)。