繁体   English   中英

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

[英]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; 不会编译。

为了充分利用这种学习体验,您应该了解ObjectgetClass()方法。 通过添加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的输出也很有意义。

这是因为oObject类型。 java中的每个对象都扩展了Object类。 所以...当你说Object o = 1 ,它将1转换为int转换为Integer ,这是一个Object 类似地,“1”是作为ObjectString 在这两种情况下,在Object调用System.out.println调用ObjecttoString方法。 在这两种情况下,它将打印1。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM