为什么没有在Java中全局初始化对象?

时间:2016-03-17 06:00:24

标签: java oop object

我正在尝试做简单的封装程序。消息来源如下。

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的私有变量没有被初始化,但是如果它是在本地创建的那么私有变量正在获得价值,为什么呢?

2 个答案:

答案 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}}