java真的有指针吗?

Gab*_*iel 29 c++ java pointers

我在google上寻找答案,但我并不满意.

我的逻辑:

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

我的困惑/疑问:

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

编辑


你们中许多人都在说"保持简单".如果是这种情况,那么为什么流行的编程语言,比如c++使用指针呢?

Ker*_* SB 65

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

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

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

请注意,人们尝试使用C和C++中的指针进行的许多操作实际上是未定义的行为.正确使用指针会为您提供一组相当有限的选项,其中大多数选项可以在惯用的C++中更好地完成.

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

更新后:最后一段是(在我看来)最引人注目的解释:在C++中,你需要能够编写自己的内存管理代码(参见"allocators").内存必须通过指针处理.所以我的严格答案是,当你实现内存管理时,你需要用C++指针,否则就不需要.


Cos*_*lis 32

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

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

这是白皮书Java语言环境的摘录:

2.2.9没有更多指针

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

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

  • "C++有指针,因为它是作为C的超集构建的,它有指针.C有指针,因为它是在60年代设计的." 没有.C/C++有指针,因为它们很有用.C/C++仍然在许多java完全失败的情况下使用,这就是为什么它们仍然是现在非常流行的语言. (6认同)
  • 为什么C++没有取代C?是不是C++的C演变?语言非常持久...... (3认同)

Ste*_*roz 17

Java 确实有指针.实际上,Java中的所有内容都是指针(称为引用).

例外:int,boolean,char等.

因为一切都是指针,不需要星号来发挥作用.

  • C++中的指针和Java中的引用之间存在一些差异.指针允许一些算术和参考不允许. (8认同)
  • C和C++也不允许您访问任意内存位置.不同之处在于,在C++中,它是未定义的行为,可能会使您的进程崩溃或执行任何其他操作,而在Java中,编译器会阻止它. (3认同)
  • @Gabe:他们这样做.您是否意味着"为什么java没有指针_arithmetic_"? (3认同)
  • @jalf:未定义的行为只是"我们没有指定这个,但它可能做一些有趣的事情"的标准.C被设计为操作系统的编程语言,并且经常使用指向任意位置的指针,无论标准告诉我们什么是允许的. (2认同)
  • 是的,标准肯定是C语言.无论Linux内核做什么,C语言都是如此.你会说什么****定义什么是C,如果不是标准?但我们通常会说Linux内核是用C语言编写的,因为它足够好用于近似 (2认同)

jal*_*alf 7

首先,显而易见的问题是Java不保证对象在其整个生命周期内都保持在同一地址.

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

其次,Java几乎确实有指针.C/C++指针并不像你认为的那样.

A C++指针是不会让你只是指向一个任意的存储器地址和读取它的内容.它不是让你增加一个指针过去的数组的末尾.

语言无法检测您是否执行了这些操作,并且无法在执行此操作时捕获错误.但这并不意味着它是允许的.它是未定义的行为,简而言之,可以做任何事情.

Java几乎确实有指针.这里有一个几乎完整的列表,列出了你可以在C++中使用指针合法地做些什么:

  • 取消引用它来获取指向的对象
  • 重新安置它,使其指向不同的对象
  • 使它成为空指针
  • 如果它指向一个数组,你可以执行指针算术,添加或从指针中减去,只要结果仍然指向同一个数组,或者如果它们都指向同一个数组,则取两个指针之间的差异.

最后一点实际上是Java中唯一不可能实现的.它比人们通常认为的更加严格.它不会给你一个全权委托来创建指向任何旧地址的指针.它不会让你"直接访问内存".

所以Java没有指针,因为:

  • 正确地实现GC语言是非常具有挑战性的,
  • 它要么需要一定程度的运行时检查(以保证检测到并安全地处理无效的内存访问),要么它会使Java成为一种不安全的语言,行为不是100%指定的,
  • 没有多大意义,因为除了Java引用之外,指针只允许很少的附加功能