java中,Object类的toString方法的调用机制,高手请进。

我们知道,System.out.println(对象),在当前对象中,没有覆盖toString方法的情况下,这语句可以打印出该对象的类名,哈希码等等。其中out对象是Pr... 我们知道,System.out.println(对象),在当前对象中,没有覆盖toString方法的情况下,这语句可以打印出该对象的类名,哈希码等等。其中out对象是PrintStream类型,PrintStream类中的print、println等类似方法并没有发现调用了对象的toString方法。到目前为止,我查看源代码,没有看到这样的显式调用,那么问题是,难道编译器自动地去调用toString方法吗?
希望回答者能够引用源码来证明toString()被显式调用。 如果有好的回答,我会加分的
展开
 我来答
jell1984
2012-02-28 · TA获得超过665个赞
知道小有建树答主
回答量:236
采纳率:100%
帮助的人:259万
展开全部
这个问题其实比较简单的,大家可以直接看Java中相关类的源代码就可以知道了。
现在的问题是,当用户调用print或println方法打印一个对象时,为什么会打印出对象的toString()方法的返回信息。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
1.这个是Ojbect中的toString()方法,toString会打印出return信息。

public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
-------------------
public void print(Object obj) {
write(String.valueOf(obj));
}
2.这两个方法是System.out.print和println()方法传入一个Object类对象时打印的内容,当然,传入其它类时,同样如此。

3.我们看到,在2中,当要打印一个对象时,会自动调用String.valueOf()这个方法,下面是这个方法的代码:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
Ok!问题解决了,这个方法中,当传入的对象为null时返回一个null,当非null时,则返回这个obj的toString()。
所以,这就是当我们调用print或者println打印一个对象时,它会打印出这个对象的toString()的最终根源。
追问
你分析十分有道理。。受教了,谢谢
froole
2010-09-27 · TA获得超过1341个赞
知道小有建树答主
回答量:570
采纳率:0%
帮助的人:533万
展开全部
当一个Object实例被转化成String时,Java就会自动调用toString()方法返回一个String。
System.out.println标准输出,只能输出String,所以,所有需要输出的Object都会被转化成String。
如果你没有覆盖toString,那么,Java会自动调用最上层父类Object的toString()方法。
其内容如下:
return getClass().getName() + "@" + Integer.toHexString(hashCode());

所以,没有定义toString,并用System.out.println输出实例的时候,会看到类名和哈希码。
---------------------------------------
>希望回答者能够引用源码来证明toString()被显式调用。 如果有好的回答,我会加分的

package java.lang;

public class Object {

private static native void registerNatives();
static {
registerNatives();
}

public final native Class getClass();

public native int hashCode();

public boolean equals(Object obj) {
return (this == obj);
}

protected native Object clone() throws CloneNotSupportedException;

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

public final native void notify();

public final native void notifyAll();

public final native void wait(long timeout) throws InterruptedException;

public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}

if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}

if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
}

wait(timeout);
}

public final void wait() throws InterruptedException {
wait(0);
}

protected void finalize() throws Throwable { }
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2010-09-29
展开全部
隐式调用,子类调用父类的方法,因此正常情况下省略
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式