我已经在google上寻找答案,但我并不满意。
我的逻辑:
Java
使用内存位置,它只是在你无法看到或访问它的幕后(据我所知,可能有访问它的方法,我不知道)。
我的困惑/问题:
在Java等编程语言中没有指针的目的是什么,专门用于在任何系统上使用的互联网,而不是像c ++这样使用指针的编程语言?
修改
你们许多人都在说“保持简单”。如果是这种情况,那么为什么流行的编程语言(如c++
)会使用指针呢?
答案 0 :(得分:65)
简单的答案是,这是一个设计决定。稍微长一点的答案是C ++中的指针只是内存操作所必需的,这不是适用于Java的概念(见下文)。
Java设想了一个相当系统的,面向对象的编程模型,并且所有基于类的类型基本上都是始终通过指针处理,因此这个事实根本不会暴露给用户。
C ++中的原始指针在高质量,系统和惯用的编程中也不是非常必要的。什么原始指针允许你做(即指针运算)通常被认为是“不安全的”,因此它完全被排除在Java之外。
请注意,人们尝试使用C和C ++中的指针进行的许多操作实际上是未定义的行为。正确使用指针会给你一组相当有限的选项,其中大部分都可以在惯用的C ++中做得更好。
关于指针的唯一实际用法是直接内存操作。由于Java不希望你这样做(实际上它的垃圾收集内存管理会主动干扰并被手动内存操作破坏),因此不需要显式指针。
更新后:最后一段是(在我看来)最引人注目的解释:在C ++中你需要能够编写自己的内存管理代码( cf.“allocators”)。内存有通过指针处理。所以我的严格答案是,当你实现内存管理时,你需要用C ++指针,而不是其他。
答案 1 :(得分:32)
在内部,对象的引用被实现为指针。虽然没有指针算法......
C ++有指针,因为它是作为C的超集构建的,它有指针。 C有指针,因为它是在60年代设计的。那时计算机的内存非常少,指针允许执行字符串,数组和参数传递。
这是白皮书The Java Language Environment的摘录:
2.2.9没有更多指针
大多数研究都认为指针是其中一个主要特征 使程序员能够将错误注入其代码中。鉴于 结构消失了,数组和字符串是对象,需要 指向这些结构的指针消失了。因此,Java没有指针数据 类型。任何需要数组,结构和指针的任务 通过声明对象和可以更容易和可靠地执行C. 对象数组。而不是在数组上的复杂指针操作 指针,您可以通过算术索引访问数组。 Java 运行时系统检查所有数组索引以确保索引在其中 数组的边界。
由于指针不正确,你不再有悬空指针和内存垃圾,因为Java中没有指针。
答案 2 :(得分:17)
Java 确实有指针。实际上,Java中的所有内容都是指针(称为引用)。
异常:int,boolean,char等。
因为一切都是指针,所以不需要星号来发挥作用。
答案 3 :(得分:7)
首先,显而易见的问题是Java不保证对象在其整个生命周期内都保持在同一地址。
高效的垃圾收集器依赖于能够移动对象,这样做会使(先前)指向对象的任何指针无效。
其次,Java几乎确实有指针。 C / C ++指针并不像你认为的那样。
C ++指针不允许您只指向任意内存地址并读取其内容。 不允许您将指针递增到数组的末尾。
语言无法检测您是否执行了这些操作,并且在执行此操作时无法捕获错误。但这并不意味着它是允许的。这是未定义的行为,简而言之,可以做任何。
Java几乎 有指针。这里有一个几乎完整的列表,列出了你可以在C ++中使用指针合法地做些什么:
最后一点实际上是Java中唯一不可能实现的。它比人们通常想象的更加严格。它不会给你一个全权委托来创建指向任何旧地址的指针。它不会让你“直接访问内存”。
所以Java没有指针,因为:
答案 4 :(得分:4)
出于同样的原因,java没有无符号类型。该语言的设计者决定不包括它们以保持语言“更简单”。
答案 5 :(得分:3)
因为Java是一种简单,安全且相对简单的编程语言。指针是Java设计者决定不向程序员提供的一个敏锐的工具。
@oltarus是正确的,从某种意义上说,Java的引用是指针,但有一个主要区别:你不能对它们进行算术运算,而你可以对指针进行算术运算。 。指针算法同时是指针错误的主要来源,因为它使它们指向内存中的无效位置(例如,忘记初始化它们,或通过逐个错误)。
更新:C ++有指针,因为它们是C ++旨在支持的低级系统编程所必需的。 C ++被设计为一个更好的C"并且是该语言的替代品,这意味着它具有实现操作系统和设备驱动程序等所需的所有功能。用一种没有指针的语言来做这件事实际上是不可能的。
C和C ++都遵循这样的理念:如果你要求它几乎可以完全访问硬件,那么你几乎可以做任何你想做的事情,但语言也不会阻止你做愚蠢的事情。 Java,OTOH通过在VM沙箱中运行程序来限制您对计算机的访问。
答案 6 :(得分:3)
主要原因是可验证性。定义Java字节码,以便加载程序可以决定in finite time程序是否可以安全执行。指针算术不能以允许此验证的方式表示,因此它已从语言中删除,并且仅保留引用的分配。
同样的限制适用于C ++ / CLI;如果在指针上使用某些表达式,编译器就不能仅使用“安全”集中的字节码来表示代码,如果启用了检查,则组件无法加载。
CLI和Java字节码之间的区别在于Java没有“不安全”的指令集,因为它专门针对Internet上的不受信任的代码而设计。
答案 7 :(得分:3)
在Java中,所有对象都在堆上分配。因此,您始终使用“指针”(因此删除表示法)来引用它们,而不是使用静态或动态分配对象的C / C ++。
答案 8 :(得分:1)
主要原因是因为指针导致许多很难识别的错误。在Java中,程序员的生活更容易。
对于更新的问题:带指针的C ++比Java具有更好的性能。