gpt4 book ai didi

Java 构造函数 - 继承层次结构中的执行顺序

转载 作者:IT老高 更新时间:2023-10-28 20:39:38 36 4
gpt4 key购买 nike

考虑下面的代码

  class Meal {
Meal() { System.out.println("Meal()"); }
}

class Bread {
Bread() { System.out.println("Bread()"); }
}

class Cheese {
Cheese() { System.out.println("Cheese()"); }
}

class Lettuce {
Lettuce() { System.out.println("Lettuce()"); }
}

class Lunch extends Meal {
Lunch() { System.out.println("Lunch()"); }
}

class PortableLunch extends Lunch {
PortableLunch() { System.out.println("PortableLunch()");}
}

class Sandwich extends PortableLunch {
private Bread b = new Bread();
private Cheese c = new Cheese();
private Lettuce l = new Lettuce();
public Sandwich() {
System.out.println("Sandwich()");
}
public static void main(String[] args) {
new Sandwich();
}
}

基于我对类成员初始化和构造函数执行顺序的理解。我希望输出是

Bread()
Cheese()
Lettuce()
Meal()
Lunch()
PortableLunch()
Sandwich()

因为我相信类成员甚至在调用 main 方法之前就已初始化。但是,当我运行程序时,我得到了以下输出

Meal()
Lunch()
PortableLunch()
Bread()
Cheese()
Lettuce()
Sandwich()

我的困惑是 Meal()Lunch() 和 PortableLunch() 在 Bread() Cheese() 和 Lettuce() 之前运行,即使它们的构造函数在之后调用。

最佳答案

这些是实例字段

private Bread b = new Bread();
private Cheese c = new Cheese();
private Lettuce l = new Lettuce();

它们只有在创建实例时才存在(执行)。

在你的程序中运行的第一件事是

public static void main(String[] args) {
new Sandwich();
}

super 构造函数被隐式调用为每个构造函数中的第一件事,即。 System.out.println

之前
class Meal {
Meal() { System.out.println("Meal()"); }
}

class Lunch extends Meal {
Lunch() { System.out.println("Lunch()"); }
}

class PortableLunch extends Lunch {
PortableLunch() { System.out.println("PortableLunch()");}
}

super() 调用后,实例字段在构造函数代码之前再次实例化。

顺序,颠倒

new Sandwich(); // prints last
// the instance fields
super(); // new PortableLunch() prints third
super(); // new Lunch() prints second
super(); // new Meal(); prints first

关于Java 构造函数 - 继承层次结构中的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19407187/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com