3

我有 2 段来自 Java 的代码:

class Test1 {
  index = 1;
  int index;
}

相对

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

第一个编译失败,我猜是因为在定义之前使用了成员“索引”?第二个是没有错误的。我不明白为什么。你们能抽出几分钟来帮助我吗?非常感谢!

4

3 回答 3

7

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

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

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

  1. InstanceInitializer(这里使用的构造)
  2. StaticInitializer(类似于第一个,但在类加载时执行)
  3. 构造函数声明
  4. 字段声明
  5. 方法声明
  6. 类声明
  7. 接口声明
于 2012-09-12T16:43:42.877 回答
2
class Test2 {
  { index = 1; }
  int index; 
}

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

Java Compiler会将这段代码复制到 each constructor中,方便每个构造函数共享这段代码......

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

请参阅此链接:

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

于 2012-09-12T17:54:44.847 回答
1

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

于 2012-09-12T17:06:23.087 回答