我有两个顶级类(BaseClass 和 B),BaseClass 中有 main 方法,还有内部类(名为 Laptop)。我知道每当加载类时都会执行静态 block ,但对于以下代码:
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 类
{
无效的 bhel()
{
BaseClass.Laptop obj=new BaseClass.Laptop();
System.out.println(obj.x);
对象.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 是静态引用变量,必须为其分配内存。因此,静态 block 被执行。但是,为什么非静态 block 在静态 block 之前执行??
最佳答案
所有静态变量声明和静态初始化 block 都按照它们在初始化类时在源代码中出现的顺序求值/执行。
static BaseClass e=new BaseClass();
这会在初始化类时创建 BaseClass
的实例,并导致在执行构造函数之前调用实例初始化 block 。
由于这一行出现在静态初始化 block 之前,它在该 block 之前执行,这意味着实例初始化 block 在静态初始化 block 之前被调用。
关于java - 非静态 block 在静态 block 之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31000335/