Java独立代码块

我已经使用Java很长一段时间了,但从未遇到类似这样的事情。 我想知道它的作用以及为什么它不是错误。

public class Foo{ private int someVariable; { doSomething(); } public Foo(){ } private void doSomething(){ // Something is done here } } 

我想知道单个块的目的是什么,其中包含对“doSomething()”的调用。 它只是一个骨架代码。 我遇到的实际代码是http://www.peterfranza.com/2010/07/15/gwt-scrollpanel-for-touch-screens/

它是一个(非静态)初始化块。 它在官方教程中有记录:

初始化实例成员

通常,您可以使用代码在构造函数中初始化实例变量。 使用构造函数初始化实例变量有两种选择:初始化块和最终方法。 实例变量的初始化程序块看起来就像静态初始化程序块,但没有静态关键字:

 { // whatever code is needed for initialization goes here } 

Java编译器将初始化程序块复制到每个构造函数中。 因此,该方法可用于在多个构造函数之间共享代码块。


这是一个简单的演示:

 public class Test { { System.out.println("Initializer block"); } Test() { System.out.println("Constructor 1"); } Test(int i) { System.out.println("Constructor 2"); } public static void main(String[] args) { new Test(); System.out.println("---"); new Test(1); } } 

输出

 Initializer block Constructor 1 --- Initializer block Constructor 2 

例如,在向面板添加JLabel时,您可能会发现这很有用:

 panel.add(new JLabel() {{ setBackground(Color.GREEN); setText("Hello"); }}); 

引擎盖下:

初始化块的字节码按字面复制到每个构造函数中。 (至少由Suns javac和eclipse编译器:

 Test(); Code: 0: aload_0 1: invokespecial 4: getstatic #2; 7: ldc #3; //String "Initializer block" 9: invokevirtual #4; //Method PrintStream.println:(String;)V 12: getstatic #2; 15: ldc #5; 17: invokevirtual #4; 20: return Test(int); Code: 0: aload_0 1: invokespecial #1; 4: getstatic #2; 7: ldc #3; //String "Initializer block" 9: invokevirtual #4; //Method PrintStream.println:(String;)V 12: getstatic #2; 15: ldc #6; 17: invokevirtual #4; 20: return 

这是一个初始化块,它被复制到该类的所有构造函数中。