- 自动类型转换:容量小的类型自动转换为容量大的数据类型。
数据类型按容量大小排序为:
示例1:
//(1)byte-> int 向上转型
byte a = 7;
int b = a; // b=7
//(2)int-> byte 向下转型
int a = 7;
byte b = a; // 报错:Type mismatch: cannot convert from int to byte
第一种向上转型是自动执行,第二种向下转型不能自动执行,需要手动进行强制转换,否则会报错(编译期错误)。
可以通过下面方式强转:
int a = 7;
byte b = (byte)a;
在变量前的括号内填入你想转的类型(基本类型)。
- 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
示例2:
int a = 1;
short b = 2;
byte c = 3;
// 思考:返回的 d 应该用什么类型来修饰呢?
d = a + b + c;
这貌似个选择题,备选答案有3个(int、short、byte)。 那根据上面提示,这里三种不同类型的数据进行混合运算,它们会自动转成容量最大的那个,也就是int,因此d应该是int类型的。(或者你可以依次将三种类型带入,观察观察。)
- byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
示例3:
char i = 'a';
int j = 3;
System.out.println(i + j); // 100
为什么char类型的 i 和 int类型的 j 能相加呢?并且结果是100。那我们可推算出i的值为97,这i明摆着不是字母‘a’吗?咋又变成97了?这里涉及到ASCII码值了。
ASCII码:上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系做了统一规定。ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写字母是65(二进制01000001)。
参照下表:
可知字符‘a’所对应的十进制就是97,这就使得上面运算程序逻辑成立。
- 当把任何基本类型的值和字符串值进行连接运算时(+),基本类型的值将自动转化为字符串类型。
示例4:
String text = "hello";
String result = text + 1 + 2 + 3;
// 思考:result值是多少?
System.out.println(result);
那有经验的伙伴,答案脱口而出:“hello123”。嗯,对滴,就是它。那下面这个呢。
示例5:
String text = "hello";
//思考: result还是“hello123”吗?
String result = 1 + 2 + text + 3;
相信有不少人入坑了。这个应该输出的是“3hello3”,嗯???小朋友,你是否有很多问号?给你总结条经验吧。
注意:当有进行连接操作(‘+’号)时,若某部分包含字符串,那么这个字符串前边挨着的‘+’号开始,一直往后,都是按字符串形式去拼接的。
补充:
强制类型转换
- 自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符(),但可能造成精度降低或溢出,格外要注意。
- 通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。
- 如: String a = “43”; int i = Integer.parseInt(a);
- boolean类型不可以转换为其它的数据类型。