java真的有指针吗?

Does java really have pointers or not?

本文关键字:指针 真的 java      更新时间:2023-10-16

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

我的逻辑:

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

我的困惑/问题:

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

编辑


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

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

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

c++中的原始指针在高质量、系统化和习惯化的编程中也不是非常必要。原始指针允许您做的事情(即指针算术)通常被认为是"不安全的",因此它完全被Java所忽略。 注意,在C和c++中,人们试图用指针做的许多事情实际上是未定义的行为。正确地使用指针会给你留下一组相当有限的选项,其中大多数可以在惯用的c++中更好地完成。

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

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

内部对对象的引用是作为指针实现的。但是没有指针运算…

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

本文摘自白皮书《Java语言环境:

2.2.9不再有指针

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

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

Java , 指针。实际上,Java中的一切都是指针(称为引用)。

异常:int、boolean、char等

首先,一个明显的问题是Java不能保证对象在其整个生命周期中都保持在同一个地址。

高效的垃圾收集器依赖于能够移动对象,这样做会使(先前)指向该对象的任何指针失效。

第二,Java中几乎没有指针。C/c++指针并不完全像你想象的那样。

c++指针不能允许你指向一个任意的内存地址并读取它的内容。不允许在数组结束后增加指针。

语言没有办法检测你是否做了这些事情,也没有办法在你做这些事情时捕获错误。但这并不意味着这是允许的。这是未定义的行为,简而言之,可以做任何

Java几乎指针。下面是c++中可以合法使用指针的一个几乎完整的列表:

  • 解引用它以获得指向的对象
  • 重新定位它,使其指向不同的对象
  • 设置为空指针
  • 如果指针指向一个数组,你可以执行指针运算,只要结果仍然指向同一个数组,你可以对指针做加法或减法,或者取两个指针的差值,如果它们都指向同一个数组

最后一点实际上是Java中唯一不可能的一点。而且它比人们通常认为的要受限制得多。它不会给你创建指向旧地址的指针的全权委托。它不允许你"直接访问内存"。

所以Java没有指针,因为:

  • 将它正确地实现为GC'ed语言是非常具有挑战性的,
  • 它要么需要某种程度的运行时检查(以保证检测和安全处理无效的内存访问),要么会使Java成为一种不安全的语言,其中的行为没有100%指定,
  • 没有多大意义,因为指针除了Java引用之外,几乎没有其他功能。

出于同样的原因,java没有unsigned类型。语言的设计者决定不包括它们,以保持语言"更简单"。

因为Java是一种简单、安全且相对万无一失的编程语言。指针是一个尖锐的工具,Java设计者决定不让程序员使用它。

@oltarus是对的,在某种意义上,Java的引用是指针,但有一个主要的区别:你不能在它们上做算术,而你可以在指针上做算术。指针运算是指针错误的一个主要来源,因为你让它们指向内存中无效的位置(例如,忘记初始化它们,或者通过偏离1错误)。

Update: c++有指针,因为它们对于c++设计支持的那种低级系统编程是必需的。c++被设计为"更好的C语言",是C语言的替代品,这意味着它具有实现操作系统和设备驱动程序等功能所需的所有功能。在没有指针的语言中这样做几乎是不可能的。

C和c++都遵循这样一种哲学:如果你要求的话,你几乎可以完全访问硬件,所以你几乎可以做任何你想做的事情,但语言也不会阻止你做愚蠢的事情。Java, OTOH,通过在VM沙箱中运行程序来限制您对机器的访问。

主要原因是可验证性。定义了Java字节码,以便装入器可以在有限的时间内决定程序是否可以安全执行。指针算术不能以允许这种验证的方式表示,因此从语言中删除了它,只保留了引用赋值。

同样的限制也适用于c++/CLI;如果你在指针上使用了特定的表达式,编译器就不能再只使用"安全"集合中的字节码来表示代码,如果启用了检查,组件就无法加载。

CLI和Java字节码之间的区别在于Java没有"不安全"指令集,因为它是专门为Internet上不受信任的代码设计的。

在Java中,所有对象都是在堆上分配的。因此,您总是使用"指针"(因此删除符号)来引用它们,而不是C/c++,其中对象是静态或动态分配的。

主要原因是指针会导致许多难以识别的错误。在Java中,程序员的生活更容易。

For update question: c++ with pointer的性能优于Java