在Java中更改对象的地址(再次传递值?)
changing address of object in Java (pass-by-value again??)
在我发布问题之前,我已经阅读了以下关于java pass-by-value的优秀文章。我确信我已经很清楚了。
- 是Java吗;通过引用传递";或";传递值"
- 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-value
或pass-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
;这只是不同语言之间的语法差异。)
- 将数组的地址分配给变量并删除
- 空基优化子对象的地址
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 如何在c++程序中找到函数的地址
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 被解释为低级别const的const对象的地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 内联程序集printf将整数解释为地址
- 在java中解决这段代码时面临循环中的问题
- 为什么指针不写入类的地址?
- 如何在C++中获取该对象的类声明中对象的地址?
- 通过按地址访问变量
- 尝试用java代码编译和运行c++代码
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 在 C/C++ 中获取 Java 对象的内存地址
- 如何使用本机代码以编程方式查找Java本地变量的内存地址
- 是任何编程语言(C++、C#、Java、C.)中声明函数的最终内存地址,无论是相对地址还是绝对地址
- 在Java中更改对象的地址(再次传递值?)