【问题标题】:About constructor initialize sequence when using inheritance in Java关于Java中使用继承时的构造函数初始化顺序
【发布时间】:2018-06-19 09:47:08
【问题描述】:

我正在尝试在“Thingking in Java 第 4 版”中进行“重用/E07_SimpleInheritance2”练习。代码有效,但控制台中的输出是:

A: New instance C
B: New instance B
C: New instance C

但我认为C应该在B前面,因为这句话“System.out.println('C:' + str);”是在C2的构造函数中,后面是实例B。嗯,为什么不呢?

好的,我刚刚在初始化时意识到,序列是:(静态变量,静态字段)>(变量,字段)>构造函数。这就是原因。问题解决了,谢谢楼上的大佬 :)

class A2{
    A2(String str){
        System.out.println("A: " + str);
    }
}

class B2{
    B2(String str){
        System.out.println("B: " + str);
    }
}

class C2 extends A2{
    C2(String str){
        super(str);
        System.out.println("C: " + str); //I think it should work first
    }
    B2 b = new B2("New instance B"); //Then followed by B
}
public class Q7_7_SimpleInheritance2 {

    public static void main(String[] args) {
        C2 c = new C2("New instance C");

    }

}

【问题讨论】:

  • 请添加代码以实例化您的对象
  • @DawoodibnKareem 哎呀,我看错了。认为他的问题是为什么“A”出现在“B”之前。

标签: java inheritance constructor


【解决方案1】:

当创建C2 实例时,首先要执行A2(超类)构造函数,这会导致首先打印A: New instance C

然后C2的实例变量被初始化,在C2的构造函数体之前。因此B2 b = new B2("New instance B");System.out.println("C: " + str);之前执行,所以B: New instance B是第二行输出,C: New instance C是最后一行。

您可能对实例变量b在构造函数之后声明感到困惑,但这没有任何意义。

如下更改代码可能会减少混乱,但会产生完全相同的输出:

class C2 extends A2 
{
    B2 b = new B2("New instance B");
    C2(String str){
        super(str);
        System.out.println("C: " + str);
    }
}

【讨论】:

【解决方案2】:

这里的关键是,当实例化一个类时,会发生以下情况(按此顺序):

  1. super 被调用
  2. 类成员已初始化
  3. 执行其他构造函数语句

23 解释为什么B: New instance BC: New instance C 之前打印。

【讨论】:

    【解决方案3】:

    A 在 C 之前,因为 C 的构造函数在写入 sysout 之前调用了 A 的构造函数。

    【讨论】:

    • 问题是为什么 B 在 C 之前。
    猜你喜欢
    • 1970-01-01
    • 2014-04-02
    • 2012-05-11
    • 2018-01-30
    • 2016-03-23
    • 2013-01-29
    • 1970-01-01
    • 2012-03-19
    • 2017-04-17
    相关资源
    最近更新 更多