使用方法初始化 Java 实例变量

我对以下代码段有点困惑:

public class Test{

  int x = giveH();
  int h = 29;

  public int giveH(){
     return h;
  }

  public static void main(String args[])
  {
      Test t = new Test();
      System.out.print(t.x + " ");
      System.out.print(t.h);          
  }
}

这里的输出是,但我认为这必须是编译器错误,因为当涉及到方法时,变量h应该尚未初始化。那么,编译是否从上到下通过行?为什么这样行得通?为什么值是 0 而不是 29?0 29giveH()x


答案 1

的默认值为(请参阅此处)。因为在 之前初始化,所以将返回 int 的默认值(例如 0)。int0xhgiveH

如果您像这样切换订单

int h = 29;
int x = giveH();

输出将为

29 29

答案 2

Java 中的编译不需要在使用方法之前声明该方法。Java 教程详细介绍了初始化。

这里有一种思考方式:编译器会做一个注释,在作用域中的某个地方查找名为 giveH 的方法,只有当它离开作用域并且找不到它时,它才会出错。一旦它到达了 giveH 声明,那么笔记就解决了,每个人都很高兴。

此外,Java 中实例变量的变量初始化将移动到构造函数的开头。您可以考虑将上面的行分成两部分,上面是 x 和 h 的声明,以及构造函数内部的赋值。

在这种情况下,声明的顺序确实很重要。初始化变量 x 时,h 的默认值为 0,因此 giveH() 将返回该默认值。之后,变量 h 被赋予值 29。

您还可以查看有关字段初始化和字段初始化期间的正向引用的 Java 语言规范部分。