我正在尝试做简单的封装程序。消息来源如下。
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的私有变量numberNewClass1中设置,因为我在NewClass1构造函数中调用了setNumberNewClass1。
然后我通过将getNumberNewClass1()方法作为NewClass的构造函数参数创建了另一个对象“new”的“调用”。
现在我的问题是当我在NewClass1中的PrintNumber()方法中通过调用对象调用NewClass的getNumber()方法时,它返回0.但是如果我在其中创建对象 PrintNumber()方法,然后返回发送的值。 PrintNumber()方法在Encap类中调用。
现在我的问题是,如果对象是全局的,那么NewClass的私有变量没有被初始化,但是如果它是在本地创建的那么私有变量正在获得价值,为什么呢?
答案 0 :(得分:2)
问题是初始化的顺序;首先使用numberNewClass1
初始化0
字段,然后构建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".
}
答案 1 :(得分:0)
call
中的实例变量NewClass1
在构造函数执行之前被初始化,因此您在main
方法中传递的值永远不会达到call
{} {1}}