变量和数据类型
变量
1 | 在Java中,变量分为两种:基本类型的变量和引用类型的变量。 |
1 | *先定义再应用* |
基本数据类型有

1 |
|
整型
1 | 对于整型类型,Java只定义了带符号的整型,因此,最高位的bit表示符号位(0表示正数,1表示负数)。各种整型能表示的最大范围如下 |
1 | public class Main { |
浮点型
因为小数用科学计数法表示的时候,小数点是可以“浮动”的,所以称为浮点数
1 | float f1 = 3.14f; |
布尔类型
1 | 布尔类型boolean只有true和false两个值,布尔类型总是关系运算的计算结果 |
字符类型
1 | 字符类型char表示一个字符。Java的char类型除了可表示标准的ASCII外,还可以表示一个Unicode字符: |
1 | public class Main { |
1 | 注意char类型使用单引号',且仅有一个字符,要和双引号"的字符串类型区分开。 |
引用类型
除了上述基本类型的变量,剩下的都是引用类型
字符串
1 | 引用类型最常用的就是String字符串: |
常量
1 | 定义变量的时候,如果加上final修饰符,这个变量就变成了常量 |
var关键字
1 | 定义变量时,变量类型太长,可以用var |
变量的作用范围
1 | 定义变量时,要遵循作用域最小化原则,尽量将变量定义在尽可能小的作用域,并且,不要重复使用变量名。 |
小结
1 | Java提供了两种变量类型:基本类型和引用类型 |
整数运算
1 | 整数的数值表示不但是精确的,而且整数运算永远是精确的,即使是除法也是精确的,因为两个整数相除只能得到结果的整数部分 |
溢出
1 | 要特别注意,整数由于存在范围限制,如果计算结果超出了范围,就会产生溢出,而溢出不会出错,却会得到一个奇怪的结果 |
1 | public class Main { |
1 | 还有一种简写的运算符,即+=,-=,*=,/=,它们的使用方法如下: |
自增/自减
1 | ++ |
移位运算符
1 | *数值的最高位是一个符号位* |
位运算
1 | 位运算是按位进行与、或、非和异或的运算 |
1 | 对两个整数进行位运算,实际上就是按位对齐,然后依次对每一位进行运算。 |
运算优先级
1 | 在Java的计算表达式中,运算优先级从高到低依次是: |
类型自动提升(整与整)
1 | 在运算过程中,如果参与运算的两个数类型不一致,那么计算结果为较大类型的整型。例如,short和int计算,结果总是int,原因是short首先自动被转型为int |
1 | public class Main { |
强制转换(整与整)
1 | 也可以将结果强制转型,即将大范围的整数转型为小范围的整数。强制转型使用(类型),例如,将int强制转型为short: |
1 | 要注意,超出范围的强制转型会得到错误的结果,原因是转型时,int的两个高位字节直接被扔掉,仅保留了低位的两个字节 |
小结
1 | 整数运算的结果永远是精确的; |
浮点数计算
1 | *无法精确表示数值,不能做移位和位运算* |
1 | // 比较x和y是否相等,先计算其差的绝对值: |
类型提升
1 | 如果参与运算的两个数其中一个是整型,那么整型可以自动提升到浮点型 |
溢出
1 | *整数在除零时编译时不出错,运行时出错* |
强制转换(整与浮)
1 | 可以将浮点数强制转型为整数。在转型时,浮点数的小数部分会被丢掉。如果转型后超过了整型能表示的最大范围,将返回整型的最大值。 |
1 | int n1 = (int) 12.3; // 12 |
1 | 如果要进行四舍五入,可以对浮点数加上0.5再强制转型 |
小结
1 | 浮点数常常无法精确表示,并且浮点数的运算结果可能有误差; |
布尔运算
1 | 对于布尔类型boolean,永远只有true和false两个值。 |
1 | boolean isGreater = 5 > 3; // true |
关系运算符的优先级
1 | ! |
短路运算
true&&任意
1 | 布尔运算的一个重要特点是短路运算。如果一个布尔运算的表达式能提前确定结果,则后续的计算不再执行,直接返回结果。 |
true || 任意
1 | 类似的,对于||运算,只要能确定第一个值为true,后续计算也不再进行,而是直接返回true: |
三元运算符
1 | Java还提供一个三元运算符b ? x : y,它根据第一个布尔表达式的结果,分别返回后续两个表达式之一的计算结果 |
1 | 注意到三元运算b ? x : y会首先计算b,如果b为true,则只计算x,否则,只计算y。此外,x和y的类型必须相同,因为返回值不是boolean,而是x和y之一。 |
小结
1 | 与运算和或运算是短路运算; |
字符和字符串
1 | 在Java中,字符和字符串是两个不同的类型 |
字符
1 | 字符类型char是基本数据类型,它是character的缩写。一个char保存一个Unicode字符 |
字符串
1 | 和char类型不同,字符串类型String是引用类型,我们用双引号"..."表示字符串。一个字符串可以存储0个到任意个字符: |
1 | 因为字符串使用双引号"..."表示开始和结束,那如果字符串本身恰好包含一个"字符怎么表示?例如,"abc"xyz",编译器就无法判断中间的引号究竟是字符串的一部分还是表示字符串结束。这个时候,我们需要借助转义字符\: |
字符串连接
1 | Java的编译器对字符串做了特殊照顾,可以使用+连接任意字符串和其他数据类型,这样极大地方便了字符串的处理。例如: |
小结
1 | public class Main { |
1 | public class array { |
多行字符串
1 | 如果我们要表示多行字符串,使用+号连接会非常不方便: |
1 | 上述多行字符串实际上是5行,在最后一个DESC后面还有一个\n。如果我们不想在字符串末尾加一个\n,就需要这么写: |
1 | 还需要注意到,多行字符串前面共同的空格会被去掉,即: |
不可变特性
空值
1 | 引用类型的变量可以指向一个空值null,它表示不存在,即该变量不指向任何对象。例如: |
小结
1 | Java的字符类型char是基本类型,字符串类型String是引用类型; |


