1、父类引用指向子类的对象
如:
Animal A1 = new Dog();
//父类Animal的引用指向子类Dog的对象
此时,父类类型的引用(即A1)可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,父类引用是无法调用的;
注:这里有一个“动态链接/动态调用”的问题?
当父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。
对于属性,父类的引用(即A1)只能引用父类的属性,即使子类有一个同样的属性。
例如:
这里定义一个抽象父类AbstractFather
public abstract class AbstractFather {
public int age=10;
public abstract void eat();
}
再定义一个子类Test01继承它
public class Test01 extends AbstractFather{
public static void main(String[] args) {
// TODO Auto-generated method stub
int age=3;
AbstractFather af=new Test01();
System.out.println("age="+af.age);
af.eat();
//af.move();
}
public void eat(){
System.out.println("Dog eats.");
}
public void move(){
System.out.println("Dog moves.");
}
}
AbstractFather有一个变量age=10,Test01也有一个变量age=3,
那么System.out.println("age="+af.age)的结果是什么?
没错,是10。
af.move();编译出错,错误提示是The method move() is undefined for the type AbstractFather
2、接口引用指向子接口的对象
和父类引用指向子类接口一样,父接口的引用可以调用父接口中定义的所有方法,而对于子接口中定义而父接口中没有的方法,父接口引用是无法调用的;接口中只有常量。
如果对你的疑问有一些帮助,那就点个赞吧!