向上转型:即子类对象转换为父类对象。向下转型:即父类对象转为子类对象,这是又分为安全的向下转型和不安全的向下转型
class Animal{
String type;
public Animal(String type){
this.type = type;
}
public void eat(){
System.out.println("Animal is eating!");
}
}
class Dog extends Animal{
int age;
public Dog(String name,int age){
super(name);
this.age = age;
}
public void eat(){
System.out.println("Dog is eating");
}
public void run(){
System.out.println("Dog is running");
}
}
Animal a = new Dog("dog",5);//向上转型
Animal b = new Animal("Animal");
a.eat();
a.run();//Error,编译报错
System.out.println(a.age);//Error,编译报错
System.out.println(a.type);
((Dog)a).run();//安全的向下转型
((Dog)a).eat();//安全的向下转型
System.out.println(((Dog)a).type);//安全的向下转型
System.out.println(((Dog)a).age);//安全的向下转型
b.eat();
System.out.println(b.type);
((Dog)b).eat();//不安全的向下转型,编译不错,运行出错
System.out.println(((Dog)b).type);//不安全的向下转型,编译不错,运行出错
((Dog)b).run();//不安全的向下转型,编译不错,运行出错
System.out.println(((Dog)b).age);//不安全的向下转型,编译不错,运行出错
a.eat()调用子类的eat()方法。原因:a实际指向的是Dog子类,故调用时会调用子类本身的方法。
需要注意的是向上转型时a会遗失自己特有的属性和方法,只能调用从父类中的继承的方法和属性。如本例中的run方法和age属性不再为a调用。
上面不安全的向下转型会报
java.lang.ClassCastException: com.nsh.main.Animal cannot be cast to com.nsh.main.Dog
at com.nsh.main.Main.main(Main.java:34)