gpt4 book ai didi

java - 扩展类时初始化 block 的行为如何?

转载 作者:行者123 更新时间:2023-12-01 12:55:24 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





static block vs initializer block vs constructor in inheritance [duplicate]

(4 个回答)


去年关闭。




我有以下代码:

public class Demo{
public static void main(String[] args) {
new B();
}
}

class A {
static {
System.out.println("A static initializer block");
}
static void methodOfA() {
System.out.println("A static method");
}
{
System.out.println("A non-static initializer block");
}
public A() {
System.out.println("A constructor");
}
public A(String a) {
System.out.println(a);
}
}

class B extends A {
static {
System.out.println("B static initializer block");
}
static void methodOfB() {
System.out.println("B static method");
}
{
System.out.println("B non-static initializer block");
}
public B() {
super("test");
System.out.println("B constructor");
}
}

我得到的输出是:
静态初始化块
B 静态初始化块
非静态初始化块
测试
B 非静态初始化块
B 构造函数
但我希望它是:
静态初始化块
B 静态初始化块
非静态初始化块
B 非静态初始化块
测试
B 构造函数
因为,据我所知,初始化块是在构造函数之前加载的。
我一直在浏览 google 和 stackoverflow 寻找答案,但没有成功。
任何澄清将不胜感激!

最佳答案

父类(super class)构造函数在子类构造函数之前执行,非静态初始化器在构造函数之前立即执行。因此,在您的输出中,“测试”出现在“B 非静态初始化程序块”之前。

关于java - 扩展类时初始化 block 的行为如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62833825/

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