14

Java 中的引用到底是什么?是内存地址吗?Java 引用是否等同于取消引用的 C++ 指针?

换句话说,给定以下内容:

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

o1 == o2

上述比较是否等同于比较 C++ 中的两个指针?

4

4 回答 4

18

o1 == o2几乎等同于比较 C/C++ 中的两个指针,是的。

但是 Java 中的引用和 C/C++ 中的指针之间有两个非常重要的区别:

  • Java 引用不能做指针运算:你不能给一个引用“加 3”,你只能让它指向另一个(已知的)对象
  • Java 引用是严格类型的:您不能“重新解释”位于引用另一端的内容,除非您将其重新解释为该对象实际是的类型。

还有一个关于“引用”这个词的简短说明:C++ 的引用与 C 中的指针和 Java 中的引用完全不同(但我对 C++ 的了解不够多,无法告诉你细节)。

有关此问题的详细讨论,请参阅有关programmers.SE 的相关问题

于 2012-09-24T12:30:35.717 回答
5

Java 中的引用到底是什么?

它是对象的索引。它可以被认为是一个指针,但不同之处在于它

  • 可以随时更改。
  • 并不总是与内存地址有直接关系。
  • 在 64 位 JVM 中通常是 32 位。
  • 您无法重新解释引用所指的内容。您只能更改引用本身的类型。

上述比较是否等同于比较 C++ 中的两个指针?

是的。


On Compresses Oops 允许 64 位 JVM 起诉 32 位引用。

Java HotSpot™ 虚拟机性能增强 - Compressed Oops

Hotspot JVM 中的压缩 oops

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

于 2012-09-24T12:31:56.527 回答
4

是的,引用基本上与指针相同。顺便说一句,如果你在一个空引用上调用一个方法,你会得到……一个 NullPointerException。

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

于 2012-09-24T12:30:26.447 回答
1

引用是 Java 中指向内存地址的“指针”,尽管 Java 消除了对指针的直接操作,这与 C++ 不同。Java 中的对象永远不会传递给方法或由方法返回,它始终是被传递的引用。

于 2012-09-24T12:32:39.707 回答