一、继承父类的成员变量和继承父类的方法有什么区别吗?
1、源码示例:
class Base {
int count = 2;
public void display() {
System.out.println(this.count);
}
}
public class Derived extends Base {
int count = 20;
@Override
public void display() {
System.out.println(this.count);
}
public static void main(String[] args) {
// 父类引用指向子类对象
Base bd = new Derived(); // 注释1
System.out.println(bd.count);
bd.display();
}
}
输出结果:
2
20
20
2、原因分析:
如果你刚刚稍微认真分析了代码,你可能会发现你的预计输出跟实际输出是不同的。很可能你会说“不对呀,
bd不是指向子类Derived的对象吗?结果不应该是20吗?”
其实你认为的原因是这样的:
首先应该知道声明时类型、运行时类型这两个概念。前者是说在声明一个引用变量时用到的类型,后者是指在
实际运行中的类型。可能会比较抽象。简单来说对于Base bd=new Derived(); Base就是bd的声明时类型,Derived
就是bd的运行时类型。
实际上:
一个简单却重要的结论是:如果子类重写了父类的方法,那么就会覆盖父类中被重写的方法,这时,指向子类
对象的引用调用这些父子类都有的方法无论声明时类型是其父类还是自身,调用的都是子类中重写后的方法,
这叫做覆盖。而父类的成员变量却不会被子类中同名的成员变量所覆盖,只会被隐藏,当这些同名的实例变量被引用变量访问时,
其返回值取决于引用的声明时类型。