2013-08-05 42 views
1

我有一个简单的代码如下:
匿名块像个静态块

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

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

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

它显示输出: 内的静...... 内部构造......

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

任何人都知道这种行为的任何事情?

+0

如果它是一个静态块,它会显示它的输出,即使没有实例化类,因为你加载它来调用main。你的假设是双重错误的。 – arjacsoh

回答

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

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

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

...将是static块。

+0

谢谢@Mena! 是的,我知道它不是静态块 - 但我也不知道它是一个初始化块。 –

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

一个静态块,而不是它的实例块,它被转换为类似这样

class TempClass 
{ 
    TempClass() 
    { 
     { 

      System.out.println("inside static..."); 
     } 
     System.out.println("inside constructor..."); 
    } 
} 
1

这不是static block。 没有static关键字的块被称为instance blocksinitializer blocks
Java编译器将初始化块复制到每个构造函数中。
参考的Java docs

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

在java中有两个备选方案,以使用构造函数初始化实例变量:初始化块和最终方法。使用final方法
使用初始化块

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; 
    } 

}

1

其实,有没有在你的代码的任何static块。如果它在那里,你可以运行并且无需实例化出来