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

Tom*_*rez 3 java types

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

因此,在另一篇 SO帖子中,Buhake Sindi 指出:

Boolean 是原始类型的包装器

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

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

T.J*_*der 5

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

在那个树图中,“Boolean”和“Integer”不是类/类型名称,它们只是标签(就像“浮点”一样)。

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

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

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

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

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

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

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

不,类型Object(或其任何子类型)的变量、实例成员或参数只能包含对象引用,而不能包含像int或 之类的基元char。这就是我们为原语提供包装器的原因,因此我们可以将它们(通过包装器)存储在需要对象引用的地方。


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

并且 char是Java 中的整数类型


FWIW,我对该草图的粗略通过看起来像这样:

在此处输入图片说明

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

  • @TomiSebastiánJuárez 在这种情况下在幕后发生了一些 [Autoboxing](https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)。`a` 是 _wrapped_ 到 `Integer`,这就是为什么你没有得到任何异常。 (2认同)