我正在进行其中一次在线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,这让我很困惑。
非常感谢
答案 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转换为int
到Integer
,这是Object
。同样,“1”是String
,它是Object
。在这两种情况下,在System.out.println
上调用Object
会调用Object
s toString
方法。在这两种情况下,它都会打印1。
答案 4 :(得分:1)
您可以将Object o = anything;
放在anything
是任何对象的位置,因为所有类都派生自Object
类。由于java 1.5中的自动装箱功能,它适用于原语。