11 回答
TA贡献1817条经验 获得超14个赞
子类中定义和父类重名的属性并不会覆盖父类的原有属性,两者是共存的,父类方法中使用的属性来自父类定义的,printA虽然在子类中调用,但使用的仍然是父类中的a,想使用子类中的a,可以在子类中重写这个printA方法
TA贡献1802条经验 获得超10个赞
因为你子类调用的是父类的printA方法, 子类的构造函数中 首先需要实例化父类对象即super(),然后由于你子类没有重写父类的printA方法,所以你调用的是父类的方法,父类方法访问父类的a,所以两个输出都是8
TA贡献1876条经验 获得超5个赞
子类使用的是父类方法printA,而这个父类中的prontA所对应使用的参数a是父类中的变量,并不是子类中的
在并没有重写父类方法的前提下,是不会进行覆盖原有父类执行方式的。
建议你断点调试一下看看~
TA贡献1772条经验 获得超5个赞
让我帮你梳理一下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)
有误望指正。
TA贡献1786条经验 获得超11个赞
1.new Sub()的时候会调用父类的构造函数,所以会有两次print
2.printA()是父类的方法,是声明在Sup这个类里的,System.out.println(a);
打印的a不可能从跨过父亲里去找子类的属性a,因为java没有这个特性。
TA贡献1779条经验 获得超6个赞
或许你比较一下这个?你应该就知道他们之间的关系了。
// 父类
class Sup {
private int a = 8;
public void printA(){
System.out.println(a);
}
Sup(){
printA();
}
}
//子类
class Sub extends Sup{
Sub(){
super();
printA();
}
public static void main(String[] args) {
new Sub();
}
}
添加回答
举报