引用和指针之间的区别

时间:2013-12-23 01:38:17

标签: java pointers reference parameter-passing pass-by-reference

我已经阅读了很多关于Java中不存在“pass-by-reference”的文章,因为引用的值的副本被传递,因此“传递引用副本”值”。

文章还说参考值是一个指针。 (所以指针确实存在于Java中。)

其他一些文章说:Java没有指针。

那么正确的解决方案是什么?

指针与引用(或引用值)有何不同,它们是否存在于Java中?

5 个答案:

答案 0 :(得分:4)

他们不像C指针。没有指针算术允许。

Java只有一种传递参数的机制:在所有情况下都按值传递。对于基元,值将被传递。对于对象,将传递对堆上对象的引用。

答案 1 :(得分:0)

两个都说得对:) Java没有指针,因为java已将指针简化为引用。

Object o=new Object();

我们在这里有一个对象; o实际上是一个指针。

基本上,指针和引用是一回事;他们指向(指)记忆中的其他东西。但是,您不能对引用执行整数运算。您可能会发现此幻灯片上的某些页面很有用: http://www.cis.upenn.edu/~matuszek/cit594-2005/Lectures/15-pointers-and-references.ppt

答案 2 :(得分:0)

指针是引用类型;它指的是某种东西。你基本上要问的是:“Java是否有杜宾犬?因为有些文章说它有狗。”

Wikipedia entry for Pointer中所述:

  

指针是更抽象的引用数据类型的简单,更具体的实现。有几种语言支持某种类型的指针,尽管有些语言对其使用的限制比其他语言更多

接下来会谈到Java specifically

  

与C,C ++或Pascal不同,Java中没有指针的明确表示。相反,使用引用实现更复杂的数据结构,如对象和数组。该语言不提供任何显式指针操作操作符。代码仍然可能尝试取消引用空引用(空指针),但这会导致抛出运行时异常。未引用的内存对象占用的空间在运行时通过垃圾回收自动恢复。

查找Reference,您会发现:

  

在计算机科学中,引用是一种值,它使程序能够间接访问计算机内存或某些其他存储设备中的特定数据,例如变量或记录。据说该引用是指数据,并且访问该数据称为取消引用该引用。   

  引用不同于数据本身。通常,引用是数据存储在存储器或存储设备中的物理地址。出于这个原因,引用通常被称为指针或地址,并且被称为指向数据。但是,引用也可以是数据地址与某个固定“基”地址或数组索引之间的偏移量(差异)。

Java选择使用更宽泛的术语“引用”而不是“指针”,因为Java和C之间存在差异。(因此创建了类似西西弗斯的情况,我们必须继续解释Java是值传递的) 。

你没有C指针,你有一个Java Reference。这与C ++引用或传递引用无关。

因为Java是按值传递,所以类似使用C指针,因为当你将它传递给方法时,会复制值(例如内存地址)。

答案 3 :(得分:0)

您必须了解类型变量对象的不同但相关的概念。如果我们暂时忽略像int这样的基本类型并且只考虑类类型,那么在Java中就有变量,它们是“命名的东西”和对象。变量和对象都有一个类型。但是,T类型的变量不是对象;相反,它是定位类型为T的对象的机制,用于通知运行时该对象正在使用中。变量可能在任何时候都找不到任何对象,在这种情况下它是null,或者它可能,并且在这种情况下,变量的存在使对象保持活着。

让我们再说一遍:变量有名字。对象没有名称。变量不是对象。

当您将变量作为参数传递给函数调用时,相应的函数参数将变为参数的副本,因此现在有两个变量,它们都定位同一个对象。当您将一个变量分配给另一个变量时,可以使左侧变量找到与右侧变量相同的对象(可能是null),放弃可能先前保存的位置。但是没有任何物体受此影响;这些物体存在于一些不相关的,无法形容的存在层面。

此外,变量具有确定性生命周期,这由其范围(基本上是块本地或静态全局)确定。变量的生命周期与对象的生命周期无关,但不能直接控制对象的生命周期。

简而言之,这就是Java的类型系统和对象模型(对于类类型)。这取决于你想要标记的内容;说“变量是引用”是有意义的,因为这就是他们所做的,但你可能只是停止尝试将自己与其他语言进行比较,只是说“变量”,这在Java的上下文中是足够清楚的。变量是变量,对象是对象,任何一个都不是另一个,你需要前者来讨论后者。

答案 4 :(得分:0)

在Java中,引用是指针,通常是指针null.这就是为什么它被称为NullPointerException,而不是NullReferenceException. "The reference values (often just references) are pointers to these objects, and a special null reference, which refers to no object. "

Java指针/引用类似于Pascal指针,而不是C或C ++指针,因为它们的类型非常强,不支持地址算法。