Java中的强制类型转换涉及两类变量:引用性变量和基本数据类型变量。
其实需要强制类型转换的情况可以概括为:当小转大时不需要,大转小时需要。
1.引用变量的强制类型转化。
子转父时不需要,父转子时需要。
假如有一个people类,另一个student类是people类的子类。
如果是 People people=new Student();这种是不需要强制转换的。
但是如果是 Student stu = new People();
就会编译出错,需要强制转换。
Student student=(Student)new People();
2.基本数据类型变量的强制转换
长数据转短数据需要,短数据转长数据不需要。
图片来自《疯狂Java讲义》。
如图,将一个表示范围短的变量赋给表示范围长的变量是不需要强制转换的,系统会自动做这个事情。
但是!如果将一个长数据赋给段数据就要注意强制类型转换了(长à短时要注意,如果长数据的值超出短数据能表示的范围时会丢失一些位上的数据)。
int a=100;
short s=(short)a;
(再说一个找工作笔试题经常出现的问题:
short s=1;
short s=s+1;编译错误 ,因为java默认数据类型是int,一个short和int相加结果是一个int,将int直接给short是会编译错误的。
short s=1;
short s+=1;编译通过,因为+=这种方式是含有隐式的强制类型转换的,相当于
short s=(short)s+1;
)
3.一个奇怪的现象。
short s=1;编译正确。
按理说,java的默认数据类型是int型,将一个int类型(1)给short类型是需要强制类型转换的,但是这里没有却正确。
另外,如果给short 的这个值超过short能表示的范围,这时候就会有编译错误了。
没找到原因所在,猜测是ide觉得这个值如果不超过表示范围就是安全的,就放过它吧。。。。
结论是,在将一个字面值(jva默认是int型)赋给一个表示范围小于int的变量,比如short、byte、char时,如果这个字面值的大小在该变量能表示的范围内,编译就能通过,反之则不行,需要强制转换。
short s=(short)100000;
当然,我们在编程过程中也是不会把一个超出范围的值赋给变量的。所以,没什么意义。
欢迎补充,欢迎指正。