-5

关于参考变量,下列哪项是正确的?

(i) 打印引用不会打印它引用的对象的地址

(ii) 打印引用将打印它所引用的对象的地址

(iii) & 运算符不能用于引用变量来打印它们的地址

(iv) & 运算符可用于引用变量以打印其地址

答案:i 和 iii

但根据我的说法,reference 是一个指向对象地址的指针。所以当它直接打印时,它应该打印该对象的地址,并且使用 & 和引用变量将打印它自己的地址。

4

2 回答 2

3

当您使用System.out.print()打印对象引用时。它在内部String.valueOf(object)用于打印对象。String.valueOf(object)内部调用方法,如果您没有在类中覆盖该object.toString()方法,该方法将调用类中定义的toString()的默认实现。ObjecttoString()

根据 Javadocs ,

Object 类的 toString 方法返回一个字符串,该字符串由对象作为其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示形式组成。

现在,如果您查看 Javadocs 的hashCode(),它会说

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

因此,您实际上并没有打印所引用对象的地址。

其次,&只是一个按位与运算符。它对它所操作的两个操作数的各个位进行“与”运算您不能在单个对象引用变量上使用它。请参阅Java 教程以了解有关使用&运算符的更多信息。

于 2013-05-26T08:30:24.147 回答
2

因此,您似乎不同意该多项选择答案的给定答案。考虑一下:

String s = "Hello world.";
System.out.println(s);

sis of type String,它是一个类,在Java中是一个引用类型。然而,当您打印时s,您会打印出字符串,而不是地址。所以,(i)是真的,而不是(ii)。

关于&运营商,有些事情你需要了解。

  • 首先,对对象的引用并不意味着指向对象的指针。它可以(理论上)是一个双指针,它可以是一个带有偏移量的三重指针,或者其他任何东西,只要它通过某种特定的约定引用该对象。当然,最简单的约定是直接指向对象的指针,但 Java 语言不会费心把它拼出来(据我所知),因为它是一个实现的东西。
  • Java 是与 C 和 C++ 不同的语言,因此它为运算符定义了自己的语义。因此,简单地说,在 Java 中,&不是“地址”运算符,因为语言设计者已经这样定义了它。无论引用是否实现为简单指针,都没有“地址”运算符。当然,这背后的理念是避免指针算术和内存安全。

所以,再次,它是(iii)而不是(iv)。

于 2013-05-26T08:21:43.680 回答