Java类型转换
隐式类型转换
隐式类型转换支持字节数小的类型自动转换为字节数大的类型,整数类型自动转换为小数类型:
byte ——> short(char) ——> int ——> long ——> float ——> double
public static void main(String[] args) { byte b = 9; short s = b; int i = s; long l = i; float f = l; double d = f; System.out.println(d); } //输出 9.0
- 问:为什么long比float大,还能转换为float呢?
答:小数的存储规则(阶码)让float的最大值比long还大,但可能丢失某些位上的精度。
显式类型转换
显示类型转换(强制类型转换),不符合隐式转换的规则,牺牲精度强行进行类型转换。
public static void main(String[] args) {
int i = 128;
byte b = (byte)i;
System.out.println(b);
}
//输出 -128
- int 128:00000000 00000000 00000000 10000000
- byte:xxxxxxxx xxxxxxxx xxxxxxxx 10000000 => -128
byte第一位是符号位:1-正 0-负
数据类型自动提升
在参与运算或位于表达式中(除自增自减)时,所有的
byte
、short
和char
的值将被提升到int
型:public static void main(String[] args) { byte b = 105; b = b + 1; //报错 System.out.println(b); } //报错:不兼容的类型: 从int转换到byte可能会有损失
这个是由Java虚拟机规范定义的,可以使用强制类型转换:
public static void main(String[] args) { byte b = 105; b = (byte) (b + 1); System.out.println(b); } //输出 106
运算符
赋值和算术运算符
赋值运算符
=
(赋值运算符)是最常用的运算符,将等号右边的结果,传递给等号左边的变量:public static void main(String[] args) { int a = 1; System.out.println(a); } //输出 1
算术运算符
加减乘除取余
+
-
*
/
%
,分别代表加、减、乘、除和取余:public static void main(String[] args) { int a = 1; int b = a + 2; int c = b - 1; int d = c * 4; int e = d / 5; int f = d % 6; System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(d); System.out.println(e); System.out.println(f); } //输出: //1 //3 //2 //8 //1 //2
+
还可以用作字符串连接符:public static void main(String[] args) { String a = "字符串"; String b = "连接符"; String c = a + b; System.out.println(c); } //输出:字符串连接符
字符串可以直接连接其他类型,但是会全部当做字符串处理:
public static void main(String[] args) { int a = 1, b = 2; System.out.println("字符串" + a + b); } //输出:字符串12
自增和自减
++
--
,代表自增和自减,即自身+1
或-1
:int a = 10; int b = 3; a++; b--; System.out.println(a); System.out.println(b); //输出: //11 //2
自增自减运算符放在变量前后的结果不同:
//`a++` 先返回值,再自增 int a = 10; System.out.println(a++); System.out.println(a); //输出: //10 //11 //`++a` 先自增,再返回值 int a = 10; System.out.println(++a); System.out.println(a); //输出: //11 //11
扩展的赋值运算符
+=
-=
*=
/=
%=
,和自增自减类似,先执行运算,再返回结果,同时自身改变:int a = 11; System.out.println(a += 2);//等价于 a = a + 2 System.out.println(a -= 2);//等价于 a = a - 2 System.out.println(a *= 2);//等价于 a = a * 2 System.out.println(a /= 2);//等价于 a = a / 2 System.out.println(a %= 2);//等价于 a = a % 2 System.out.println(a); //输出: //13 //11 //22 //11 //1 //1
关系运算符
>
大于、<
小于、==
等于、>=
大于等于、<=
小于等于、!=
不等于关系运算符的结果只能是布尔类型,要么为真(
true
)要么为假(false
):int a = 1; int b = 2; boolean x = a > b; System.out.println(x); //输出:true
逻辑运算符
&&
与运算,两边同时为true才能返回true||
或运算,两边至少要有一个为true才能返回true!
非运算,一般放在表达式最前面,表达式用括号扩起来,表示对表达式的结果进行反转int a = 1; int b = 2; boolean x = a > b && a < b; System.out.println(x); //输出:false int a = 1; int b = 2; boolean x = a > b || a <= b; System.out.println(x); //输出:true int a = 1; int b = 2; boolean x = !(a > b); System.out.println(x); //输出:false
位运算符
位运算是根据值的二进制编码来计算结果(只有同时为1对应位才得1),返回的是运算后的同类型值,不是boolean值
&
按位与|
按位或^
按位异或~
按位非按位与,以4bit为例:
- 0101 & 0100 = 0100
int a = 7, b = 15; int c = a & b; System.out.println(a & b); //输出:7
三目运算符
可以根据条件是否满足来决定返回值:
判断条件 ? 满足的返回值 : 不满足的返回值
- 判断条件只能是boolean,或返回boolean的表达式
int a = 1, b = 2; System.out.println(a > b ? "对" : "不对";); //输出:不对