在第六章重用类中,看到程序如下:
class Soap{
private String s;
Soap(){
System.out.println("Soap()");
s = new String("Constructed");
}
public String toString(){
System.out.println("this is father's toString");//我增加的输出
return s;}
}
public class Bath {
private String
s1 = new String("Happy"),
s2 = "Happy2",
s3,s4;
private Soap castille;
private int i;
private float toy;
public Bath(){
System.out.println("Inside Bath()");
s3 = new String("toy");
i = 47;toy =3.14f;
castille = new Soap();
}
public String toString(){
if(s4 == null)
s4 = new String("Joy");
return 
"s1 = " + s1 + "\n" + 
"s2 = " + s2 + "\n" +
"s3 = " + s3 + "\n" +
"s4 = " + s4 + "\n" +
"i = " + i + "\n" + 
      "toy = " + toy + "\n" +
"castille = " + castille;
}
public static void main(String[] args){
Bath b = new Bath();
System.out.println(b);
}
}
文中解释到:“每一个基本类型的对象都有一个toString()方法,而且当编译器需要一个String而你却只有一个对象时,该方法就会被调用”
问题:主方法中输出b对象,当然会自动调用子类的toString()方法,可是为什么父类的toString()方法也会被自动调用并输出。
根据我的了解,确实在程序执行时,子类会自动调用父类的构造方法,对父类的成员变量进行初始化和存储空间的分配,可是也没有理由调用toString()方法啊,更没有像主方法那样的输出类对象,自动执行toString()方法的机会。

解决方案 »

  1.   

    因为你子类的toString方法return的时候有+castille,这里有字符串的连接,会调用castille的toString,就是父类的toString方法了
      

  2.   

    对,System.out.println(obj)和 "dddd"+obj
     这两个地方java都会做自动类型转换。也就是通过调用它的toString()函数,转换成String
      

  3.   

    楼主这根本不是什么父类和子类的问题啊,你的Bath又没有继承Soap,
    只是Bath类域中有一个是Soap类型,它用toString当然用自己类的啊