Loading... # Java类型转换 ## 隐式类型转换 隐式类型转换支持字节数小的类型自动转换为字节数大的类型,整数类型自动转换为小数类型: - byte ——> short(char) ——> int ——> long ——> float ——> double ```java 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还大,但可能丢失某些位上的精度。 ## 显式类型转换 显示类型转换(强制类型转换),不符合隐式转换的规则,牺牲精度强行进行类型转换。 ```java 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`型: ```java public static void main(String[] args) { byte b = 105; b = b + 1; //报错 System.out.println(b); } //报错:不兼容的类型: 从int转换到byte可能会有损失 ``` 这个是由Java虚拟机规范定义的,可以使用强制类型转换: ```java public static void main(String[] args) { byte b = 105; b = (byte) (b + 1); System.out.println(b); } //输出 106 ``` # 运算符 ## 赋值和算术运算符 ### 赋值运算符 `=`(赋值运算符)是最常用的运算符,将等号右边的结果,传递给等号左边的变量: ```java public static void main(String[] args) { int a = 1; System.out.println(a); } //输出 1 ``` ### 算术运算符 #### 加减乘除取余 `+` `-` `*` `/` `%`,分别代表加、减、乘、除和取余: ```java 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 ``` - `+`还可以用作字符串连接符: ```java public static void main(String[] args) { String a = "字符串"; String b = "连接符"; String c = a + b; System.out.println(c); } //输出:字符串连接符 ``` - 字符串可以直接连接其他类型,但是会全部当做字符串处理: ```java public static void main(String[] args) { int a = 1, b = 2; System.out.println("字符串" + a + b); } //输出:字符串12 ``` #### 自增和自减 `++` `--`,代表自增和自减,即自身`+1`或`-1`: ```java int a = 10; int b = 3; a++; b--; System.out.println(a); System.out.println(b); //输出: //11 //2 ``` - 自增自减运算符放在变量前后的结果不同: ```java //`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 ``` #### 扩展的赋值运算符 `+=` `-=` `*=` `/=` `%=`,和自增自减类似,先执行运算,再返回结果,同时自身改变: ```java 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`): ```java int a = 1; int b = 2; boolean x = a > b; System.out.println(x); //输出:true ``` ## 逻辑运算符 `&&` 与运算,两边同时为true才能返回true `||` 或运算,两边至少要有一个为true才能返回true `!` 非运算,一般放在表达式最前面,表达式用括号扩起来,表示对表达式的结果进行反转 ```java 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 ```java int a = 7, b = 15; int c = a & b; System.out.println(a & b); //输出:7 ``` ## 三目运算符 可以根据条件是否满足来决定返回值: - 判断条件 ? 满足的返回值 : 不满足的返回值 - 判断条件只能是boolean,或返回boolean的表达式 ```java int a = 1, b = 2; System.out.println(a > b ? "对" : "不对";); //输出:不对 ``` 最后修改:2022 年 01 月 17 日 © 允许规范转载 赞 0 如果想要赞赏,我绝不阻拦