当我开始使用Java时,我暗示我们有两种不同的类型:
Objects (strings, from classes, println, etc)
primitive values (int, double, char)
我刚回到教授的考试中,这种差异意味着两个选择之间的差异作为答案。当我让我的教授澄清时,他告诉我原始价值观可能是对象。
谁在这里,任何人都可以给我任何证据吗? 证明是官方的声音,我会选择这个作为答案,并授予你一些众所周知的互联网。
答案 0 :(得分:10)
原语不是对象。也就是说,int
不是Integer
。
但是,对于任何模糊的Java编译器,原语可以auto-boxed作为关联对象类型(int
自动装箱为Integer
)和auto-unboxed({{ 1}} unboxes为Integer
),与基元(int
,Integer
等)相关的对象类型的实例是不可变的(这对于像原始对应物这样的行为很重要),因此区别变得模糊。这可能是教授所暗示的。
也就是说,接受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)。
由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