Java的类型转换可分为基本类型和引用类型的数据转换。
基本类型的转换
类型转换主要在赋值、方法调用、算术运算三种情况下发生。
- 赋值和方法调用 转换规则: 从低位类型到高位类型自动转换;从高位类型到低位类型需要强制类型转换:
布尔型和其它基本数据类型之间不能相互转换;
byte型可以转换为short、int、long、float和double;
short可转换为int、long、float和double;
char可转换为int、long、float和double;
int可转换为long、float和double;
long可转换为float和double;
float可转换为double - 算术运算中的自动类型转换:
基本就是先转换为高位数据类型,再参加运算,结果也是最高位的数据类型;
byte short char运算会转换为Int;
如操作数之一为double,则另一个操作数先被转化为double,再参与算术运算。
如两操作数均不为double,当操作数之一为float,则另一操作数先被转换为float,再参与运算。
如两操作数均不为double或float,当操作数之一为long,、则另一操作数先被转换为long,再参与算术运算。
如两操作数均不为double、float或long,则两操作数先被转换为int,再参与运算。
特殊:
如采用+=、*=等缩略形式的运算符,系统会自动强制将运算结果转换为目标变量的类型。
当运算符为自动递增运算符(++)或自动递减运算符(--)时,如果操作数为byte,short或char类型不发生改变;
引用类型的转换
- 基本类型与对应包装类可自动转换,这是自动装箱和拆箱的原理,由基本类型转换成包装类称为装箱,反之称为拆箱。byte, char, short, int, long, float, double, boolean分别与Byte, Character, Short, Integer, Long, Float, Double, Boolean对应。
- 子类能直接转换为父类或接口类型: 子类就是父类。
例如,牛和狮子都是动物,所以在生成牛和狮子的实例的时候用动物类来指向,所以,子类就是父类;但是,反过来就不行,比如“动物是牛”这句话就说不通。所以在继承体系中,子类会比父类更加具体,代指的实例也更加明确。这种现象在Java中叫做“Is-A”的关系。 - 父类转换为子类要强制类型转换;且在运行时若实际不是对应的对象,会抛出ClassCastException运行时异常。