1

我有一个简单的代码如下:

class TempClass 
{  
    {    
        System.out.println("inside static...");
    }

    TempClass()
    {
        System.out.println("inside constructor...");
    }

    public static void main(String [] args)
    {
        new TempClass();
    }
}

它显示输出为:内部静态...内部构造函数...

但是当我评论实例创建行时,它显示空白输出。因此,只要调用构造函数,它就充当静态块。这是否意味着编写静态不是强制性的(当类被实例化时)?

有人知道这种行为吗?

4

4 回答 4

8
{
      System.out.println("inside static...");
}

... 不是一个static块,它是一个实例块。

static {
      System.out.println("inside static...");
}

......将是一个static障碍。

于 2013-08-05T12:21:01.713 回答
6
{
  System.out.println("inside static...");
}

不是静态块,而是一个实例它被翻译成这样的东西

class TempClass
{  
    TempClass()
    {
        {

           System.out.println("inside static...");
        }
        System.out.println("inside constructor...");
    }
}
于 2013-08-05T12:22:05.850 回答
1

它不是static block。没有static关键字的块称为instance blocksor initializer blocks
Java 编译器将初始化程序块复制到每个构造函数中。
参考java文档

实例变量的初始化块看起来就像静态初始化块,但没有 static 关键字:

在 java 中,使用构造函数来初始化实例变量有两种选择:初始化块和最终方法。
使用初始化块

class Whatever {
   private int myVar ;
   {
     // initialization code goes here
      myvar = 10;
   }
}

使用最终方法。

class Whatever {
  private int myVar = initializeInstanceVariable();

  protected final int initializeInstanceVariable() {

    // initialization code goes here
    return 10;
  }

}

于 2013-08-05T12:22:51.397 回答
1

实际上,您的代码中没有任何static块。如果它在那里,您可以运行并获得输出而无需实例化

于 2013-08-05T12:27:52.407 回答