java - 将 Java 对象实例化为传递的对象引用

标签 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; }
}

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


有人能帮助我了解幕后发生的事情吗?当我们将对象作为函数参数传递时,java到底如何处理内存位置?感谢您的帮助!!

最佳答案

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

关于java - 将 Java 对象实例化为传递的对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57723613/

相关文章:

java - 按名称获取线程

java - 解析 JSON 对象时 Gson 解析错误

java - 为什么静态内部类单例线程安全

java - java中没有分配的字符串连接

c++ - 为什么我的编译器对 c 字符串类型的 vector 有内存问题?

scala - 在 Scala 中,什么时候是使用惰性求值参数而不是使用函数作为参数的好时机?

java - 从相机拍摄照片在 Android 11 中不起作用

tomcat - 如何强制tomcat服务器为不同的虚拟主机使用共享库和资源?

java - 重新排列 ArrayList 的顺序