java - 为什么Java中的对象没有被全局初始化?

标签 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 的私有(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/

相关文章:

java - 从对象 B 调用持有另一个对象 (B) 的对象 (A)

函数原型(prototype)定义中的 Javascript 对象绑定(bind)问题

c++ - 如何隐藏 C++ dll 中的类?

c# - 为了清楚起见,从类继承是否可以接受?

javascript - 将新对象添加到多维数组

java - 计算 Arraylist 中书籍的数量

oop - 是否可以在不首先分配给临时变量的情况下使用从函数返回的对象句柄的属性?

java - 如何仅使用 java 挂载设备?

java - 在android中以编程方式添加到布局中时如何从许多EditText中获取数据

java - 检索添加了用户输入的网站