Java 类中初始化的顺序

Java 类中初始化的顺序,java,class,inheritance,Java,Class,Inheritance,为什么在调用构造函数之前初始化类变量?如果所讨论的类没有扩展任何其他类,但构造函数首先被调用,而如果所讨论的类正在扩展其他类,则初始化类变量 e、 假设我有一节课 public class Windows { public Windows() { System.out.println("in window"); } } 我有一个基类 public class BaseClass { public BaseClass() { System.

为什么在调用构造函数之前初始化类变量?如果所讨论的类没有扩展任何其他类,但构造函数首先被调用,而如果所讨论的类正在扩展其他类,则初始化类变量

e、 假设我有一节课

public class Windows {
    public Windows() {
        System.out.println("in window");
    }
}
我有一个基类

public class BaseClass {
    public BaseClass() {
        System.out.println("in base");
    }
}
最后我还有一节课

public class ChildClass extends BaseClass {

Windows w = new Windows();

public ChildClass() {
    System.out.println("in subclass");

}

public static void main(String[] args) {
    System.out.println(new ChildClass());
}
}
将导致

在基地 橱窗里 在子类中

这表明基类构造函数被调用了,这意味着子类构造函数被调用了,但在基类构造函数完成后,为什么字段被初始化了呢?i、 是不是应该是这样

在基地 在子类中 橱窗里

这可以解释一些事情

如果我这样做了,再来一次

public class ChildClass {

Windows w = new Windows();

public ChildClass() {
    System.out.println("in subclass");

}

public static void main(String[] args) {
    System.out.println(new ChildClass());
}
}
我去拿

橱窗里 在子类中

这表明在构造函数窗口字段初始化之前。困惑的如果我添加一些静态字段,图片甚至会变得混乱

一些解释可能是JVM首先初始化基类,然后是当前类的字段,最后是构造函数。这是真的吗


一些解释会很好

关于Java,你最好的朋友是。关于你的问题,你可以找到答案:

就在对新创建的对象的引用作为 结果,将处理指示的构造函数以初始化新的 对象,请使用以下过程:

  • 为此构造函数调用将构造函数的参数分配给新创建的参数变量
  • 如果此构造函数以同一类中另一个构造函数的显式构造函数调用(§8.8.7.1)开始(使用此构造函数),则 评估构造函数调用的参数和过程 递归地使用同样的五个步骤。如果这个构造器 调用突然完成,然后此过程突然完成 出于同样的原因;否则,继续执行步骤5
  • 此构造函数不会以同一类中另一个构造函数的显式构造函数调用开始(使用此函数)。如果 此构造函数用于对象以外的类,则 构造函数将以显式或隐式调用 超类构造函数(使用super)。评估论点和结论 使用这些函数递归调用超类构造函数的过程 同样的五个步骤。如果构造函数调用突然完成, 然后,出于同样的原因,此过程突然完成。否则 继续执行步骤4
  • 执行该类的实例初始值设定项和实例变量初始值设定项,分配实例变量的值 在 它们在源代码中从左到右的文本显示顺序 为了班级。如果执行这些初始值设定项中的任何一个会导致 异常,则不再处理其他初始值设定项,并且 过程突然完成,但出现了相同的异常。否则 继续执行步骤5
  • 执行此构造函数主体的其余部分。如果该执行突然完成,则此过程将突然完成 出于同样的原因。否则,此过程将正常完成

  • 你可能想看看这个:如果有某种详细描述Java语言的规范,比如说Java语言规范就好了。这里没有“类变量”。它们将是静态的。有实例变量。谢谢,正是我要找的!然而你选择了一个奇怪的地方去看。你应该从JLS开始。我有点困惑。。。JLS?=Java语言规范?