打个比方: Animal a = new Cat(); 猫与动物就是子父类关系,左边是父类的引用,右边是子类的对象。编译的时候是看左边父类,运行的时候看右边子类:比如说调用吃这个方法,动物都会那么编译通过,但运行的时候,是运行猫的吃的动作;再比如:调用抓老鼠方法,动物就不一定了,这个是猫的特有,编译不通过。
第三个问题就是对象的上转型,即父类声明的对象用他的子类来初始化。例如:
class A{
public void show()
{}
}
class B extends A{
public void show()
{
.............
}
}
public static void main(String [] args){
A a=new B();
}
Fu f = new Zi(); 就是父类的引用指向子类对象啊。你可以学习一下引用变量在内存中的加载方式就明白了。因为new一个对象在内存中的过程就是先在堆内存中开辟一个内存空间。然后在栈内存中也开辟一个空间,存入一个变量,这个变量记录堆内存的地址。父类引用指向子类对象就是父类的这个变量记录的是一个子类对象的地址值。