在Java中更改对象的地址(再次传递值?)

changing address of object in Java (pass-by-value again??)

本文关键字:地址 Java 对象      更新时间:2023-10-16

在我发布问题之前,我已经阅读了以下关于java pass-by-value的优秀文章。我确信我已经很清楚了。

  1. 是Java吗;通过引用传递";或";传递值"
  2. http://www.javaworld.com/article/2077424/learn-java/does-java-pass-by-reference-or-pass-by-value.html

我的问题与Java与其他支持pass-by-reference的语言(可能是C++)的比较有关。

Java的情况下,您有一个指向位置a中对象的句柄(引用),因此可以修改对象本身。但不可能更改对象位置本身。I.e存储在内存地址0X945中的对象不能更改为0X948。

C++等语言中,可以选择pass-by-valuepass-by-reference。(它掌握在程序员手中,对吗?)。因此可以改变对象在内存空间中的位置,对吗?

p.S:我有很好的Java背景,但有C++背景。所以我上面的观点可能是错误的。我在上面引用的文章1中声称,Java中没有指针的概念。我不知道这在多大程度上是真的?(为什么NullPointerException存在)

编辑:考虑这个例子:

void swap(Object A,Object B) {
  Object temp=B;
  Object B=A;
  Oject A=temp;
}

当我调用Java中的方法(如swap(A,B))时,不会发生任何事情但在C++中(我猜想),交换是发生的。这可能意味着我正在更改内存中对象的位置,对吗?

在java中,甚至对对象的引用都是通过值传递的,即所有内容都是通过值。接下来,

您可以选择按值传递或按引用传递。(它掌握在程序员手中,对吗?)对的但是你不能用Java来做。

存储在内存地址0X945中的对象不能更改为0X948。在java和C++中都不能做到这一点。

当您尝试访问某个不存在的属性/方法(即null)时,会抛出NullPointerException。即当需要对象的实例时参考指向null

 Object o = null;
 o.toString()  --> NPE. o points to null.

所以在C++中,通过引用传递意味着传递对象本身,这样它就可以在交换方法中重新分配

在C++中,按引用传递,swap(Object &A, Object &B)似乎接近java的按值传递。

在Java中,Object A是对对象的引用,默认情况下为null。由于Object已经是一个引用,因此当复制此引用时,它是按值传递的。

在C++中,Object A是Object的一个实例,并且始终是唯一的对象。由于Object是一个实例,您使用Object&通过引用传递,因为Object不是传递的,而是对它的引用。

Java总是按值传递,只是在传递对象时,传递的值是内存中的位置,所以它可以像按引用传递一样。

当我调用Java中的方法(如swap(A,B))时,除了在C++中(我猜想),交换是发生的。

不,没有。"Nothing"也发生在C++中。

代码到C++的正确翻译是:

void swap(Object *A,Object *B) {
  Object *temp=B;
  B=A;
  A=temp;
}

(是的,不同语言的类型语法不同。也就是说,指向-Foo类型的指针在C++中写为Foo *,在Java中写为Foo;这只是不同语言之间的语法差异。)