// 父类
class Sup {
int a = 8;
public void printA(){
System.out.println(a);
}
Sup(){
printA();
}
}
//子类
class Sub extends Sup{
int a = 9;
Sub(){
printA();
}
public static void main(String[] args) {
new Sub();
}
}
为什么两次输出的都是 8 ,按照多态的概念,在子类构造函数中调用者应该是子类对象,访问的也因该是是子类对象的属性9。
是不是我理解多态和继承有毛病。
让我帮你梳理一下new sub()后发生了什么,这里不牵扯到多态的问题,是一个纯继承的问题,
1.new sub(),编译器执行这句话后,先找到sub这个类(并发现sub继承与sup),然后找到sub的空构造函数,开始执行sub构造函数。
2.但在执行sub构造函数前,必须先执行父类的空构造函数,即输出第一次8,。
3.父类构造函数执行完后,真正的子类构造函数来了。执行printA(),但是子类没有重写父类的printA方法,所以找到父类的printA来执行,这里的a还是父类的a,和子类的a没有关系,故输出第二次8。
(继承不包括私有成员private,这里的a没有具体些修饰符,默认就是private,所以你的子类并不是重写了父类的a,而是自己声明了自己的私有a)
有误望指正。