Java中的参考究竟是什么?

Java中的参考究竟是什么? 它是一个内存地址吗? Java引用是否相当于解除引用的C ++指针?

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

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

上面的比较是否相当于比较C ++中的两个指针?

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

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

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

还有关于“引用”一词的简短说明:C ++的引用与C中的指针和Java中的引用完全不同(但我不太了解C ++告诉你具体细节)。

有关此问题的详尽讨论,请参阅有关程序员的相关问题 。

Java中的参考究竟是什么?

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

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

上面的比较是否相当于比较C ++中的两个指针?

是。


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

Java HotSpot™虚拟机性能增强 – 压缩的糟糕

Hotspot JVM中的压缩oops

IBM V6 – 使用压缩引用实现更高效的堆使用

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

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

引用是Java中内存地址的“指针”,即使Java与C ++不同,也会主动直接操作指针。 Java中的对象永远不会传递给方法或由方法返回,它始终是传递的引用。