打印引用变量不打印对象的地址
对于参考变量,以下哪一项为TRUE?
(i)打印参考不会打印它所引用的对象的地址
(ii)打印参考文件将打印其引用的对象的地址
(iii)&操作符不能用于参考变量以打印其地址
(iv)&运算符可用于参考变量以打印其地址
答案:我和iii
但据我所知,引用是一个指向对象地址的指针。 因此,当它直接打印时,它应该打印该对象的地址,并使用&with reference变量将打印自己的地址。
使用System.out.print()打印对象引用时。 在内部,它使用String.valueOf(object)
来打印对象。 String.valueOf(object)
内部调用object.toString()
方法,如果你没有覆盖类中的toString() ,它将调用Object
类中定义的toString()的默认实现。
根据Javadocs,
类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@”以及对象的哈希码的无符号hex表示组成。
现在,如果你查看hashCode()的Javadocs,它说
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。 ( 这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术。 )
因此,您实际上并不打印引用的对象的地址。
其次, &
只是一个按位AND运算符。 它对它操作的两个操作数的各个位进行AND运算 。 您不能在单个对象引用变量上使用它。请参阅Java教程以了解有关使用&
运算符的更多信息。
所以,你似乎不同意那个多项选择答案的答案。 考虑一下:
String s = "Hello world."; System.out.println(s);
s
是String
类型,它是一个类,它是Java中的引用类型。 然而,当你打印s
,你会得到打印s
字符串,而不是地址。 所以,(i)是真的而不是(ii)。
关于&
运算符,您需要了解一些事项。
- 首先,对对象的引用并不意味着指向对象的指针。 它( 理论上 )可以是双指针,它可以是带有偏移量的三指针,或者其他任何东西,只要它通过某种特定约定引用对象。 当然,最简单的约定是指向对象的直接指针,但Java语言并不打算拼写出来(据我所知),因为它是一个实现的东西。
- Java是一种与C和C ++不同的语言,因此它为运算符定义了自己的语义。 所以,简单地说,在Java中,
&
不是“地址”运算符,因为语言设计者已经这样定义了它。 没有“地址”运算符,无论引用是否实现为简单指针。 当然,这背后的哲学是避免指针算术和内存安全。
所以,再次,它是(iii)而不是(iv)。