8

当我执行以下操作时,我想知道输出到底是什么。

class Data {
  int a = 5;
}

class Main {
  public static void main(String[] args) {
    data dObj = new data();
    System.out.println(dObj);
  }
}

我知道它给出了与对象相关的东西,因为在我的例子中输出是data@1ae73783。我猜1ae73783是一个十六进制数。我也做了一些工作并打印了

System.out.println(dObj.hashCode());

我得到了号码415360643。我得到一个整数值。我不知道hashCode()返回什么,仍然出于好奇,当我将1ae73783转换为十进制时,我得到了415360643

这就是为什么我很好奇这个数字到底是什么。这是Java沙箱的某个内存位置还是其他东西?

4

4 回答 4

18

发生的事情是你的类的默认toString()方法正在被使用。该方法定义如下:

class的toString方法Object返回一个字符串,该字符串由对象作为实例的类的名称、at 符号字符“@”和对象的哈希码的无符号十六进制表示形式组成。换句话说,此方法返回一个等于以下值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())

hashCode()默认方法返回的值是特定于实现的:

在合理可行的情况下,hashCode类定义的方法Object确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但 JavaTM 编程语言不需要这种实现技术。)

于 2012-11-21T16:56:21.397 回答
4

当您打印类的实例时,它不会覆盖该toString方法,然后使用类的toString方法Object。它以以下形式打印输出:-

data@1ae73783
  • 第一部分output显示对象的类型。

  • 第二部分是hashCode 对象的十六进制表示。

这是方法的源代码Object.toString(),您可以在您的安装目录jdk下的src文件夹中找到:-

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
于 2012-11-21T16:57:38.820 回答
3

类中hashCode()toString()的JavadocObject应该能够为您阐明这一点。

于 2012-11-21T16:59:01.567 回答
2

该代码调用该类的默认toString()实现Object,即:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
于 2012-11-21T16:58:55.863 回答