何时创建实例成员



我有两段来自Java的代码:

class Test1 {
  index = 1;
  int index;
}

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

第一个在编译时失败了,我想是因为成员"index"在定义之前就被使用了吗?第二个是无错误的。我不明白为什么。你们能抽出点时间来帮我吗?非常感谢!

第二个编译,因为第二个代码中的{…}内部构造是所谓的初始化器块。Java编译器将此块复制到每个构造函数中。

而且,与任何其他类方法一样,它可以使用在该类中定义的属性;这个属性究竟定义在哪里并不重要——在这个块之上或之前。

第一个不编译,因为它根本不符合类主体和成员声明的语言规范,该规范基本上定义了七个允许的东西:

  1. InstanceInitializer(此处使用的构造)
  2. StaticInitializer(类似于第一个,但在类加载时执行)
  3. 施工方声明
  4. 字段声明
  5. MethodDeclaration
  6. ClassDeclaration
  7. 接口声明
class Test2 {
  { index = 1; }
  int index; 
}

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

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

因此,无论instance variable在类中的位置如何,(即在Instance initializer block之前或之后),它仍然可以访问。

请参阅此链接:

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

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

最新更新