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

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

在Java中使用哪个概念而不是指针?

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

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

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

因为Java的设计者认为它是一个棘手的使用和容易出错的构造。

在Java中使用哪个概念而不是指针?

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

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

这是一个语言设计决定。

来自太阳白皮书Java语言环境 :

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

由于指针不正确,你不再有悬空指针和内存垃圾,因为Java中没有指针。

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

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

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

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

在Java中,对简单类型的任何引用总是按值进行,对对象的任何引用总是指针,除非是特殊对象。

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

 XXX a=new XXX(); 

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

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

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

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

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

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

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

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

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

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