-4

在java中,如果我们考虑一个类A,我们通过编写来创建它的对象

A aObj = new A();

其中 aObj 是参考变量。

  1. 打印这个引用变量会打印它引用的对象的地址吗?
  2. 与 C 的情况一样,可以在引用变量上使用“&”运算符来打印它们的地址吗?

谢谢!

4

4 回答 4

4

打印对象将调用 toString() 方法。如果你不在你的类中重写这个方法,它会打印 ClassName@hashcode

于 2013-05-07T10:49:15.317 回答
1

如果您没有覆盖对象类中的toString()方法,它将调用Object该类中定义的默认实现,即:

类 Object 的 toString 方法返回一个由名称组成的字符串
对象是实例的类,at 符号字符“@”,以及
对象哈希码的无符号十六进制表示。

因此,您将获得 Object 的hashCode()表示,它可能是也可能不是它的地址,因为它取决于实现。这就是 Javadoc 所说的hashCode()

尽可能合理地使用 Object 类定义的 hashCode 方法
确实为不同的对象返回不同的整数。(这通常是
通过将对象的内部地址转换为整数来实现,
但是 JavaTM 编程不需要这种实现技术
语)。
于 2013-05-07T10:55:18.620 回答
0

打印对象将对对象调用 toString(),如果该对象没有覆盖 toString(),则返回一个类似于 ClassName@Hexadecimal_Representation_Of_Hash_Code 的字符串

对于 Test 类,输出将类似于:

Test@126b249

hashCode 不一定是内存地址,并且是特定于实现的。

于 2013-05-07T10:51:28.077 回答
0

当你这样做时

System.out.println(objReference)

调用 toString() 实现。如果您已覆盖它,则默认情况下将调用您的实现,否则将调用 Object toString() 实现,该实现将打印该对象的 hashCode

如果您查看 String 类,它会覆盖 toString 方法,这就是为什么何时做

 System.out.println(stringObjectReference)

在这里查看实现 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java#String.toString%28%29

对象引用不是打印对象包含的实际值。

于 2013-05-07T10:55:26.120 回答