5

我正在做这些在线 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,这让我很困惑。

非常感谢

4

5 回答 5

9

"1"是 String 类的实例,String 是 Java 中 Object 类的子类(与任何其他类一样)。1被装箱成一个 Integer,它也是从 Object 派生的。

于 2010-02-27T08:06:42.113 回答
3

因为"1"是 a 的一个实例String,并且因为 1.51可以自动装箱到 a Integer; 这两种类型都是Object. 在引入自动装箱之前,Object o = 1;不会编译。

为了充分利用这种学习经验,您应该了解Object'sgetClass()方法。通过添加System.out.println(o.getClass().getName()),您还可以打印所引用的对象o所属的类的名称。在您的情况下,它们是java.lang.String(for (Object) "1") 和java.lang.Integer(for (Object) 1)。

只是为了完成,我应该提到你现在也可以做Object o = false;.

于 2010-02-27T13:17:26.803 回答
1

嗯,第一种情况“1”是一个String字面量,是一个对象的子类,因此可以分配给它。作为一个字符串,它输出 1 比较简单。

在第二种情况下,自动装箱正在发生。Integer是对象的子类,因此可以分配给它。同样, 1 的输出也很有意义。

于 2010-02-27T08:07:36.983 回答
1

这是因为ois 类型Object。Java 中的每个对象都扩展了类Object。所以...当您说 时Object o = 1,它会将 1 转换为 from intIntegerObject. 类似地,“1”是 aString是 a Object。在这两种情况下,调用System.out.printlnan都会Object调用ObjectstoString方法。在这两种情况下,它都会打印 1。

于 2010-02-27T08:11:56.783 回答
1

您可以将任何对象放在Object o = anything;哪里,anything因为所有类都派生自Object该类。由于 java 1.5 中的自动装箱功能,它可以与原语一起使用。

于 2010-02-27T08:18:29.037 回答