【问题标题】:Java Class Object Dynamic Memory AllocationJava 类对象动态内存分配
【发布时间】:2017-02-21 11:48:36
【问题描述】:

嘿,伙计们,我是 java 编程的新手。我尝试使用 java 类进行实验,我所做的是我创建了一个实例变量 x,然后创建了 y,它复制了 x 的值。 然后我定义了一个构造函数,它将值或 x 作为参数。 现在,当我尝试打印 y 的值时,它的值为 0,而 x 的值为 5。 为什么会出现问题? 当我们使用 new 关键字和构造函数时,只会创建所有实例字段,所以我觉得在我们使用之后

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package test;
/**
 *
 * @author Mridul
 */
public class Test {
int x;
int y=x;
Test(int a)
{
    x=a;

}
void print()
{
    System.out.println(x); 
}
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Test ob=new Test(5);
        ob.print();
        System.out.println(ob.y);


        // TODO code application logic here
    }

}

Output
5
0

当我们使用 new 关键字和构造函数时,只会创建所有实例字段,所以我觉得在我们使用之后

Test ob=new Test(5); 

那么只有类(x,y=x) 中的所有代码应该运行并且它不应该产生问题。 请帮忙

【问题讨论】:

  • 对于int x=a 是一种copy,对a 的任何更改都不会在= 之后反映到x(和@987654329 @ 相当于int x = 0)
  • 但在输出中它给出 x=5 和 y=0
  • ... 因为实例字段初始化运行 before 构造函数语句。
  • 但我使用的是构造函数和 new 关键字。

标签: java oop object constructor


【解决方案1】:

当您创建Test 的新实例时,会发生这种情况(按顺序):

int x; // x = 0
int y=x; // y = 0
Test(int a)
{
    x=a; // x = your a value
}

=> 社区维基,请随意......

【讨论】:

    【解决方案2】:

    这里是:

    int y=x;
    

    发生一次你的构造函数被执行之前。

    因此 ctor 改变了 x 的值;但 y 保持其先前的值。 (x 最初获取默认值 0;然后进入 y;然后执行 ctor 并将 x 更改为 a 的值)。

    请注意:这与“动态分配”无关。 new 导致三件事:

    • 内存已分配
    • 新对象的字段被初始化
    • 调用指定的构造函数

    (有关详细信息,请参阅here)。如果您希望 y 具有与 x 相同的值;做吧

    公开课测试 最终整数 x, y;

    Test(int incoming) {
      x = incoming;
      y = incoming;
    }
    

    【讨论】:

      【解决方案3】:

      new operator 用于自动分配内存,要为对象分配所需的内存,必须使用new operator

      【讨论】:

        【解决方案4】:

        当您使用new 调用构造函数时,Java 开始构造新分配的对象。实例字段的值(在您的情况下为字段x 和字段y)由一组规则确定。

        • 首先,初始化实例字段。 x 具有默认值(0); y 获取x 的值,即0
        • 然后,在构造函数中,将x 设置为a 的值。

        y 仍然是0,因为它的值之前 x 被设置为a 的值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-04
          • 1970-01-01
          • 2021-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-05
          • 1970-01-01
          相关资源
          最近更新 更多