六、表达式
表达式(expression),是由数字、运算符、括号、常量、变量等以能求得结果的组合
七、数据类型的转换
在8大基本数据类型中,boolean不属于数值类型,所以不参与转换,其他类型的转换规则如下图。一般的,byte、short、char三种类型相互之间一般不参与转换操作,按照转换方式,有两种(注意:boolean类型不参与类型转换):
- 自动类型转换:范围小的数据类型直接转换成范围大的数据类型,小->大
- 强制类型转换:范围大的数据类型强制转换成范围小的数据类型,大->小
7.1、自动类型转换与提升
7.1.1、自动类型转换
自动类型转换,也称为“隐式类型转换,就是把范围小的数据类型直接转换成范围大的数据类型
转换规则:byte、short、char—>int—>long—>float—>double
注意事项:byte、short、char相互之间不转换,他们参与运算首先转换为int类型
语法格式:范围大的数据类型 变量 = 范围小的数据类型值
public class TypeConvertDemo1{ public static void main(String[] args) { //把int类型变量转为long类型 long longNumber = 17;//整数默认为int类型 //把long类型转换为float类型 float f1 = longNumber; //把float类型转换为double类型 double d = f1; //定义两个int类型的变量 int a1 = 2; int b1 = 3; int c1 = a1 + b1; //定义一个byte类型,一个int类型 byte b2 = 2; int c2 = 3; System.out.println(b2 + c2); //byte、short、char类型参与运算时把自己提升为int类型 //byte d1 = b2 + c2;//编译报错 int d3 = b2 + c2;//编译通过 } } 复制代码
7.1.2、自动类型提升
当一个算术表达式中,包含多个基本数据类型的常量或变量(boolean除外)时,整个算术表达式的结果类型将出现自动提升,其规则是:
- 所有的byte、short、char类型被自动提升到int类型,再参与运算
- 整个表达式的最终结果类型,被提升到表达式中类型最高的类型
System.out.println('a' + 1);//98 byte b = 22; b = b + 11;//编译出错,此时结果类型应该是int double d1 = 123 + 1.1F + 3.14 + 99L ; 复制代码
结论:算数表达式结果的类型就是其中范围最大的数据类型。
7.2、强制类型转换
强制类型转换,也称为“显式类型转换”,就是把范围大的数据类型强制转换成范围小的数据类型
# 语法格式: # 范围小的数据类型 变量 = (范围小的数据类型)范围大的数据类型值; 复制代码
注意:一般情况下不建议使用强转,因为强转有可能损失精度
public class TypeConvertDemo2{ public static void main(String[] args) { int a = 2; byte b = 3; //自动类型转换 int c = a + b; //强制类型转换 byte d = (byte) (a + b); //把double转换为int类型 int i = (int)3.14; System.out.println(i);//3 } } 复制代码
八、运算符
对常量和变量进行操作的符号称为运算符
常见的运算符分为:算术运算符、赋值运算符、比较运算符、逻辑运算符、三元运算符
8.1、算数运算符
运算符 | 运算规则1 | 示例 | 结果 |
+ | 正号 | +3 | 3 |
+ | 加 | 52+3 | 5 |
+ | 拼接字符串 | "中"+"国" | “中国” |
- | 符号 | int a = 3 -a |
-3 |
- | 减 | 3-1 | 2 |
* | 乘 | 2*3 | 6 |
/ | 除 | 5/2 | 2 |
% | 取模 | 5%2 | 1 |
++ | 自增 | int a = 1 a++(++a) |
2 |
-- | 自减 | int b =2 b--(--b) |
1 |
8.2、自增和自减
自增:++,递增操作符,使变量值增加1,有前置和后置之分,只能操作变量。
自减:-- ,递减操作符,使变量值减去1,有前置和后置之分,只能操作变量。
以++为例:
a++和++a结果都是让a的值自增1,如果只是需要自增的话,使用哪一种都可以
但是他们俩有唯一的区别:
- 前置(++a): 表示对a加1之后的结果进行运算,先加后用
- 后置(a++):表示对a变量加1之前的值(原始值)进行运算,先用后加
public class ArithmeticOperatorsDemo2{ public static void main(String[] args) { int a1 = 5; int b1 = ++ a1; System.out.println("a1=" + a1 + ",b1=" + b1);//a1=6,b1=6 int a2 = 5; int b2 = a2 ++; System.out.println("a2=" + a2 + ",b2=" + b2);//a2=6,b2=5 } } 复制代码
比较底层的解释
++a表示取a的地址,增加它的内容,然后把值放在寄存器中 a++表示取a的地址,把它的值装入寄存器,然后增加内存中的a的值
8.3、赋值运算符
运算符 | 运算规则 | 示例 | 结果 |
== | 是否相等于 | 4==3 | false |
!= | 是否不等于 | !4=3 | true |
< | 小于 | 4<3 | false |
> | 大于 | 4>3 | true |
<= | 小于等于 | 4<=3 | false |
>= | 大于等于 | 4>=3 | true |
8.4、三元运算符
三元运算符,表示有三个元素参与的表达式,所以又称为三目运算符,其语义表示if-else(如果什么情况就做什么,否则做什么)
语法格式:数据类型 变量 = boolean表达式 ? 结果A :结果B
表达的意思,boolean表达式结果:
- 为true,则三元运算符的结果是结果A
- 为false,则三元运算符的结果是结果B
注意:
- 三元运算符必须定义变量接受运算的结果,否则报错
- 三元运算符结果的类型由结果A和结果B来决定的,结果A和结果B的类型是相同的
8.5、逻辑运算符
逻辑运算符用于连接两个boolean表达式,结果也是boolean类型的
运算符 | 运算规则 | 示范 | 结果 |
& | 与 | false & true | false |
| | 或 | false | true | true |
^ | 异或 | true ^ false | true |
! | 非 | !true | false |
&& | 短路与 | false && false | false |
|| | 短路或 | false || false | true |
规律:
- 非:取反,!true则false,!false则true
- 与:有false则false
- 或:有true则true
- 异或:^ 相同则false,不同则true
8.5.1、&和&&( | 和 | |)的区别
& :&左边表达式无论真假,&右边表达式都进行运算
&& :如果&&左边表达式为真,&&右边表达式参与运算,否则&&右边表达式不参与运算,故称短路与| 和 || 的区别同理,||,左边为真,右边不参与运算
public class LogicalOperatorDemo2 { public static void main(String[] args) { System.out.println(false & 1 / 0 == 1);//报错,说明右边执行了 System.out.println(false && 1 / 0 == 1);//不报错,说明右边没有执行 System.out.println(true | 1 / 0 == 1);//报错,说明右边执行了 System.out.println(true | 1 / 0 == 1);//不报错,说明右边没有执行 } } 复制代码