2013-05-26 111 views
-4

对于参考变量,以下哪项为真?打印参考变量不打印对象的地址

(ⅰ)打印参考将不打印由它称为对象 的地址

(ⅱ)打印参考将打印通过它称为对象 的地址

(III) &操作者不能对参考变量可以用来打印 其地址

(ⅳ)操作者&可以对参考变量被用来打印他们 地址

答案:根据我I和III

但参考是指向该对象的地址的指针。所以当它直接打印时,它应该打印该对象的地址,并且使用带有参考变量的&将打印它自己的地址。

+6

那你试过了吗?引用是“获得对象的某种方式” - 它不一定是一个原始指针。不,使用'&'与引用类型变量将无法编译。在我看来,你可以自己很容易地验证这两个。 –

+0

我是新来的java和我正在应用c + +概念。 –

+0

@JonSkeet我可以将对象的地址存储在除引用之外的其他变量中吗?如果没有,那么它应该是一个原始指针 –

回答

2

所以,你似乎不同意这个多选答案的给定答案。试想一下:

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

sString类型,这是一类,它是Java中的引用类型。然而,当您打印s时,您会得到打印的字符串,而不是地址。所以,(i)是真实的而不是(ii)。

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

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

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

+0

非常感谢。这是非常详细阐述。 现在你已经提出了一个更多的怀疑,这个双指针和三指针是什么,你说它也可能是双指针或三指针。这是否意味着它应该是一个指针? –

+0

@rakeshkumar他们只是其中的一些例子,理论上它可能是。在Java实践中,它们绝对不是**。 –

+0

好的。不管怎么说,还是要谢谢你... –

3

当您使用System.out.print()打印对象引用。它在内部使用String.valueOf(object)来打印对象。 String.valueOf(object)内部调用object.toString()方法将调用Object类中定义的toString()的默认实现,如果您尚未覆盖班级中的toString()

作为每的Javadoc,

Object类的toString方法返回一个由其中的对象是一个实例,该符号字符'@”的类的名称的字符串,并且无符号对象的哈希码的十六进制表示。

现在,如果你考虑的Javadoc hashCode(),它说

尽可能多是合理可行的,由Object类定义的hashCode方法不会返回不同的整数针对不同的对象。 (这一般是通过将该对象的内部地址转换成一个整数来实现,而不是由的JavaTM编程语言不需要这种实现技巧。

因此,你实际上不打印对象的地址引用。

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