Java 非静态块在静态块之前执行

Java 非静态块在静态块之前执行,java,Java,我有两个顶级类(BaseClass和B),BaseClass中有main方法,还有内部类(名为Laptop)。我知道在加载类时会执行静态块,但对于以下代码: package kkk; public class BaseClass { static BaseClass e=new BaseClass(); public BaseClass() { System.out.println("In baseclass constructor"); } { System.

我有两个顶级类(BaseClass和B),BaseClass中有main方法,还有内部类(名为Laptop)。我知道在加载类时会执行静态块,但对于以下代码:

           package kkk;

public class BaseClass 
{

static BaseClass e=new BaseClass();


public BaseClass()
{
System.out.println("In baseclass constructor");
}

{
System.out.println("in baseclass nonstatic block");
}

static
{
System.out.println("in baseclass static block");
}

protected static class Laptop
{
int x=8;

public Laptop()
{
    System.out.println("Inside laptop class");
}

void m1()
{
    System.out.println("Inside inner class method");
}
}



public void hem()
{
System.out.println("In base class hem");
}



public static void main(String args[])
{

e.hem();
System.out.println("In main method baseclass");
B h=new B();
h.bhel();
}
}
B类
{
void bhel()
{
BaseClass.Laptop obj=新的BaseClass.Laptop();
系统输出打印LN(obj.x);
obj.m1();
}
}

通过运行上述代码,我得到如下输出:

in baseclass nonstatic block
In baseclass constructor
in baseclass static block
In base class hem
In main method baseclass
Inside laptop class
8
Inside inner class

e是静态引用变量,必须为其分配内存。因此,执行静态块。但是,为什么在静态块之前执行非静态块???

所有静态变量声明和静态初始化块都是按照类初始化时在源代码中出现的顺序求值/执行的

static BaseClass e=new BaseClass();
这将在初始化类时创建
BaseClass
的实例,并导致在执行构造函数之前调用实例初始化块


由于此行出现在静态初始化块之前,因此在该块之前执行,这意味着在静态初始化块之前调用实例初始化块。

在实例化之前不应该加载基类吗?导致在非静态块之前调用静态块?@PrasadKharkar“非静态块”的正确名称是实例初始化块。每当创建类的实例时,它都会在构造函数之前调用。由于基类初始化的一部分涉及创建基类的实例,所以该实例是在执行该类的静态块之前创建的。嗯,现在我认为这是有意义的。如果我们只是在基类中编写main方法,那么静态块就会执行,但由于这是从另一个类创建实例,它首先调用实例初始值设定项,我是否理解正确?与main无关。如果您再次查看代码,基类有一些需要加载到内存中的静态成员。作为初始化的一部分,将创建一个新的BaseClass实例来初始化为一个静态变量。@PrasadKharkar我不这么认为。仅由于
static BaseClass e=new BaseClass(),实例初始值设定项在静态初始值设定项之前被调用出现在静态初始值设定项块之前的行。将主方法移动到基类不会改变这一点。