Integer ki=new Integer("50");
System.out.println(ki);//Here I would expect to print the objects name something like package_name.Class@15db9742 but this didn't happen.
ki=3;//Here I would expect an error but this actually works.
当 System.out.println(ki); 执行时,控制台中出现50但是当我打印其他对象时,会出现一些类似package_name.Class@15db9742的内容,为什么会出现50而不是像package_name这样的东西的.class @ 15db9742?
我虽然ki是Integer类型,所以当我分配3的原始值时,我应该得到一个错误,但我不知道为什么?
答案 0 :(得分:11)
你有两个不同的问题:
<input>
因为Integer
overrides toString
。它的实施:
System.out.println(ki);//Here I would expect to print the objects name something like package_name.Class@15db9742 but this didn't happen.
嗯......还是因为 println(int)
exists on PrintStream
。
不,它正在调用public String toString() {
return String.valueOf(value);
}
,然后在对象上使用System.out.println(Object)
。这是因为(正如specification告诉我们的那样)规则是首先尝试找到一个匹配的签名,而不是自动(非)拳击而没有varargs;然后只用自动(非)拳击,然后最后两个。
toString
这是因为autoboxing:Java编译器插入必要的代码来获取该原语 ki=3;//Here I would expect an error but this actually works.
并为其创建3
实例。它实际发出的字节码是这样的:
Integer