Java中指针和引用变量之间有什么区别?

时间:2011-09-15 19:43:45

标签: java

我的Java书解释说,要使用对象,我们可以将它们分配给引用变量。这与指向对象的指针有什么不同? Java有指针吗?

谢谢:)

9 个答案:

答案 0 :(得分:15)

引用有点像你不能算术的指针......尽管它更不透明。虽然底层位可能是虚拟内存中的地址,但它们不一定是。它们只是获取对象(或表示空值)的一种方式。因此,虽然它们并不完全相同,但如果您习惯将指针视为“识别对象或导航到它的方式”(在某种意义上),那么是的,这些想法也适用于引用。

Java没有这样的指针(不像C#,它有引用指针 - 后者用于“不安全”代码)。

答案 1 :(得分:11)

术语“参考”和“指针”基本相同。我见过的关于Java基础知识的大部分文献都声称Java没有指针。但是,如果您尝试使用null引用,则会获得NullPointerException。所以它都是语义。

(真正的不同之处在于,在C或C ++中,术语“指针”严格意味着一个恰好是某些数据的内存地址的整数。而在Java中,术语“引用”更接近于C ++“引用”概念即使你想这样做,你也无法直接使用内存地址,但是你以同样的方式使用它。)

答案 2 :(得分:3)

Cat x = new Cat();

此行在内存中创建一个Cat对象,并在x中存储对它的引用。

x现在包含对Cat对象的引用,但是如果你要这样做:

x = x + 1;

这不会像C中那样提供下一个内存地址,但会产生编译错误。 Java不允许控制参考或内存位置。

答案 3 :(得分:2)

不,Java没有指针。 Java中的基本概念是“值”与“引用”。

答案 4 :(得分:2)

引用是一个指针,您通常无法看到(即内存地址)。允许的唯一操作是设置它(从另一个引用)并通过它引用到引用的对象。它可以从引用值表达式(如 new 运算符)或另一个引用(在语法上是一个简单的引用值表达式)中设置。

答案 5 :(得分:1)

如果我们将引用或指针视为一种访问或处理内存中对象的方法,它们就大致相同。但是,它们在实施方面有所不同。以下是差异:

  1. 指针支持指针运算,这使它们成为一种不安全的方法。因为它们为程序员提供了远远超过需要的访问级别。但是,引用通过更抽象的隐藏实现提供了对象的句柄。

  2. 指针的类型不太强,而且引用的类型更强。我的意思是代码在引用的情况下非常简单,在指针的情况下稍微不那么正式。你需要使用reinterpret_cast类的东西来使用指针强制转换,另一方面,引用支持“C”中那种原始类型的强制转换。

  3. 指针不安全,引用是安全的。如果您在两个选择引用之间有选项。在像C#这样的语言中,你有这种自由。

  4. 指针存在于C / C ++中,引用存在于Java中。不要将C / C ++中的引用与Java中的引用混淆。 C / C ++中的引用是一种用于C / C ++中指针右值的同义词。

答案 6 :(得分:0)

就Java语法而言-的确,Java没有指针,但是为了弄清楚情况- Java运行时 有指针。 每次发生 GC 时,很有可能存储在 heap 中的对象会物理更改其内存地址。这只能通过使用真正称为 Pointer 的指针来实现。您来自C++世界-您知道引用限制。但这并不意味着JVM不使用引用=)。

有关更多信息,请查看Ordinary Object Pointer

因此,当您对核心JVM内存管理有一个简短的了解时,可以在运行时将 Java参考术语视为 Pointer

否,根本没有通过引用。仅按值传递,因为真正的Java方法参数是 Java参考的副本,因此-另一个 Pointer

因此,以语法使用方式- Java参考更接近 C ++参考,但在实际的运行时世界中,它更接近指针。 / p>

P.s。为了获得更多说明,最好阅读更多有关普通对象指针的文章,或者在 oop.hpp 中抢劫。

答案 7 :(得分:0)

由于Java不支持指针。引用似乎是一种特殊的指针。但是我们必须注意关键的区别:使用指针,我们可以指向任何地址(实际上是内存中的数字插槽)。因此,很可能使用指针也可以指向无效地址,然后在运行时可能会遇到意外问题。但是引用类型将始终 指向有效地址,否则它们将指向null。

答案 8 :(得分:-2)

指针只包含地址,但如果我们坦率地说,参考不包含地址 对象的地址被分配给索引,或者我们说如果我们将看到引用变量的内容,它以类名@ @开头并且在它之后是一些十六进制代码,则可以将哈希代码和案例代码赋予引用变量。这些nos不是地址,它是索引值或哈希码。

第二点 我们不能对参考值的内容

的值执行任何算术运算