在java类中,括号中的代码如何/何时执行?

时间:2011-10-21 14:19:04

标签: java class

所以我在看这个问题here。人们建议你可以把代码放在像这样的java类中

class myClass
{
  int a;

  {
    //insert code here dealing with a
  }
}

括号中的代码如何执行以及何时执行?我可以放在那里或者它只是保留用于变量初始化吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

class X

    Foo x = something;  // a variable initializer

    // an instance initializer
    { 
        statement1 
    }

    ...

    X()
    {
        statement2
    }

构造函数被翻译为

    X()
    {
        super();

        // instance initializers and variable initializers
        // in their textual order
        x = something;
        statement1    
        ...

        // the original constructor body
        statement2
    }

答案 1 :(得分:3)

这是一个实例初始化块。我建议reading this article。在执行当前类中的任何构造函数之前以及在所有超类构造函数完成之后调用它。

答案 2 :(得分:2)

您可以编写一个简单的测试来检查不同块的执行顺序:

class MyClass {
        MyClass() {
                System.out.println("construtor");
        }

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

        {
                System.out.println("initialization block");
        }
}

结果:

static block
initialization block
construtor

答案 3 :(得分:1)

每个实例执行此代码块,即它可以访问实例方法,字段等。

它在该类的构造函数层次结构执行之后但在该类的构造函数之前执行。

因此,您必须小心您在那里访问的数据。

示例:

class Foo {
  protected String name;

  {
    System.out.println("Foo's name: " + name);  
  } 

  public Foo(String n) {
    name = n; 
    System.out.println("constructing Foo");
  }
}

class Bar extends Foo {
  {
    System.out.println("Bar's name: " + name); 
  }

  public Bar(String n) {
    super(n); 
    System.out.println("constructing Bar");
  }
}

如果您现在使用Bar创建新的new Bar("baz");实例,您会看到此输出:

Foo's name: null
constructing Foo
Bar's name: baz
constructing Bar

如您所见,执行顺序为:

  1. Foo初始化程序块
  2. Foo构造函数
  3. Bar初始化程序块
  4. Bar构造函数