素材牛VIP会员
java 继承的问题
 蜗***牛  分类:Java代码  人气:1379  回帖:11  发布于6年前 收藏
// 父类
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。
是不是我理解多态和继承有毛病。

 标签:java

讨论这个帖子(11)垃圾回帖将一律封号处理……

Lv5 码农
zh***ao 职业无 6年前#1

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

Lv5 码农
de***st CEO 6年前#2

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

Lv3 码奴
谁***的 交互设计师 6年前#3

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

Lv4 码徒
23***om JS工程师 6年前#4

或许你比较一下这个?你应该就知道他们之间的关系了。

// 父类
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();
    }
}
Lv6 码匠
邹***b CEO 6年前#5

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

Lv6 码匠
飞***z 站长 6年前#6

执行顺序:子类Sub()构造器中的printA-->父类Sup构造器里的printA-->走void printA()-->输出8-->回到子类,此时子类其实没有走完a=9-->子类sub里printA方法-->转到父类void printA方法-->输出8
最后结果两个8
构造器用于初始化数据,优先执行
题主在子类父类的构造器,和父类void print方法设置断点,调试几次看看
而且你这似乎没有涉及多态,多态是一个对象有多种不同的形态,你main方法只是实例化了子类

Lv3 码奴
懒***材 职业无 6年前#7

让我帮你梳理一下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)

有误望指正。

Lv5 码农
Ca***on 职业无 6年前#8

因为Sup父类里的printA方法被集成到子类Sub时,里面输出的值已经从Sup里取到了,这一步是在子类new之前就完成的。你再子类里定义的a并没有传入printA,因为你子类没有对应方法。你想输出9要么复写printA,要么在printA里传参

Lv3 码奴
te***es 产品经理 6年前#9

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

Lv6 码匠
gu***yu 软件测试工程师 6年前#10

─━ _ ─━✧打眼一看你好像又问了一遍。还是那句话多自己调试一下吧,或者google,放上一个地址自己看一下吧
http://blog.csdn.net/javaover...

上一页12下一页
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取