为什么我们不能在Java中使用指针?

时间:2011-08-03 09:22:08

标签: java

为什么我们不在这里使用指针?

在Java中使用哪个概念代替指针?

10 个答案:

答案 0 :(得分:21)

  

为什么我们不能在Java中使用指针?

因为语言设计者选择不在语言中包含指针。

  

为什么我们不在这里使用指针。

因为Java的设计者认为它是一个难以使用且容易出错的构造。

  

在Java中使用哪个概念代替指针?

引用(如果忽略指针运算,则与指针非常相似)。

请记住,您在堆上创建的所有对象(使用new关键字)。这个事实,以及没有“解除引用运算符”(C / C ++中的*)的事实意味着没有办法获取对象!由于无法获取对象,因此无法将对象存储在变量中。因此,所有变量(包含原始类型的变量除外)都是引用类型。

答案 1 :(得分:10)

这是一项语言设计决定。

来自太阳白皮书The Java Language Environment

  

大多数研究都认为指针是其中一个主要特征   使程序员能够将错误注入其代码中。鉴于   结构消失了,数组和字符串是对象,需要   指向这些结构的指针消失了。因此,Java没有指针数据   类型。任何需要数组,结构和指针的任务   通过声明对象和可以更容易和可靠地执行C.   对象数组。而不是在数组上的复杂指针操作   指针,您可以通过算术索引访问数组。 Java   运行时系统检查所有数组索引以确保索引在其中   数组的边界。

     

因为你不再有悬空指针和捣乱记忆   不正确的指针,因为Java中没有指针。

答案 2 :(得分:2)

不是很好吗?你没有C编程意义上的指针,虚拟机会照顾所有这些。但是,这并不是说你没有类似的能力。例如,对象的变量是引用,当您为正在传递排序指针的引用的对象传递变量时。您也可以使用变量来存储数组中项的索引,这也是程序意义上的一种指针。

答案 3 :(得分:1)

只能通过指针访问Java中的所有内容。 Java引用是指针。 Dr.Gosling的创建者在他的书“Java语言规范”(在一个版本中大约p.40左右)中这样说。

实际上另一本书“Java虚拟机”说:“引用是指向一对指针的指针;其中一个指针指向另一个指针[...]”。

Java引用和C指针之间存在显着差异,但引用仍然是指针。

答案 4 :(得分:0)

在Java中,对简单类型的任何引用总是按值和任何引用 除特殊对象外,对象始终是指针。

答案 5 :(得分:0)

您使用new()创建的每个对象;实际上是指针..

XXX a=new XXX();

a实际上是指针.. 只是你不能像C中那样对它们做像指针算术这样的花哨的事情(出于安全原因)。

所以实际上如果要传递一个对象,则将指针传递给该对象(由new()创建的对象驻留在堆中)。

答案 6 :(得分:0)

您可以使用java.misc.unsafe访问指针机制,但那是...... mmm ... 不安全

啊,关于更换概念。你对哪个方面感兴趣?变量已经通过对它们的引用来表示 - 这是一个观点。如果你需要指针来实现高效的数据结构,你很可能已经有了一个,或者有一个提供该功能的库,或者你可以编写一些本机代码并从java包装器中调用它。无论如何,请定义您感兴趣的方面,也许社区会给您更详细的答案。

答案 7 :(得分:0)

Java遵循 按值调用 的原则。因此,如果您创建一个对象,您将获得堆空间中对创建对象的引用的副本。此引用的副本是变量分配给的内容。如果您随后将此变量用作方法调用的参数,则会再次创建并使用该引用的副本。 Java从不使用引用或指针! java中的所有内容都是副本。因此,Java遵循call by value原则。

答案 8 :(得分:0)

在任何编程语言中操作最困难的事情是使用指针。 如果你错过了一些东西,你就会遇到很多错误,即分段错误。 Java就是这样一种语言,它为用户提供了使用CALL BY VALUE执行操作的灵活性。

答案 9 :(得分:-1)

如果要更改C函数中变量的值,请将变量的地址(指针)传递给函数。如果要在函数中使用变量的值而不希望更改其值,则将变量的名称(引用)传递给函数。许多程序员从来没有使用指针来做任何其他事情,比如链表和b树。 C指针和结构可以使一些应用程序变得更加容易。与数组不同的结构可以包含不同类型的变量,并将它们组合在一起使生活更轻松。链接列表中的结构包含指针(列表中的下一个链接的地址,如果列表是双链接的,也可以是前一个链接。这可以使排序变得轻而易举。

列表中的链接还可以包含指向不同结构的指针,这些指针允许您将不同材料或条件的链接列表与第一个列表中的每个链接相关联。

由于内存是根据需要分配的,而不是像数组一样分配,因此它为您提供了极大的灵活性。我用它的主要应用是计算投标作业的项目成本。

这种灵活性需要密切关注细节,不能禁止调试。