在Java中,什么是引用?

14

在Java中,引用指的是什么?它是一个内存地址吗?Java引用是否等同于C++指针的取消引用?

换句话说,考虑以下内容:

Object o1 = new Object();
Object o2 = new Object();

o1 == o2

这个比较是否等同于在C++中比较两个指针?

4个回答

18

o1 == o2 在Java中基本等同于在C/C++中比较两个指针。

但是,在Java中,引用和在C/C++中的指针有两个主要的区别,这些区别非常重要:

  • Java引用不能进行指针运算:你不能 "加3" 到一个引用上,你只能让它指向另一个(已知的)对象
  • Java引用是强类型的:除非将其重新解释为该对象实际属于的类型,否则无法重新解释引用另一端的内容。

还有一个关于"引用"这个词的简短说明:C++拥有引用,它们的行为与C中的指针和Java中的引用都有很大不同(但我对C++的了解不足以告诉你具体细节)。

有关此问题的全面讨论,请参见程序员SE上的此相关问题


关于未来10年的新功能的提醒:作为引入值对象到Java的一部分,在Valhalla项目中,==将通过比较所有相关字段来比较用户定义的值对象。因此,==将不再仅仅是指针比较。 - undefined
1
@Lii: 是的,这个答案最终需要更新,但我宁愿不要在瓦尔哈拉/JEP 401成为常规GA版本的预览功能之前,将这个非常基础的问题与之混淆(在此之前,我们不知道它的样子,甚至不知道它是否会发布)。 - undefined

5
Java中的引用是什么?
它是一个对象的索引。可以将其视为指针,但它与指针不同之处在于:
- 引用可以随时更改。 - 引用并不总是直接关联内存地址。 - 在64位JVM中通常是32位。 - 你不能重新解释引用所指的内容。你只能改变引用本身的类型。
上述比较是否相当于比较C++中的两个指针?
是的。

关于压缩指针,允许64位JVM使用32位引用。

Java HotSpot™虚拟机性能增强-压缩指针

Hotspot JVM中的压缩指针

IBM V6-使用压缩引用更有效地使用堆


我已经添加了一些关于压缩OOP或引用的链接。 - Peter Lawrey

4

是的,引用基本上就是指针。顺便说一下,如果在空引用上调用一个方法,你会得到......一个NullPointerException。

需要注意的是,它不必是内存地址。在程序执行期间,给定对象可以存储在其他地方,仍然保持相同的引用。但是你不需要关心,因为在Java中不存在指针算术。


1
引用是Java中指向内存地址的“指针”,尽管Java不像C++那样直接操作指针。在Java中,对象永远不会被传递给方法或由方法返回,而是传递引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接