我很难理解在声明实例变量时如何初始化它。请考虑以下代码段:
class Rat {
private int val = 20;
}
class Cat {
private Rat rat = new Rat();
}
我无法理解我们如何在类中声明它们时初始化实例变量;不是这些变量应该得到他们的价值"或"参考"当我们实际创建一个对象时,例如在main中我们做:
main() {
Cat cat = new Cat();
}
这样每个对象都有自己的"拥有"实例变量集;例如,要初始化Cat的Rat实例变量,我们应该这样做:
cat.Rat = new Rat();
任何人都可以帮助我理解这一点。
答案 0 :(得分:2)
我无法理解我们如何在类
中声明它们时初始化实例变量
创建实例时初始化实例变量。每次创建Cat
的实例时,都会执行private Rat rat = new Rat();
。每次创建Rat
的实例时,都会执行private int val = 20;
(在执行超类构造函数之后,在执行当前类的构造函数体之前)。
当
Cat cat = new Cat();
执行,在Cat
构造函数的主体执行之前,Cat
的实例变量被初始化,所以
private Rat rat = new Rat();
已执行。现在,在Rat
构造函数的主体执行之前,Rat
的实例变量已初始化,因此
private int val = 20;
已执行。
答案 1 :(得分:1)
根据JVM的https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.5中的定义,字段在创建类的新实例的步骤4中初始化。 所以在执行构造函数的主体之前。
将构造函数的参数分配给此构造函数调用的新创建的参数变量。
如果此构造函数以同一个类中的另一个构造函数的显式构造函数调用(第8.8.7.1节)开头(使用此),则 评估参数并处理构造函数调用 递归地使用这五个相同的步骤。如果那个构造函数 调用突然完成,然后此过程突然完成 出于同样的原因;否则,继续步骤5.
此构造函数不以同一类中另一个构造函数的显式构造函数调用开头(使用此方法)。如果 这个构造函数用于Object以外的类,然后是这个 构造函数将以a的显式或隐式调用开始 超类构造函数(使用超级)。评估参数和 使用这些来递归地处理超类构造函数调用 同样的五个步骤。如果该构造函数调用突然完成, 然后由于同样的原因,这个程序突然完成。除此以外, 继续第4步。
为此类执行实例初始值设定项和实例变量初始值设定项,并指定实例变量的值 初始化器到相应的实例变量中 从左到右的顺序,它们在源代码中以文本形式出现 为了上课。如果执行任何这些初始化程序导致 异常,然后没有处理进一步的初始化程序 程序突然完成同样的异常。除此以外, 继续第5步。
- 醇>
执行此构造函数的其余部分。如果该执行突然完成,则此过程突然完成 同样的道理。否则,此过程正常完成。
答案 2 :(得分:1)
从以下代码段中
main() {
Cat cat = new Cat();
}
很明显,我们正在尝试创建一个对象' Cat。 因此,当我们调用它时,将加载Cat类(如果它尚未加载)。在加载类时,它将初始化实例变量。
在下面的场景中,
class Cat {
private Rat rat = new Rat();
}
由于Cat类有一个实例变量,它依赖于另一个名为Rat的类,因此会加载Rat类,在此过程中,Rat中的实例变量将被初始化。
class Rat {
private int val = 20;
}
因此,首先会初始化上面的代码段,然后完成此作业private Rat rat = new Rat();
,最后创建Cat对象(Cat cat = new Cat();
)并将其分配给cat
参考变量。
答案 3 :(得分:0)
class Rat {
private int val = 20;
}
在创建Rat的实例之前,变量val不会保持值' 20'。因此,为了让JVM将值20分配给val,您需要使用' new'创建Rat实例。操作
Similarly,
class Cat {
private Rat rat = new Rat();
}
除非您使用' new'创建Cat的实例。操作员,变量大鼠不会被新的Rat()'实例
类似于Cat实例和初始化
最后, 静态变量在类加载时初始化,并且在类加载器生效之前可用 实例变量在Class实例化时根据其范围进行初始化,即全局变量或局部变量。
请阅读有关范围的更多信息。