Java实例变量用方法初始化

时间:2015-11-12 10:16:03

标签: java compilation initialization instance-variables

我对下面这段代码感到有点困惑:

self.label.text = self.detailText;

此处的输出为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); } } ,但我认为这必须是编译器错误,因为当涉及方法0 29时,变量h应该尚未初始化。那么,编译是从上到下进行的吗?这为什么有效?为什么值giveH() 0而不是29?

6 个答案:

答案 0 :(得分:21)

int的默认值为0(请参阅here)。因为您在x之前初始化hgiveH将返回int的默认值(例如0)。

如果您按此顺序切换

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

输出将是

29 29

答案 1 :(得分:4)

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

这是一种思考它的方法:编译器会记录在范围内的某处查找名为giveH的方法,并且只有在它离开范围并且找不到它时才会出错。一旦它到达giveH声明,那么说明就解决了,每个人都很高兴。

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

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

您还可以查看Field InitializationForward References During Field Initialization上的Java语言规范部分。

答案 2 :(得分:3)

@Maloubobola has provided the correct answer, but since you don't seem to fully understand yet, let me try to elaborate.

When Test is created, it runs the variable initialization (x = giveH(), h= 29) once. Your misunderstanding may be that variable x is always determined by giveH(), whereas it only determines it's value when x is initialized.

That's why the order of the statements is crucial here; x is initialized before h, and therefore h is 0 when giveH() is called at x's initialization.

答案 3 :(得分:2)

在字段初始值设定项中使用方法是不好的做法。你可以通过制作h final来解决这个问题。然后它将在加载类时初始化。

ctypes

答案 4 :(得分:1)

If we do not initialize the value for non static variables like x in this program JVM will provide default value zero for class level non static variables.

答案 5 :(得分:0)

声明后,所有数组元素都会存储其默认值。 存储对象的数组中的元素默认为null。 存储基本数据类型的数组元素存储: 0表示整数类型(byte,short,int,long); 0.0表示十进制类型(float和double); 布尔值为false; \ u0000用于char数据。

Actauls值只有在我们初始化它们时才会出现