[英]java.lang.Object o = 1;//why does this compile?
我正在做这些在线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,这让我感到困惑。
非常感谢
"1"
是String类的实例,String是Java中Object类的子类(与任何其他类一样)。 1
被装入一个Integer,它也是从Object派生的。
因为"1"
是String
一个实例,因为1.5 1
可以自动装入Integer
; 两种类型都是Object
子类型。 在引入自动装箱之前, Object o = 1;
不会编译。
为了充分利用这种学习体验,您应该了解Object
的getClass()
方法。 通过添加System.out.println(o.getClass().getName())
,您还可以打印o
引用的对象所属的类的名称。 在您的情况下,它们是java.lang.String
(for (Object) "1"
)和java.lang.Integer
(for (Object) 1
)。
只是为了完成,我应该提到你现在也可以做Object o = false;
。
好吧,第一种情况“1”是一个String
文字,所以是对象的子类,因此可以赋予它。 作为字符串,它的输出1相对简单。
在第二种情况下,正在进行自动装箱。 Integer
是object的子类,因此可赋值给它。 同样,1的输出也很有意义。
这是因为o
是Object
类型。 java中的每个对象都扩展了Object
类。 所以...当你说Object o = 1
,它将1转换为int
转换为Integer
,这是一个Object
。 类似地,“1”是作为Object
的String
。 在这两种情况下,在Object
调用System.out.println
调用Object
的toString
方法。 在这两种情况下,它将打印1。
你可以把Object o = anything;
anything
都是任何对象,因为所有类都派生自Object
类。 由于java 1.5中的自动装箱功能,它适用于原语。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.