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

时间:2014-03-19 21:51:11

标签: java object

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

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

我刚回到教授的考试中,这种差异意味着两个选择之间的差异作为答案。当我让我的教授澄清时,他告诉我原始价值观可能是对象。

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

4 个答案:

答案 0 :(得分:10)

原语不是对象。也就是说,int不是Integer

但是,对于任何模糊的Java编译器,原语可以auto-boxed作为关联对象类型(int自动装箱为Integer)和auto-unboxed({{ 1}} unboxes为Integer),与基元(intInteger等)相关的对象类型的实例是不可变的(这对于像原始对应物这样的行为很重要),因此区别变得模糊。这可能是教授所暗示的。

也就是说,接受Long的方法(例如)可以被赋予int,并且编译器只处理拆箱它;类似地,接受Integer(映射到脑海中)的方法可以接受原语,并且编译器将其装入相应的对象类型。

答案 1 :(得分:2)

基元和对象之间存在隐式映射,因此可以在期望int的地方使用Integer。这是一个名为autoboxing的功能。

例如:

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

此外,原语与对象有共同之处。他们有一个Class,例如int.class

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

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

答案 2 :(得分:1)

  

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

答案是否定的。

JLS

  

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

那些是Primitive Types and Values

  

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

命名

Reference Types and Values可以是

之一
  

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

另请注意,有一种特殊类型the null type及其对应的值the null reference

  

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

     

...

     

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

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

  

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

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

答案 3 :(得分:0)

一句话,引用规格!!! https://docs.oracle.com/javase/specs/jls/se8/jls8.pdf

<块引用>

一个对象是一个类实例或一个数组。

Conclusion:
value/primitive types are __NOT__ objects.
reference/class types are         objects.

此外,所有对象都扩展了类对象。 并且 instanceof 运算符不适用于值类型:

int a; //:<-- int is [value/primitive] type version 
       //:    of Integer [reference/class] type.
if( a instanceof Object ){ ... } //:<-- SYNTAX ERROR