向上转型比较容易理解 :父类引用变量指向其子类的对象。为什么父类引用变量可以指向其子类的对象呢。因为父类引用里面所有的基本基本属性和方法都可以在其指向的子类对象里面找到。反过来,如果是子类引用变量指向其父类的对象,那么子类引用变量里面的属性和基本方法在其父类对象里面根本找不到,这时候就会抛出java.lang.ClassCastException。这就说明 向上直接转型可以 ,但是向下直接转型不行。
那为什么向下转型前 先向上转型就可以了呢?简单的例子如下:
package com.down;
public class Animal {
public void eat(){
System.out.println("我是 animal eat 方法-----");
}
}
package com.down;
public class Cat extends Animal{
public void eat(){
System.out.println("我是一只 cat 的eat 方法----");
}
public void catprint(){
System.out.println("我是cat");
}
}
package com.down;
public class Test {
public static void main(String[] args) {
Animal a=new Cat();//向上转型
Cat cat=(Cat)a;
cat.catprint();
cat.eat();
/*Cat cat=(Cat) new Animal();
cat.catprint();*/
}
}
Animal 引用a 先指向一个Cat 对象,cat引用指向引用a 所指向的堆内存,也就是说引用cat此时和引用a 现在同时指向同一块堆内存。而这块堆内存里面存放的就是一个cat 对象 所以必然可以被引用cat 所指向。可以调用Cat里面所有独特的方法。