java真的有指针吗?

时间:2011-11-10 13:58:11

标签: java c++ pointers

我已经在google上寻找答案,但我并不满意。

我的逻辑:

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

我的困惑/问题:

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

修改


你们许多人都在说“保持简单”。如果是这种情况,那么为什么流行的编程语言(如c++)会使用指针呢?

9 个答案:

答案 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没有指针,因为:

  • 正确实施GC语言将非常具有挑战性,
  • 它要么需要一定程度的运行时检查(以保证检测到并安全地处理无效的内存访问),否则会使Java成为一种不安全的语言,行为不是100%指定的,
  • 没有多大意义,因为除了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具有更好的性能。