假设我有一个自定义类,比如Test。
Test test = new Test(); // test is the reference.
现在,当我打印test的值时,它返回哈希码。
现在考虑,
Integer i = new Integer(10);
当我打印i
的值时,它返回10.
有人可以帮我理解这里的区别究竟是什么?我相信它们都是对象引用,但对于包装类引用,它返回它指向的对象的值。
答案 0 :(得分:0)
创建新类时,它会从toString()
继承方法Object
。 Integer
类重写该方法以返回内部值。
答案 1 :(得分:0)
打印时,会隐式调用toString()方法。
默认情况下(在Test类中)它使用Object类中的一个。对于Integer,它将Integer转换为10-base的字符串。
答案 2 :(得分:0)
您的Test类正在使用Object类的toString()方法来打印hashCode。但对于Integer类,toString方法被覆盖。你可以看到Integer.java here
答案 3 :(得分:0)
用户定义的引用是一个对象,如果你打印该对象意味着你可能会得到一些哈希代码,因为每个类都扩展了Object类,所以你也有了属性(方法)tostring()。
Wrapper类包装其各自的原始数据类型 整数i = new Integer(10); 和 I = 10; 价值相同。
答案 4 :(得分:0)
当您致电System.out.println(Object)
(或更一般地说,PrintStream.println(Object)
)时:
此方法首先调用String.valueOf(x)
如果参数为null,则字符串等于“null”;否则,返回
obj.toString()
的值。
您的任何对象都不是null
,因此调用实例的toString()
方法。
如果是Integer
:
该值将转换为带符号的十进制表示形式并以字符串形式返回
对于Test
,除非您明确覆盖它(或超类已覆盖它),否则您将调用Object.toString()
:
[T]他的方法返回一个等于值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
如果这不是所需的行为,请覆盖toString()
中的Test
:
class Test {
@Override public String toString() {
// ... Your implementation.
}
}
答案 5 :(得分:0)
每当您打印对象时,Java都会调用toString()
方法。 Object Class中可用的toString()
的默认实现。 Object是java中所有Object的基类。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
它将使用完整的包路径@和对象的HashCode打印类Name。
测试类不会覆盖toString()
方法。但是java中的所有包装类都会覆盖toString()
。所以当你调用Integer方法时,它会调用在Integer类中实现的toString()。