为了账号安全,请及时绑定邮箱和手机立即绑定

你能分析一下关于继承的JAVA代码的输出吗

你能分析一下关于继承的JAVA代码的输出吗

素胚勾勒不出你 2023-03-17 15:19:49
我在代码的注释中添加了我的问题。class Parent{    int num =9; //I think num in Parent class is overrided by the num in Child class. why is the num in the first line of output is still 9?    { //code block        System.out.println("Parent constructor code..."+num);    }    Parent(){        System.out.println("Parent constructor run");         show(); //why does this method here invoke the show() method in Child class?    }    void show() {        System.out.println("Parent show..."+num);    }}class Child extends Parent{    int num = 8;     {        System.out.println("Child constructor code..."+num);        num = 10;    }    Child(){         System.out.println("Child constructor run");         show();     }    void show() {        System.out.println("Child show..."+num);    }}public class Test {    public static void main(String[] args) {        new Child();    }}输出是:父构造函数代码...9父构造函数运行子显示...0子构造函数代码...8子构造函数运行子显示...10感谢你们!我发现这是一个可变的阴影和隐藏问题。
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

对象构建的顺序是:

  1. 变量声明和初始化

  2. 实例构造函数块

  3. constructor

如果一个类有父类,则在实际类之前先为父类完成相同的顺序。

父母第一

整数 = 9

首先评估,num设置为 9(父母的 1)

父构造函数代码...9

实例初始化块在构造函数(父类的 2.)之前执行

父构造函数运行

构造函数被调用(parent's 3.)

儿童节目...0

Parent调用的构造函数show()show()被覆盖,因此Child调用了。

孩子的 1. 和 2. 还没有被调用,因此 overriding numinChild仍然是 0。*1

然后孩子

整数 = 8

Child1. 被评估

子构造函数代码...8

Child的 2.num在此之后设置为 10。

子构造函数运行

Child的 3。

儿童节目...10

Child的构造函数调用show()

*1:

这就是为什么final在构造函数中调用非方法是非常危险的。方法往往依赖于被初始化的成员变量;他们不是在这一点上。

NullPointerException如果这是一个非原始变量,如果您的方法试图访问它,您很可能会遇到 a 。


查看完整回答
反对 回复 2023-03-17
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

当 java 创建一个子类时,它必须调用super()初始化父类——这样它就可以在超类或其他活动中实例化私有字段。(这不会创建父类的对象。)这就是您看到的原因Parent constructor code...9- 它正在调用父代码,并打印父类的num.

因为您创建了一个子类,所以在父构造函数中show()调用了子类。这就是为什么在构造函数中调用非 final 方法是危险的——如果子对象覆盖了它们,则将调用子对象的方法。

孩子的num是 0 因为Java 将成员变量初始化为默认值,而您的代码还没有机会将其设置为 10。

至于你的子代码,num没有被覆盖,它被隐藏了——只有方法可以被覆盖。这就是为什么您的孩子show()在正确初始化后将其显示为 10 的原因。如果你想访问父变量,你可以用 来实现super.num,但这通常被认为是不好的做法,因为它会引起混淆。


查看完整回答
反对 回复 2023-03-17
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

我认为这是因为你的构造函数自动调用超类构造函数。(对于我们的第一个问题。)尽管如此,你重写了 show 所以当它遇到这个方法时,它调用子方法



查看完整回答
反对 回复 2023-03-17
  • 3 回答
  • 0 关注
  • 185 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信