为什么java中的实例initiazer块只执行一次?

Rav*_*ara 5 java

class B {

    {
        System.out.println("IIB B");
    }

    B(int i) {
        System.out.println("Cons B int");

    }

    public B() {
        this(10);
        System.out.println("Cons B");
    }
}

public class C extends B {

    {
        System.out.println("IIB C");
    }

    public C() {
        System.out.println("Cons C");
    }

    public static void main(String[] args) {
        C c1 = new C();
    }
}
Run Code Online (Sandbox Code Playgroud)

产量

 IIB B
Cons B int
Cons B
 IIB C
Cons C
Run Code Online (Sandbox Code Playgroud)

根据Oracle教程,

"Java编译器将初始化程序块复制到每个构造函数中.因此,这种方法可用于在多个构造函数之间共享代码块."

那么为什么B类的初始化程序块没有执行两次,因为构造函数执行了两次?

Mar*_*nik 7

那么为什么B类的初始化程序块没有执行两次,因为构造函数执行了两次?

不,构造函数只运行一次.编译器会考虑将工作委托给另一个构造函数,并且实例初始化程序不会复制到以this()调用开头的构造函数中.

通常,您无需费心去解决实例初始化程序代码的复制位置.简单地说,它将为每个对象初始化运行一次且仅运行一次.

实例初始化程序运行的时刻是在完成super()构造函数调用之后立即执行的.


术语说明

您在问题中包含的链接不是Javadoc,而是Oracle教程.这两者之间有一个非常重要的区别:Javadocs是规范性的,而教程只是描述性的.教程中的一些措辞可能不精确,作为教学价值和事实准确性之间的折衷.

如果您对教程中读过的内容有疑问,请尝试在Java语言规范或JDK Javadoc中查找权威语句.