当前位置: 首页 > 面试题库 >

Java独立代码块

詹斌蔚
2023-03-14
问题内容

我从事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/


问题答案:

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

初始化实例成员

通常,您需要将代码放在构造函数中以初始化实例变量。使用构造函数初始化实例变量有两种选择:初始化块和final方法。实例变量的初始化块看起来像静态初始化块,但没有static关键字:

{
    // 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


 类似资料:
  • 为应用程序定义的范围是:API权限 我正在使用客户端凭据流生成令牌: 下面是我发布的获取访问令牌的请求。

  • 问题内容: 在我的字节码检测项目中,我经常迷失在VerifyErrors上。但是,默认的Java Verifier很少提供有关导致错误的指令的信息(它仅提供方法和一条小消息)。是否有任何独立的字节码验证程序在定位错误(至少是精确的指令位置)方面提供了更高级的帮助?谢谢。 问题答案: 与任何涉及JVM字节码的项目一样,我将首先检查BCEL是否具有对您有用的任何东西。另外,也许FindBugs可能会有

  • 问题内容: 我有一些通过 Runtime.getRuntime.exec(String) 运行命令的代码,它可以在Windows上运行。当我将代码移至Linux时,它崩溃了,并且解决该问题的唯一方法是切换到 exec(String []) 版本。如果我这样处理,代码在Windows和Linux上是否可以相同,还是应该在Windows上使用exec(String)而在Linux上使用exec(Str

  • 问题内容: 我对了解Java的高质量独立源代码格式器的可用选择感兴趣。 该格式必须是独立的,也就是说,它必须支持“批量”模式是从任何特定的开发环境脱钩。理想情况下,它也应独立于任何特定的操作系统。因此,这里对IDE du jour的内置格式化程序没有什么兴趣(除非IDE支持批处理模式格式化程序调用,也许是从命令行启动)。用封闭源C / C ++编写的仅在Windows上运行的格式化程序不是理想的,

  • 创建验证 任何时候,都可以直接使用think\Validate类而不需要定义验证器类进行独立的验证操作,例如: $validate = Validate::make([ 'name' => 'require|max:25', 'email' => 'email' ]); $data = [ 'name' => 'thinkphp', 'email' => 't

  • 用数组和for循环 有溪流 一般来说,我知道ArrayList有开销,这可能导致数组的最小大小在看到增益之前。此外,如果有更好的方法来执行流操作或迭代。不确定forEach在这种情况下是否有效,因为它是一个终端操作,我需要按照array/arrayList的原始顺序捕获结果。