Java独立代码块

标签 java programming-languages

<分区>

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

public class Foo{

 private int someVariable;

 {
    doSomething();
 }

 public Foo(){
 }

 private void doSomething(){
    // Something is done here
 }

}

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

最佳答案

这是一个(非静态)初始化 block 。官方教程中有记载here :

Initializing Instance Members

Normally, you would put code to initialize an instance variable in a constructor. There are two alternatives to using a constructor to initialize instance variables: initializer blocks and final methods. Initializer blocks for instance variables look just like static initializer blocks, but without the static keyword:

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

The Java compiler copies initializer blocks into every constructor. Therefore, this approach can be used to share a block of code between multiple constructors.


这是一个简单的演示:

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

引擎盖下:

初始化 block 的字节码被逐字复制到每个构造函数中。 (至少 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

关于Java独立代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4249795/

相关文章:

java - 在java中将java.util.HashMap转换为scala.collection.immutable.Map

java - 除了 Java 之外,还有其他语言可以在移动设备上无处不在吗?

sql-server - 错误处理的基本原理?

programming-languages - 您可以使用哪些语言即时动态重写函数?

java - ServletContext - 应用程序范围的 session 对象返回 null

java - 通过创建对象为其他类的数组赋值

java - antlr4编译错误: Serialized ATN data element out of range

java - 如何使用Java从dynamodb读取表?

programming-languages - 不同语言的静态

programming-languages - 帮助识别编程/脚本语言