【问题标题】:Are wrappers of a primitive type primitives types too?原始类型的包装器也是原始类型吗?
【发布时间】:2018-06-26 12:49:08
【问题描述】:

我对 Java 中的数据类型感到困惑。我在 Internet 上看到很多将 Java 中的数据类型表示为一棵树的图像,这让我对我过去的想法感到犹豫。这些树的一个示例如下所示:

所以,在另一个 SO post 中,Buhake Sindi 指出:

Boolean 是原始类型的包装器

按照前面Java中数据类型的树形表示,我的问题是:

  1. 原始数据类型的包装器也是原始数据类型吗?例如 BooleanIntegerCharacter
  2. Object 数据类型应该在树中的什么位置?据我了解,Object 是一个内存区域,可以包含 Java 中的任何类型;从原语到程序员创建的类。因此,Object 可能包含原始数据类型和非原始数据类型。这是真的吗?

【问题讨论】:

  • ... 包装器包装原语。他们不是原始人。基元明确地不是对象;这就是为什么它们被称为原语,以及为什么它们有包装器。提供的对象层次结构表明原始包装器具有自己的继承树。请注意,并非“原始”标题下的所有内容实际上都是类名——但有些是,这使得它成为一个设计不佳的文档。
  • 包装器是对象,不是基元,但它们可能会根据需要拆箱成基元。
  • 不,该图具有误导性:叶子是基元,上面是基元的包装器-“数字”和“浮点”也不是类。

标签: java types


【解决方案1】:

不,原语的包装器不是原语。这就是它们的重点:当需要对象引用而不是原始类型时(例如在List 中),它们用于包装原始类型。

在该树形图中,“Boolean”和“Integer”不是类/类型名称,它们只是标签(就像“Floating-point”一样)。

Object 适合“非原始”顶部的那棵树。

因此,例如,包装器将属于非原始类型:

数据类型 / \ / \ / \ / \ 原始类型非原始类型(基类:对象) // \ // \ 数字类型原始包装类型(等) // | \ // | \ 整数类型 Char Integer Boolean / / 字符

(显然这是非常不完整的。)

据我了解,Object 是一个内存区域,可以包含 Java 中的任何类型;从原语到程序员创建的类。

不,它不是内存区域。这是一种类型。

因此,Object 可能同时包含原始数据类型和非原始数据类型。

不可以,Object(或其任何子类型)类型的变量、实例成员或参数只能包含对象引用,而不是像 intchar 这样的原语。这就是为什么我们有原语的包装器,所以我们可以(通过包装器)将它们存储在需要对象引用的地方。


另请注意,该图在另一种方面具有误导性:“浮点”不应位于“积分”之下。在计算机科学中,“整数类型”是整数(在数学中,它比这更复杂)。这就是 JLS 将 NumericType 拆分为 IntegralTypeFloatingPointType (ref) 的原因。

并且char是Java中的integral type


FWIW,我在那个草图上的粗略传球看起来像这样:

希望决赛不那么压抑和丑陋。 :-) 请注意,我在各处重复“类型”以避免使用类名的出现,并且当我使用关键字或类名时,我使用了字体(就像你原来的那样)来调用。

【讨论】:

  • 那么为什么我可以这样做:int a = 4;对象 x = a;?如果 Object 变量只能包含会引发错误的对象引用
  • @TomiSebastiánJuárez 有一些 Autoboxing 在幕后发生。 a包装Integer,这就是为什么你没有得到任何异常。
【解决方案2】:

该图形令人困惑,因为它混淆了术语。

“非原始”分支显示类名(StringArray 等),而“原始”分支将实际类名与标签混合,例如,BooleanInteger 是类,但使用这里作为节点标签。 “浮点”不是一个类,只是一个标签。

包装类包装原语,例如,Boolean 类包装boolean 原语。

【讨论】:

    【解决方案3】:

    1. 原始数据类型的包装器也是原始数据类型吗?为了 例如布尔值、整数、字符。

    没有。原始数据类型的包装器不是原始数据类型。是包装原始类型的对象。因此该图具有误导性,因为它将包装类放在原始部分下,并且应该在非原始部分下。

    2。 树中的 Object 数据类型应该在哪里?我认为, Object 是一个内存区域,可以包含 Java 中的任何类型;从 程序员创建的类的原语。所以,对象可能 包含原始和非原始数据类型。这是真的吗?

    对象不是内存区域。 Object是类层次结构的根。每个类都有Object作为超类。所有对象,包括数组,都实现了这个类的方法”。它应该是图表非原始部分下的第一个元素。

    【讨论】:

      猜你喜欢
      • 2021-09-11
      • 1970-01-01
      • 2015-01-01
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 2021-03-07
      • 2019-12-15
      相关资源
      最近更新 更多