以下是代码:
class Cleanser{
private String s="Cleanser";
public void append(String a){s+=a;}
public void dilute(){append(" dilute()");}
public void apply(){append(" apply()");}
public void scrub(){append(" scrub()");}
public String toString(){
return s;
}
public static void main(String []args)
{
Cleanser x=new Cleanser();
x.dilute();x.apply();x.scrub();
System.out.println(x);
}
}
public class Exercise_6_L2 extends Cleanser
{
public void scrub(){
append("Deter.scrub()");
super.scrub();
}
public void foam(){append("form()");}
public static void main(String []args)
{
Exercise_6_L2 x=new Exercise_6_L2();
// x.dilute();        // 1
// x.apply();         // 2 
// x.scrub();         // 3 
// x.foam();          // 4 
System.out.println(x);         //  5
System.out.println("Test");
Cleanser.main(args);
}
}
以下是1,2,3,4处代码未注释的结果:D:\my java>javac Exercise_6_L2.javaD:\my java>java Exercise_6_L2
Cleanser dilute() apply()Deter.scrub() scrub()form()
Test
Cleanser dilute() apply() scrub()问题是:标记为5处输出的结果不是应该为对象x的地址吗,怎么会输出这个呢:Cleanser dilute() apply()Deter.scrub() scrub()form()
还有如果把1,2,3,4处代码都注释掉,结果为:Cleanser
Test
Cleanser dilute() apply() scrub()我又不解啦,为什么会把Cleanser给输出呢,请教啊,小弟是Java新手,请看到的都多多少少帮帮忙,先谢谢啦

解决方案 »

  1.   

    不是,System.out.println()参数为字符串时,会输出字符串,这个没有问题吧。一般所有的类都继承自Object类,也就是都继承toString()方法,调用System.out.println()时,参数是对象时,会自动调用对象的toString方法(也就是不用显式调用,java虚拟机会自动加上),因此,一般有字符串的对象都要重写toString()方法。再有,照你理解的那样,System.out.println("Test")中的“Test”也是一个String对象,为什么没有输出地址值而是字符串呢,就是这个原因。而有的时候参数为对象时没有输出字符串,是因为没有重写toString()方法,直接调用了父类的方法,而object中的该方法返回的是类名加类实例的哈希码。
      

  2.   

    还有,之所以会有Cleanser,是因为继承的原因,学习java最好要理解继承,相信你那儿应该有参考书的,学习一下吧。面向对象三个特性,继承,封装,多态,都要好好学习的,这是面向对象语言对面向过程语言来说的最大改进。