什么时候创建实例成员?

时间:2012-09-12 16:37:11

标签: java reference

我有两段来自Java的代码:

class Test1 {
  index = 1;
  int index;
}

class Test2 {
  { index = 1; }
  int index; 
}

第一个在编译时失败了,我猜是因为成员“index”在定义之前使用了?第二个是没有错误的。我不明白为什么。你们能节省一些时间来帮助我吗?非常感谢!

3 个答案:

答案 0 :(得分:7)

第二个编译,因为第二个代码中存在的{...}内部构造是所谓的initializer block。 Java编译器将此块复制到每个构造函数中。

并且,与任何其他类方法一样,它可以使用该类中定义的属性;无论在何处定义此属性 - 无论在此块之上还是之前,都无关紧要。

第一个没有编译,因为它根本不适合类language specification的类主体和成员声明,​​它基本上定义了七个允许的东西:

  1. InstanceInitializer(此处使用的构造)
  2. StaticInitializer(类似于第一个,但在类加载时执行)
  3. ConstructorDeclaration
  4. FieldDeclaration
  5. MethodDeclaration
  6. ClassDeclaration
  7. InterfaceDeclaration

答案 1 :(得分:2)

class Test2 {
  { index = 1; }
  int index; 
}

在上面的代码中,{ index = 1; }被称为Instance initializer block,用于初始化类的实例变量 {{1对于类的静态变量

static initializer block将此块复制到每个 Java Compiler中,使每个构造函数都可以轻松共享此代码块......

所以无论constructorinstance variable的位置如何(即Instance initializer block之前或之后),都​​可以访问它。

请参阅此链接:

http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

答案 2 :(得分:1)

test2是编译因为使用了Initiallizer,它是编译的,因为在调用任何构造函数之前调用了initiallizer。