原始值可以被视为java中的对象吗?

当我开始使用Java时,我暗示我们有两种不同的类型:

Objects (strings, from classes, println, etc) primitive values (int, double, char) 

我刚刚从教授那里得到了一个考试,这个差异意味着两个选择之间的差异作为答案。 当我让我的教授澄清时,他告诉我原始价值观可以是对象。

谁在这里,任何人都可以给我任何证据吗? certificate是官方的声音,我会选择作为答案,并授予你一些众所周知的互联网。

原始值可以被视为对象吗?

答案是不。

JLS表示

Java编程语言中有两种类型 :基本类型(第4.2节)和引用类型(第4.3节)。 相应地, 有两种数据值可以存储在变量中,作为参数传递,由方法返回,并在以下操作:原始值(§4.2)和参考值(§4.3)。

这些是原始类型和价值观

由Java编程语言预定义并由其保留关键字命名

和引用类型和值可以是其中之一

类类型(§8),接口类型(§9),类型变量(§4.4)和数组类型(§10)。

还要注意,有一个特殊类型是the null type ,它的对应值the null reference

还有一个特殊的null类型,表达式的类型为null(§3.10.7,§15.8.1),它没有名称。

空引用是null类型表达式的唯一可能值。

对于基元类型,JLS定义了一种称为Boxing Conversion的机制,用于将它们转换为相应的引用类型。

拳击转换将基本类型的表达式转换为引用类型的相应表达式。

因此,由于需要转换从基本类型转换到相应的引用类型,所以不能说基元可以被视为对象,反之亦然。 但可以说他们是可以兑换的。

基元不是对象。 也就是说, int不是Integer

但是,对于任何模糊的Java编译器,基元可以自动装箱为关联对象类型( int autoboxes为Integer )和自动取消装箱 ( Integer unboxes as int ),以及与基元相关的对象类型实例( IntegerLong Integer等)是不可变的(这对于表现像原始对应物一样重要),因此区别变得模糊。 这可能是教授所暗示的。

也就是说,接受int的方法(例如)可以给出一个Integer ,编译器只需处理拆箱; 类似地,接受Object的方法(映射到脑海中)可以接受原语,并且编译器将其分成相应的对象类型。

在基元和对象之间存在隐式映射,因此可以在期望Integer地方使用int 。 这是一个称为自动装箱的function。

例如:

 Integer foo = 4; // 4 is really an int 

而且,原语与对象有共同之处。 它们有一个Class ,比如int.class

还应注意,所有数组都是对象。

然而,Object vs primitive的概念是Java中最糟糕的事情之一。 许多现代语言根本不会在它们之间产生太大的差异,甚至没有任何原语。 (在java中,您可以在不使用显式原语的情况下完成所有操作)。