自动类型转换(从子到父): 子类对象赋值给父类类型的变量指向。
强制类型转换(从父类到子类):
- 此时必须进行强制类型转换:子类 对象变量=(子类)父类类型变量
- 作用:可以解决多态的劣势,可以实现调用子类独有的功能
- 注意:如果转型后的类型和真实对象真是类型不是同一种类型,那么在转换的时候就会出现ClassCastException
Animal t = new Cat();
Dog d =(Dog)t;//出现异常ClassCastException
Java建议强转转换前使用instanceof判断当前对象的真实类型,再进行强制转换
变量名 instanceof 真实类型
判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或者是其子类类型,是则返回true,反之。
父类Animal
package com.itheima.ex;
public class Animal {
public String name="动物名称";
public void run(){
System.out.println("动物可以跑");
}
}
子类Dog
package com.itheima.ex;
public class Dog extends Animal {
public String name="狗名称";
@Override
public void run() {
System.out.println("狗跑的很快");
}
public void lookDoor(){
System.out.println("狗会看门");
}
}
子类Cat
package com.itheima.ex;
public class Cat extends Animal{
public String name="动物名称";
@Override
public void run() {
System.out.println("猫跑的没有狗快");
}
/**
* 独有功能
*/
public void cute(){
System.out.println("猫咪非常的可爱");
}
}
测试类Test
package com.itheima.ex;
public class Test03 {
public static void main(String[] args) {
//自动类型转换
Animal a = new Cat();
a.run();
//强制类型转换
Animal a2 = new Dog();
a.run();
Dog t = (Dog) a2;//从父类类型到子类类型,必须强制类型转换
t.lookDoor();
// Cat d =(Cat)a2;//强制转换成不是原来类型的类型,编译阶段不会报错(注意:有继承或者实现关系编译阶段可以强制,没有毛病),运行时可能报错
if(a2 instanceof Cat){
Cat t1=(Cat) a2;//从父类类型到子类类型,必须强制转换
t1.cute();
}else if (a2 instanceof Dog){
Dog d=new Dog();
d.lookDoor();
}
}
}
测试结果