我有两个顶级类(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();
}
}
class B
{
void bhel()
{
BaseClass.Laptop obj=new BaseClass.Laptop();
System.out.println(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
是静态引用变量,必须将内存分配给它。因此,执行静态块。但是,为什么在静态块之前执行非静态块?
答案 0 :(得分:7)
所有静态变量声明和静态初始化块按照它们在初始化类时在源代码中出现的顺序进行评估/执行。
static BaseClass e=new BaseClass();
这会在初始化类时创建BaseClass
的实例,并导致在执行构造函数之前调用实例初始化块。
由于该行出现在静态初始化块之前,因此它在该块之前执行,这意味着在静态初始化块之前调用实例初始化块。