Java真的有指针吗?[已关闭]

2022-09-01 12:19:23

我已经在谷歌上寻找答案,但我不满意。

我的逻辑:

Java使用内存位置,它只是在幕后,你看不到或访问它(据我所知,可能有一些我不知道的访问它们的方法)。

我的困惑/问题:

在像Java这样的编程语言中没有指针的目的是什么,这种编程语言是专门为互联网设计的,可以在任何系统上使用,而像c ++这样的编程语言确实使用指针?

编辑


你们中的许多人都在说“保持简单”。如果是这样的话,那么为什么流行的编程语言(如 )无论如何都要使用指针呢?c++


答案 1

简单的答案是,这是一个设计决策。稍微长一点的答案是,C++中的指针仅用于内存操作,这不是适用于Java的概念(见下文)。

Java设想了一个相当系统的、面向对象的编程模型,所有基于类的类型基本上总是通过指针来处理,所以这个事实根本不会暴露给用户。

C++的原始指针在高质量、系统和惯用的编程中也不是非常必要。原始指针允许你做什么(即指针算术)通常被认为是“不安全的”,所以它完全被排除在Java之外。

请注意,人们试图用C中的指针做很多事情,C++实际上是未定义的行为。正确使用指针会给您留下一组相当有限的选项,其中大多数选项都可以在惯用C++中做得更好。

指针的唯一真正用途是直接内存操作。由于Java不希望您这样做(实际上,它的垃圾回收内存管理会主动干扰手动内存操作并被手动内存操作破坏),因此不需要显式指针。

更新后:最后一段(在我看来)是最引人注目的解释:在C++你需要能够编写自己的内存管理代码(参见“分配器”)。内存必须通过指针进行处理。所以我严格的回答是,当你实现内存管理时,你需要C++中的指针,而不是其他指针。


答案 2

在内部,对对象的引用作为指针实现。虽然没有指针算术...

C++有指针,因为它是作为 C 的超集构建的,C 确实有指针。C有指针,因为它是在60年代设计的。当时计算机的内存非常少,指针允许实现字符串,数组和参数传递。

以下是白皮书《Java 语言环境》的摘录:

2.2.9 不再有指针

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

您不再有悬空的指针和由于不正确的指针而丢弃内存,因为Java中没有指针。