java.lang.Object o = 1; //为什么要编译?

时间:2010-02-27 08:03:38

标签: java autoboxing

我正在进行其中一次在线Java测试,我被问到这个问题:

问:表明正确的作业:

Long l = 1; 
Double d = 1;
Integer i = 1;
String s = 1;
Object o = "1";
System.out.println(o);
o = 1;
System.out.println(o);

请在继续之前亲自尝试。

我可以告诉你我弄错了,我调查了一下,发现:

//Long l = 1; //cannot widen and then box
Long ll = 1L;//no need to widen, just box
//Double d = 1;//cannot widen and then box
Double dd = 1d;//no need to widen, just box
Integer i = 1;//no need to widen, just box
//String s = 1;//cannot do implicit casting here

Object o = "1";//this compiles and is just plain weird 
System.out.println(o);//output is 1
o = 1;//this also compiles and is also weird 
System.out.println(o);//output is 1

有人能说出原因:

Object o = 1;Object o = "1";

在这两种情况下编译输出1,这让我很困惑。

非常感谢

5 个答案:

答案 0 :(得分:9)

"1"是String类的实例,String是Java中Object类的子类(与任何其他类一样)。 1被装入一个Integer,它也是从Object派生的。

答案 1 :(得分:3)

因为"1"String的一个实例,因为1.5 1可自动装入Integer;这两种类型都是Object的子类型。在引入自动装箱之前,Object o = 1;无法编译。

要充分利用此学习体验,您应该了解Object的{​​{1}}方法。通过添加getClass(),您还可以打印System.out.println(o.getClass().getName())引用的对象所属的类的名称。在您的情况下,它们是o(适用于java.lang.String)和(Object) "1"(适用于java.lang.Integer)。

为了完成,我应该提到你现在也可以做(Object) 1

答案 2 :(得分:1)

嗯,第一个案例“1”是String文字,所以是对象的子类,因此可以赋予它。作为字符串,输出1相对简单。

在第二种情况下,正在进行自动装箱。 Integer是对象的子类,因此可赋予它。同样,1的输出也很有意义。

答案 3 :(得分:1)

这是因为o的类型为Object。 java中的每个对象都扩展了类Object。所以...当你说Object o = 1时,它会将1转换为intInteger,这是Object。同样,“1”是String,它是Object。在这两种情况下,在System.out.println上调用Object会调用Object s toString方法。在这两种情况下,它都会打印1。

答案 4 :(得分:1)

您可以将Object o = anything;放在anything是任何对象的位置,因为所有类都派生自Object类。由于java 1.5中的自动装箱功能,它适用于原语。