程序如下:
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?请高手帮忙解释一下,十分感谢

解决方案 »

  1.   

    Because you rewrite the method: toString().If you change toString() to this:
    public String toString() 

    return "Happy National Day!!!"; 

    System.out.print(b);---> "Happy National Day!!!" will be printed...
      

  2.   

    因为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
      

  3.   

    "并且为什么会输出c而不是b?"Why do you ask this question?
      

  4.   

    System.out.println(Object obj)这个函数被调用时会自动调用obj的toString()方法输出该对象的String形式。也就是:
    System.out.println(obj.toString())进行输出
      

  5.   

    就是上楼所说的那样,当你调用System.out.println(b)的时候,实质调用的是System.out.println(b.toString()),而toString()函数返回的就是你传如的"c" 。看看方法的重写,你都会明白的
      

  6.   

    一个类即使不写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需要多学习构造和继承了。
      

  7.   

    顶,LZ要看书哦!System.out.println(b);  这是输出引用而不是"b",OK?直接输出对象应用就会去调用toString()方法了。