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类的初始化程序块没有执行两次,因为构造函数执行了两次?
那么为什么B类的初始化程序块没有执行两次,因为构造函数执行了两次?
不,构造函数只运行一次.编译器会考虑将工作委托给另一个构造函数,并且实例初始化程序不会复制到以this()调用开头的构造函数中.
通常,您无需费心去解决实例初始化程序代码的复制位置.简单地说,它将为每个对象初始化运行一次且仅运行一次.
实例初始化程序运行的时刻是在完成super()构造函数调用之后立即执行的.
您在问题中包含的链接不是Javadoc,而是Oracle教程.这两者之间有一个非常重要的区别:Javadocs是规范性的,而教程只是描述性的.教程中的一些措辞可能不精确,作为教学价值和事实准确性之间的折衷.
如果您对教程中读过的内容有疑问,请尝试在Java语言规范或JDK Javadoc中查找权威语句.
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |