首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中更改对象的地址(再次按值传递?)

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

Stack Overflow用户
提问于 2014-09-17 13:58:50
回答 4查看 1.9K关注 0票数 2

在发布我的问题之前,我阅读了以下关于java传递值的优秀文章。我相信我对此有很好的理解。

  1. Is Java "pass-by-reference" or "pass-by-value"?
  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中的对象,因此可以修改对象本身。但是不可能改变对象的位置本身。即存储在内存地址0X945中的对象不能更改为0X948。

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

P.S:我对Java有很好的背景,但对C++有很好的了解。所以我以上的观点可能是错误的。在第1篇文章中,我提到了在Java中没有指针的概念。我不知道那到底是真的吗?(为什么NullPointerException会存在?)

编辑:考虑以下示例:

代码语言:javascript
复制
void swap(Object A,Object B) {
  Object temp=B;
  Object B=A;
  Oject A=temp;
}

当我在Java (如swap(A,B) )中调用该方法时,除了C++ (我猜想),什么都不会发生,交换就会发生。这可能意味着我正在改变内存中对象的位置,对吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-17 14:04:12

在java中,对对象的引用是通过值传递的。也就是说,每件事都是按价值传递的。下一首,

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

存储在内存地址0X945中的对象不能更改为0X948。--您不能同时使用java和C++。

当您试图访问不存在的东西的属性/方法(is NullPointerException )时,会引发NullPointerException。也就是说,当需要对象的实例时,引用指向null

代码语言:javascript
复制
 Object o = null;
 o.toString()  --> NPE. o points to null.
票数 2
EN

Stack Overflow用户

发布于 2014-09-17 15:20:04

因此,在C++中,按引用传递意味着传递对象本身,以便可以在交换方法中重新分配对象。

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-09-17 14:03:57

Java总是通过值传递的,只是当您传递对象时,传递的值是内存中的位置,因此它可以像通过引用传递一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25892659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档