[英]The difference between passing interface reference and class reference in java
[英]Difference between wrapper class reference and user defines class reference in java
假设我有一个自定义类,例如Test。
Test test = new Test(); // test is the reference.
现在,当我打印test的值时,它将返回hashcode。
现在考虑,
Integer i = new Integer(10);
当我打印i
的值时,它返回10。
有人可以帮助我了解这里的区别是什么吗? 我相信两者都是对象引用,但是对于包装类引用,它返回所指向的对象的值。
创建新类时,它将从Object
继承方法toString()
。 Integer
类重写该方法以返回内部值。
打印时,将隐式调用toString()方法。
默认情况下(在Test类中),它使用一个Object类内部。 对于Integer,它将Integer转换为以10为基数的字符串。
您的Test类使用Object类的toString()方法,该方法打印hashCode。 但是对于Integer类,将重写toString方法。 您可以在这里看到Integer.java
用户定义的引用是一个对象,如果您打印该对象,则意味着您可能会得到一些哈希码,因为每个类都扩展了Object类,因此您还具有tostring()属性(方法)。
包装器类包装各自的原始数据类型Integer i = new Integer(10); 和i = 10; 两者的价值相同。
当您调用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())
如果这不是期望的行为,请在Test
重写toString()
:
class Test {
@Override public String toString() {
// ... Your implementation.
}
}
每当您打印对象时,Java都会调用toString()
方法。 对象类中可用的toString()
的默认实现。 Object是Java中所有Object的基类。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
它将打印带有完整包路径@和对象的HashCode的类Name。
测试类不会覆盖toString()
方法。 但是,java中的所有包装器类都会覆盖toString()
当您调用Integer方法时,它将调用在Integer类中实现的toString()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.