我正在尝试做简单的封装程序。来源如下。
package encap;
public class Encap
{
public static void main(String[] args)
{
NewClass1 call = new NewClass1(3);
call.PrintNumber();
}
}
package encap;
public class NewClass1
{
private int numberNewClass1;
NewClass call = new NewClass(getNumberNewClass1());
public NewClass1(int number)
{
setNumberNewClass1(number);
}
public void PrintNumber()
{
// NewClass call = new NewClass(getNumberNewClass1());
System.out.println("NewClass1");
System.out.println(getNumberNewClass1());
System.out.println("NewClass");
System.out.println(call.getNumber());
}
public int getNumberNewClass1()
{
return numberNewClass1;
}
public void setNumberNewClass1(int numberNewClass1)
{
this.numberNewClass1 = numberNewClass1;
}
}
package encap;
public class NewClass
{
private int number;
public NewClass(int number)
{
setNumber(number);
}
public int getNumber()
{
return number;
}
public void setNumber(int number)
{
this.number = number;
}
}
在创建 Newclass1 的对象期间,我给出值 3,据我所知,该值应该设置在 Newclass1 的私有(private)变量 numberNewClass1 处,因为我在 NewClass1 构造函数中调用了 setNumberNewClass1。
然后,我通过将 getNumberNewClass1() 方法作为 NewClass 的构造函数参数,在全局范围内创建了“NewClass”的另一个对象“call”。
现在我的问题是,当我通过 NewClass1 中的 PrintNumber() 方法中的调用对象来调用 NewClass 的 getNumber() 方法时,它会返回 0。但是如果我在其中创建对象 PrintNumber() 方法,然后它返回发送的值。类 Encap 中调用了 PrintNumber() 方法。
现在我的问题是,如果对象是全局创建的,那么 NewClass 的私有(private)变量不会被初始化,但如果它是本地创建的,那么私有(private)变量就会获取值,为什么?
最佳答案
问题在于初始化的顺序;首先使用 0
初始化 numberNewClass1
字段,然后构造 call
(使用 0
) – 这里
private int numberNewClass1;
NewClass call = new NewClass(getNumberNewClass1()); //<-- currently 0.
您可以将 call
的初始化移至 NewClass1
的构造函数中,这将解决您的问题。比如,
private int numberNewClass1;
private NewClass call;
public NewClass1(int number)
{
setNumberNewClass1(number);
call = new NewClass(number); //<-- now it is safe to call
// getNumberNewClass1(), but
// we know it is "number".
}
关于java - 为什么Java中的对象没有被全局初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36052738/