知识点汇总
Java程序要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。
- 自动类型转换:将取值范围小的类型自动提升为取值范围大的类型。
int a = 1;
byte b = 2;
byte c = a + b;// 报错,类型不匹配
在最后一个运算中,a+b
的结果为int类型,取值范围大于用于接收的byte类型,所以报错。
- 强制转换:将取值范围大的类型强制转换为取值范围小的类型。
int a = (int)1.5;
short s = 1;
s = s + 1;// 编译失败,s+1的结果就是自动提升为int类型,而s接收的却是short类型。
s = (short)s + 1;
- ASCII码表就记住几个关键的对应关系。
字符 数值
0 48
A 65
a 97
tip:小a的数值更大。
- a++和++a
这个其实非常简单,a++是先赋值再运算(加1),而++a是先运算(加1)再赋值
int a = 1;
int b = a++;
// 打印a = 2;
// 打印b = 1;
int a = 1;
int b = ++a;
// 打印a=2;
// 打印b=2;
- +=符号的扩展
这个也是一道常见的面试题
short s = 1;
s = s + 1;// 报错
s += 1;// 输出结果为2
原因:
第一种报错的情况前面已经分析过了,这里说第二种为什么可以正常运行。表面是s += 1–>s = s + 1;但是,s = s + 1进行了两次运算,而+=是一个运算符,只运算一次,并带有强制转换的特点,也就是说s += 1-->s = (short) (s + 1)
,因此程序正常运行。
- 还有一个关于常量和变量赋给byte、short数据类型的不同。看下面这段代码
byte b1=1;
byte b2=2;
byte b3=1 + 2;
byte b4=b1 + b2;
System.out.println(b3);//正常输出3
System.out.println(b4);// 编译报错
原因:
b3 = 1 + 2 , 1 和 2 是常量,为固定不变的数据,在编译的时候(编译器javac),已经确定了 1+2 的结果并没有超过byte类型的取值范围,可以赋值给变量 b3 ,因此 b3=1 + 2 是正确的。
反之, b4 = b2 + b3 , b2 和 b3 是变量,变量的值是可能变化的,在编译的时候,编译器javac不确定b2+b3的结果是什么,因此会将结果以int类型进行处理,所以int类型不能赋值给byte类型,因此编译失败。
总结:小的取值范围的数据类型可以被大的包含,也就是可以自动向上转,但是大的数据类型要往下强转,就有可能出现精度损失或者数据丢失的情况。大的数据类型在向下转型时是一个砍字节的过程。比如:
short s = 1;
s = (short) (s+1);
- short占两个字节,1默认为int类型占4个字节
- 两者相加,short自动转换为int,多补了两个字节
- 相加完成,目前是4个字节的一个状态
- 然后加上
(short)
进行一个强转,因为short在内存中占用两个字节,所以就将原本的4个字节的结果去除为只剩下两个字节。