原始类型基元的包装器也是类型吗?

时间:2018-01-17 15:23:14

标签: java types

我对Java中的数据类型感到困惑。我在互联网上看到很多图像,表示Java中的数据类型是一棵树,让我对我曾经想过的东西犹豫不决。这些树的示例如下所示:Figure 1: Java data types schema.

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

  

Boolean是基本类型

的包装器

在Java中的数据类型的先前树表示之后,我的问题是:

  1. 原始数据类型的包装器也是原始数据类型吗?例如布尔整数字符
  2. 树中的 Object 数据类型应该在哪里?据我所知, Object 是一个内存区域,可以包含Java中的任何类型;从原语到程序员创建的类。因此, Object 可能包含原始和非原始数据类型。这是真的吗?

3 个答案:

答案 0 :(得分:3)

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

在该树形图中,“布尔”和“整数”不是类/类型名称,它们只是标签(如“浮点”)。

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

因此,例如,包装器将在非原始类型下:

               Data Type
                 /    \
                /      \
               /        \
              /          \
      Primitive Types    Non-Primitive Types (base class: Object)
            /                         /                  \
           /                         /                    \
    Numeric Types         Primitive Wrapper Types         (etc.)
         /                    /      |      \
        /                    /       |       \
  Integer Types           Char    Integer  Boolean
      /
     /
   char

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

  

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

不,这不是记忆区域。这是一种类型。

  

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

不,类型Object(或其任何子类型)的变量,实例成员或参数只能包含对象引用,而不能包含intchar等基元。那是为什么我们有基元的包装器,所以我们可以存储它们(通过包装器)来预期对象引用。

另请注意,该图表以另一种方式具有误导性:“浮点”不应位于“积分”下。在计算机科学中,“整数类型”是整数(在数学中,它比那更复杂)。这就是为什么JLS将 NumericType 拆分为 IntegralType FloatingPointType ref)。

char是Java中的integral type

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

enter image description here

最终希望不会被压扁和丑陋。 :-)请注意我到处重复“类型”以避免出现使用类名,并且当我使用关键字或类名时,我使用字体(就像你原来的那样)来调用。

答案 1 :(得分:1)

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

“非原始”分支显示类名(StringArray等),而“原始”分支将实际的类名与标签混合,例如Boolean和{{ 1}}是类,但在此用作节点标签。 “浮点”不是一个类,只是一个标签。

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

答案 2 :(得分:1)

<强> 1。 原始数据类型的包装器也是原始数据类型吗?对于     示例布尔值,整数,字符。

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

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

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