什么时候创建实例成员?

Huy*_*han 3 java reference

我有两段来自Java的代码:

class Test1 {
  index = 1;
  int index;
}
Run Code Online (Sandbox Code Playgroud)

class Test2 {
  { index = 1; }
  int index; 
}
Run Code Online (Sandbox Code Playgroud)

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

rai*_*7ow 7

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

并且,与任何其他类方法一样,它可以使用该类中定义的属性; 这个属性的确定位置 - 在此块之上或之前无关紧要.

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

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