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

我在代码的注释中添加了我的问题。


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


感谢你们!我发现这是一个可变的阴影和隐藏问题。


素胚勾勒不出你
浏览 186回答 3
3回答

侃侃无极

对象构建的顺序是:变量声明和初始化实例构造函数块constructor如果一个类有父类,则在实际类之前先为父类完成相同的顺序。父母第一整数 = 9首先评估,num设置为 9(父母的 1)父构造函数代码...9实例初始化块在构造函数(父类的 2.)之前执行父构造函数运行构造函数被调用(parent's 3.)儿童节目...0Parent调用的构造函数show()。show()被覆盖,因此Child调用了。孩子的 1. 和 2. 还没有被调用,因此 overriding numinChild仍然是 0。*1然后孩子整数 = 8Child1. 被评估子构造函数代码...8Child的 2.num在此之后设置为 10。子构造函数运行Child的 3。儿童节目...10Child的构造函数调用show()。*1:这就是为什么final在构造函数中调用非方法是非常危险的。方法往往依赖于被初始化的成员变量;他们不是在这一点上。NullPointerException如果这是一个非原始变量,如果您的方法试图访问它,您很可能会遇到 a 。

小怪兽爱吃肉

当 java 创建一个子类时,它必须调用super()初始化父类——这样它就可以在超类或其他活动中实例化私有字段。(这不会创建父类的对象。)这就是您看到的原因Parent constructor code...9- 它正在调用父代码,并打印父类的num.因为您创建了一个子类,所以在父构造函数中show()调用了子类。这就是为什么在构造函数中调用非 final 方法是危险的——如果子对象覆盖了它们,则将调用子对象的方法。孩子的num是 0 因为Java 将成员变量初始化为默认值,而您的代码还没有机会将其设置为 10。至于你的子代码,它num没有被覆盖,它被隐藏了——只有方法可以被覆盖。这就是为什么您的孩子show()在正确初始化后将其显示为 10 的原因。如果你想访问父变量,你可以用 来实现super.num,但这通常被认为是不好的做法,因为它会引起混淆。

慕莱坞森

我认为这是因为你的构造函数自动调用超类构造函数。(对于我们的第一个问题。)尽管如此,你重写了 show 所以当它遇到这个方法时,它调用子方法
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java