java中,Object类的toString方法的调用机制,高手请进。
我们知道,System.out.println(对象),在当前对象中,没有覆盖toString方法的情况下,这语句可以打印出该对象的类名,哈希码等等。其中out对象是Pr...
我们知道,System.out.println(对象),在当前对象中,没有覆盖toString方法的情况下,这语句可以打印出该对象的类名,哈希码等等。其中out对象是PrintStream类型,PrintStream类中的print、println等类似方法并没有发现调用了对象的toString方法。到目前为止,我查看源代码,没有看到这样的显式调用,那么问题是,难道编译器自动地去调用toString方法吗?
希望回答者能够引用源码来证明toString()被显式调用。 如果有好的回答,我会加分的 展开
希望回答者能够引用源码来证明toString()被显式调用。 如果有好的回答,我会加分的 展开
3个回答
展开全部
这个问题其实比较简单的,大家可以直接看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()的最终根源。
现在的问题是,当用户调用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()的最终根源。
追问
你分析十分有道理。。受教了,谢谢
展开全部
当一个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 { }
}
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
展开全部
隐式调用,子类调用父类的方法,因此正常情况下省略
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询