【问题标题】:non static block is executed before static block非静态块在静态块之前执行
【发布时间】:2015-06-23 10:29:15
【问题描述】:

我有两个顶级类(BaseClass 和 B),BaseClass 中有 main 方法,也有内部类(名为笔记本电脑)。我知道每当加载类时都会执行静态块,但对于以下代码:

           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

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

【问题讨论】:

    标签: java


    【解决方案1】:

    所有静态变量声明和静态初始化块都按照它们在初始化类时在源代码中出现的顺序进行评估/执行。

    static BaseClass e=new BaseClass();
    

    这会在类初始化时创建BaseClass 的实例,并导致在执行构造函数之前调用实例初始化块。

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

    【讨论】:

    • 不应该在实例化之前加载BaseClass吗?导致静态块在非静态块之前被调用?
    • @PrasadKharkar “非静态块”的正确名称是实例初始化块。每当您创建类的实例时,都会在构造函数之前调用它。由于 BaseClass 的部分初始化涉及创建 BaseClass 的实例,因此该实例是在执行类的静态块之前创建的。
    • 嗯,现在我认为这是有道理的。如果我们只是在 BaseClass 中编写 main 方法,那么静态块就会执行,但是由于这是从另一个类创建实例,所以它首先调用实例初始化器,我理解正确吗?
    • 与 Main 没有任何关系。如果再看代码,BaseClass 有一些静态成员需要加载到内存中。作为此初始化的一部分,将创建 BaseClass 的新实例以初始化为静态变量。
    • @PrasadKharkar 我不这么认为。实例初始化程序在静态初始化程序之前被调用,只是因为 static BaseClass e=new BaseClass(); 行出现在静态初始化程序块之前。将 main 方法移至 BaseClass 不会改变这一点。
    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2018-08-25
    • 2014-06-05
    • 2022-12-22
    相关资源
    最近更新 更多