Java中的参考究竟是什么?

时间:2012-09-24 12:27:30

标签: java reference

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

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

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

o1 == o2

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

4 个答案:

答案 0 :(得分:17)

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

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

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

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

有关此问题的详尽讨论,请参阅this related question on programmers.SE

答案 1 :(得分:5)

  

Java的参考究竟是什么?

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

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

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


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

Java HotSpot™ Virtual Machine Performance Enhancements - Compressed Oops

Compressed oops in the Hotspot JVM

IBM V6 - More effective heap usage using compressed references

答案 2 :(得分:4)

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

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

答案 3 :(得分:1)

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