我想知道当我执行以下操作时输出到底是什么。
class Data {
int a = 5;
}
class Main {
public static void main(String[] args) {
data dObj = new data();
System.out.println(dObj);
}
}
我知道它提供了与object相关的东西,因为我的输出是 data @ 1ae73783 。我猜 1ae73783 是十六进制数。我也做了一些工作并打印
System.out.println(dObj.hashCode());
我得到了号码 415360643 。我有一个整数值。当我将 1ae73783 转换为十进制时,我不知道hashCode()
还是出于好奇,我得到 415360643 !
这就是为什么我很好奇这个数字到底是什么。这是Java沙盒的一些内存位置还是其他一些东西?
答案 0 :(得分:17)
您的课程的默认toString()
方法会被使用,会发生什么。该方法定义如下:
类
toString
的{{1}}方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”和无符号的十六进制表示形式组成。对象的哈希码。换句话说,此方法返回一个等于值的字符串:Object
默认hashCode()
方法返回的值是特定于实现的:
尽可能合理,类
getClass().getName() + '@' + Integer.toHexString(hashCode())
定义的hashCode
方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术。)
答案 1 :(得分:3)
当您打印类的实例时,它不会覆盖toString
方法,而是使用toString
类的Object
方法。其中以下列形式打印输出: -
data@1ae73783
output
的第一部分显示了对象的类型。
第二部分是hashCode
的十六进制表示
你的对象。
以下是Object.toString()
方法的源代码,您可以在jdk
文件夹下的src
的安装目录中找到: -
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
答案 2 :(得分:3)
Object
课程中的hashCode()和toString()的Javadoc应该能够为您澄清这一点。
答案 3 :(得分:2)
该代码调用toString()
类的默认Object
实现,即:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}