日期:2014-05-20  浏览次数:20693 次

一个奇怪的调用(新手求助)
程序如下:
class A
{
String name;
A(String name)
{
this.name=name;
}
public String toString()
{
return name;
}
}

public class aaa
{
public static void main(String args[])
{
A b=new A("c");
System.out.println(b);
}
}
结果是输出:c
很奇怪在运行到System.out.println(b)时,程序会调用class A里的成员函数toString().这是什么原理? 并且为什么会输出c而不是b?请高手帮忙解释一下,十分感谢

------解决方案--------------------
因为A是Object类的子类,调用的是System.out.println()这个方法
 public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
而String.valueOf(Object x)是
 public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
这里调用了toString()方法,所以输出是c
------解决方案--------------------
一个类即使不写extends父类,它也缺省继承Object类,也就继承了Object类的方法toString(),Object类的方法toString()返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。
即使你的class A中不写toString()方法,由于继承的关系,你打印System.out.println(b); 这里面的b也会调用Object类的方法toString();
现在你重写了toString()方法,System.out.println(b); 里的b就会调用A类的方法toString(),

b只是个引用变量,当你new A("c"); "c"作为实参传给构造函数A(String name){},而this.name=name;等号左边的name是属性name,等号右边的name是入参String name里的 name,也就是c
System.out.println(b); 等价于System.out.println(b.toString()); 方法toString里的返回值是name。要是还不明白,LZ需要多学习构造和继承了。