java.lang.Object中O = 1; //为什么这个编译?
-
23-09-2019 - |
题
我在做这些网上的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类的一个实例,和字符串是对象类的Java中的子类(如任何其他类)。 1
是盒装入成整数,其也从Object的。
其他提示
由于"1"
是String
的一个实例,并且由于1.5 1
是自动boxable到Integer
;这两种类型都Object
的亚型。引入自动装箱之前,Object o = 1;
不会编译。
要充分利用这个学习经验,你应该知道Object
的getClass()
方法。通过添加System.out.println(o.getClass().getName())
,您还可以打印对象提到了o
属于类的名称。在你的情况下,它们是java.lang.String
(对于(Object) "1"
)和java.lang.Integer
(对于(Object) 1
)。
刚刚完成,我要指出,你现在还可以做Object o = false;
。
那么,第一种情况下的“1”是一个String
文字,所以对象的子类,因此可分配给它。作为一个字符串,它的1输出是相对简单的。
在第二种情况下,自动装箱正在发生。 Integer
是对象的子类,因此可分配给它。类似地,1的输出然后非常有意义。
这是因为o
是类型Object
的。每个对象,在Java中,扩展类Object
。所以...当你说Object o = 1
,从int
转换1至Integer
,这是一个Object
。类似地,“1”是一个String
其是Object
。在这两种情况下,上System.out.println
调用Object
调用Object
s toString
方法。在两种情况下,将打印1。
您可以把Object o = anything;
其中anything
是任何对象,因为所有的类都是从Object
类派生。它与自动装箱因为它排在Java 1.5的特征的原语。