转型
转型:
基本数据类型的类型转换 == 引用类型的类型提升
向上转型 : 自动类型提升
从小到大->从子类到父类
父类类型 引用 = new 子类类型();
long l = 1;
向下转型 : 强制类型转换
从大到小 ->从父类到子类
小范围类型 变量 = (小范围类型)大范围类型的数据;
int i = (int)l;
向下转型可能遇到类型转换异常ClassCastException:
引用 instanceof 类型
判断前面的引用是否指向后面类型的对象,或者是否指向后面类型子类的对象,如果是返回true,不是返回false
注意:
多态引用不能调用子类中独有的方法,对子类新增功能不可见
如果想要调用子类的独有方法,需要向下转型
如果向下转型想要保证不出现类型转换异常,可以使用instanceof进行提前判断
public class CastDemo01 {
public static void main(String[] args) {
//向上转型-->化妆
KongZiDie die = new KongZiBrother();
die.teach();
//转型之前的判断: 为了预防类型转换异常的出现
if(die instanceof KongZiBrother){
//向下转型->卸妆
KongZiBrother zi = (KongZiBrother)die;
//KongZiBrother zi = new KongZi();
zi.play();
zi.teach();
}else{
KongZi zi = (KongZi)die;
zi.play();
zi.teach();
}
System.out.println(die instanceof KongZi); //false
System.out.println(die instanceof KongZiBrother); //true
System.out.println(die instanceof KongZiDie); //true
}
}
//父类
class KongZiDie{
String name = "kongzidie";
void teach(){
System.out.println("敲代码...");
}
}
//子类
class KongZi extends KongZiDie{
String name = "kongzi";
void teach(){
System.out.println("论语...");
}
void play(){
System.out.println("LoL...");
}
}
class KongZiBrother extends KongZiDie{
String name = "KongZiBrother";
void teach(){
System.out.println("圣经");
}
void play(){
System.out.println("绝地求生!!!...");
}
}