为什么可以在java中"正确"打印Integer对象?

xlx*_*lxs -3 java

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.
Run Code Online (Sandbox Code Playgroud)

System.out.println(ki); 执行然后50出现在控制台但是当我打印其他对象时,像package_name.Class@15db9742这样的东西出现为什么50出现而不是像package_name.Class@15db9742?

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

T.J*_*der 11

那里有两个不同的问题:

System.out.println(ki);//Here I would expect to print the objects name something like package_name.Class@15db9742 but this didn't happen.
Run Code Online (Sandbox Code Playgroud)

因为Integer覆盖toString.它的实施:

public String toString() {
    return String.valueOf(value);
}
Run Code Online (Sandbox Code Playgroud)

嗯...或因为println(int)存在PrintStream.

不,它正在调用System.out.println(Object),然后toString在对象上使用.这是因为(正如规范告诉我们的那样)规则是首先尝试找到一个没有自动(非)拳击而没有varargs的匹配签名; 然后只用自动(非)拳击,然后最后两个.

 ki=3;//Here I would expect an error but this actually works.
Run Code Online (Sandbox Code Playgroud)

这是因为自动装箱:Java编译器插入必要的代码来获取该原语3并为其创建Integer实例.它实际发出的字节码是这样的:

ki = Integer.valueOf(3);
Run Code Online (Sandbox Code Playgroud)