1.1. 表达式(掌握)
表达式(expression),是由数字、运算符、括号、常量、变量等以能求得结果的组合。
image.png表达式举例(下列a、b、x、y、z都表示变量)。
n a + b
n 3.14 + a
n (x + y) * z + 100
1.1.1. 基本数据类型转换(掌握)
在8大基本数据类型中,boolean不属于数值类型,所以不参与转换,其他类型的转换规则如下图。一般的,byte、short、char三种类型相互之间不参与转换操作。
image.png按照转换方式,有两种(注意:boolean类型不参与类型转换):
-
自动类型转换:范围小的数据类型直接转换成范围大的数据类型,小->大。
-
强制类型转换:范围大的数据类型强制转换成范围小的数据类型,大->小。
问题:三个大小不同容器,能相互把盛装的水倒给对方吗?
float占4个字节为什么比long占8个字节大?(科普了解)
--->因为底层的实现方式不同
浮点数的32位并不是简单直接表示大小,而是按照一定标准分配的。
第1位,符号位,即S
接下来8位,指数域,即E。
剩下23位,小数域,即M,取值范围为[1 ,2 ) 或[0 , 1)
然后按照公式:V = (-1) ^ s * M * 2 ^ E
也就是说浮点数在内存中的32位不是简单地转换为十进制,而是通过公式来计算而来,通过这个公式虽然,只有4个字节,但浮点数最大值要比长整型的范围要大。
1.1.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 d2 = b2 + c2;//编译报错
int d3 = b2 + c2;//编译通过
}
}
1.1.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 ;
image.png
结论:算数表达式的结果就是其中范围最大的数据类型。
1.1.1.3. 强制类型转换(掌握)
强制类型转换,也称为“显式类型转换”,就是把范围大的数据类型强制转换成范围小的数据类型。
语法格式:范围小的数据类型 变量 = (范围小的数据类型)范围大的数据类型值;
注意:不建议,有可能损失精度
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
}
}
若要获得最好的学习效果,需要配合对应教学视频一起学习。需要完整教学视频,请参看https://ke.qq.com/course/272077。
网友评论