我在做这些网上的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;不会编译。

要充分利用这个学习经验,你应该知道ObjectgetClass()方法。通过添加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调用Objects toString方法。在两种情况下,将打印1。

您可以把Object o = anything;其中anything是任何对象,因为所有的类都是从Object类派生。它与自动装箱因为它排在Java 1.5的特征的原语。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top