将Java对象实例化为传递的对象参考

时间:2019-08-30 08:58:47

标签: java memory call-by-value

这是我用来了解java如何处理对象内存的测试代码。

public class TestCode {

  public static void main(String[] args) {
    TestCode obj = new TestCode();

    CustomClass cs1 = new CustomClass(5);
    obj.updateExistingObj(cs1);
    System.out.println(cs1.val);

    CustomClass cs2 = new CustomClass(5);
    obj.instantiateExistingObj(cs2);
    System.out.println(cs2.val);

    CustomClass cs3 = null;
    obj.updateNullObj(cs3);
    System.out.println(cs3.val);
  }

  void updateExistingObj(CustomClass cs1) {
    cs1.val = 9;
  }

  void instantiateExistingObj(CustomClass cs2) {
    cs2 = new CustomClass(9);
  }

  void updateNullObj(CustomClass cs3) {
    cs3 = new CustomClass(9);
  }
}

class CustomClass {
  int val;
  CustomClass next;
  CustomClass(int x) { val = x; }
}

我正在打印cs1.val的第一个syso的输出,我得到的期望值为9。
我正在打印cs2.val的第二个syso的输出是5,而不是9。
我正在打印cs3.val的第三个系统的输出,我得到的是null pointer exception


有人可以帮助我了解幕后的情况吗?当我们将对象作为函数参数传递时,java如何精确地处理内存位置?感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

cs2cs3是局部变量,为它们分配新值在声明它们的方法之外无效。

相关问题