我对Java中的数据类型感到困惑。我在互联网上看到很多图像,表示Java中的数据类型是一棵树,让我对我曾经想过的东西犹豫不决。这些树的示例如下所示:
所以,在另一个SO post中,Buhake Sindi指出:
Boolean是基本类型
的包装器
在Java中的数据类型的先前树表示之后,我的问题是:
答案 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
(或其任何子类型)的变量,实例成员或参数只能包含对象引用,而不能包含int
或char
等基元。那是为什么我们有基元的包装器,所以我们可以存储它们(通过包装器)来预期对象引用。
另请注意,该图表以另一种方式具有误导性:“浮点”不应位于“积分”下。在计算机科学中,“整数类型”是整数(在数学中,它比那更复杂)。这就是为什么JLS将 NumericType 拆分为 IntegralType 和 FloatingPointType (ref)。
char
是Java中的integral type。
FWIW,我在那幅草图上的粗略传递看起来像这样:
最终希望不会被压扁和丑陋。 :-)请注意我到处重复“类型”以避免出现使用类名,并且当我使用关键字或类名时,我使用字体(就像你原来的那样)来调用。
答案 1 :(得分:1)
图形令人困惑,因为它混淆了术语。
“非原始”分支显示类名(String
,Array
等),而“原始”分支将实际的类名与标签混合,例如Boolean
和{{ 1}}是类,但在此用作节点标签。 “浮点”不是一个类,只是一个标签。
包装类包装原语,例如Integer
类包装Boolean
原语。
答案 2 :(得分:1)
<强> 1。 原始数据类型的包装器也是原始数据类型吗?对于 示例布尔值,整数,字符。
没有。原语的包装器不是原始数据类型。是包装基元类型的对象。因此,该图具有误导性,因为它将包装类放在基本部分下,并且应该位于非原始部分下。
<强> 2。 树中的Object数据类型应该在哪里?我认为, Object是一个内存区域,可以包含Java中的任何类型;从 程序员创建的类的原语。所以,对象可能 包含原始和非原始数据类型。这是真的吗?
对象不是内存区域。 “Object
是类层次结构的根。每个类都有Object作为超类。所有对象,包括数组,都实现了这个类”的方法。它应该是图中非原始部分下的第一个元素。