java 继承的问题

// 父类
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。
是不是我理解多态和继承有毛病。

MYYA
浏览 487回答 11
11回答

大话西游666

子类中定义和父类重名的属性并不会覆盖父类的原有属性,两者是共存的,父类方法中使用的属性来自父类定义的,printA虽然在子类中调用,但使用的仍然是父类中的a,想使用子类中的a,可以在子类中重写这个printA方法

www说

你得先知道执行的顺序,先执行构造方法(父类--->子类),再初始化非静态变量

守候你守候我

因为你子类调用的是父类的printA方法, 子类的构造函数中 首先需要实例化父类对象即super(),然后由于你子类没有重写父类的printA方法,所以你调用的是父类的方法,父类方法访问父类的a,所以两个输出都是8

慕运维8079593

子类使用的是父类方法printA,而这个父类中的prontA所对应使用的参数a是父类中的变量,并不是子类中的在并没有重写父类方法的前提下,是不会进行覆盖原有父类执行方式的。建议你断点调试一下看看~

30秒到达战场

好像看到你问了两次这个问题, 你的子类并没有重写父类的printA方法,所以两次调用的都是父类的printA方法,所以都打印8

月关宝盒

让我帮你梳理一下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) 有误望指正。

Qyouu

1.new Sub()的时候会调用父类的构造函数,所以会有两次print2.printA()是父类的方法,是声明在Sup这个类里的,System.out.println(a);打印的a不可能从跨过父亲里去找子类的属性a,因为java没有这个特性。

哆啦的时光机

或许你比较一下这个?你应该就知道他们之间的关系了。 // 父类 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(); } }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java