2016-11-13 125 views
-3
Integer ki=new Integer("50"); 
System.out.println(ki);//Here I would expect to print the objects name something like [email protected] but this didn't happen. 
ki=3;//Here I would expect an error but this actually works. 

当时System.out.println(ki);执行然后50出现在控制台,但是当我打印其他对象时,像[email protected]一些东西出现为什么50出现,而不是像[email protected]为什么可以在Java中正确打印Integer对象?

虽然ki是Integer类型,所以当我分配3的原始值我应该得到一个错误,但我没有为什么?

+2

了解拳击和自动装箱:http://beginnersbook.com/2014/09/java-autoboxing-and-unboxing-with-examples/ –

+2

你应该去通过Java教程至少要熟悉基本的语言语义。 –

+0

@AndrewLi不幸的是,这篇文章的答案并不真正有帮助。 – xlxs

回答

11

你必须有两个独立的问题:

System.out.println(ki);//Here I would expect to print the objects name something like [email protected] but this didn't happen. 

因为Integer overrides toString。它的实现:

public String toString() { 
    return String.valueOf(value); 
} 

嗯......还是因为println(int) exists on PrintStream

没有,它调用System.out.println(Object),然后在对象上使用toString。这是因为(如specification告诉我们的)规则是首先尝试找到没有自动(非)装箱和没有可变参数的匹配签名;然后只是自动(联合)拳击,然后与两个。

ki=3;//Here I would expect an error but this actually works. 

这是因为autoboxing:Java编译器插入必要的代码,以采取原始3并为它创建一个Integer实例。它实际上发出的字节码做到这一点:

ki = Integer.valueOf(3); 
+0

如果我正确的话Integer是最终的类。最终类的方法可以被覆盖吗? – xlxs

+0

@xlxs:你说得对,它是'最后',不是,最后一堂课的观点是它不能被分类;因为只有子类可以覆盖方法,所以最终类的方法不能被覆盖。 'Integer'覆盖'Object'的'toString'('Number'在它们之间,但不会覆盖'toString'),但是Integer的'toString'不能被覆盖,因为它不能被覆盖子类。 –

+0

感谢您的帮助:) – xlxs

相关问题