问题又来了
class Cleanser {
  private String s = new String("Cleanser");
  public void append(String a) { s += a; }
  public void dilute() { append(" dilute()"); }
  public void apply() { append(" apply()"); }
  public void scrub() { append(" scrub()"); }
  public void print() { System.out.println(s); }
  public static void main(String[] args) {
    Cleanser x = new Cleanser();
    x.dilute(); x.apply(); x.scrub();
    x.print();
  }
}class Detergent extends Cleanser {
  // Change a method:
  public void scrub() {
    super.append(" Detergent.scrub()");
    super.scrub(); // Call base-class version
  }
  // Add methods to the interface:
  public void foam() { append(" foam()"); }
  // Test the new class:
  public static void main(String[] args) {
    Detergent x = new Detergent();
    x.dilute();
    x.apply();
    x.scrub();  //??这个怎么能知道调用的是Cleanser.scrub()还是Detergent.scrub()
    x.foam();
    x.print();
    System.out.println("Testing base class:");
    Cleanser.main(args); //??这里为什么不能用super.main(args),还有参数args是什么意思
  }
}

解决方案 »

  1.   

    x.scrub();  //??这个怎么能知道调用的是Cleanser.scrub()还是Detergent.scrub()
    多态,调用的是运行时的类型的方法,子类覆盖了父类的,当然调用子类的。 Cleanser.main(args); //??这里为什么不能用super.main(args),还有参数args是什么意
    静态方法怎么用super?
    args是命令行参数
      

  2.   

    x.scrub();  //??这个怎么能知道调用的是Cleanser.scrub()还是Detergent.scrub()
    多态,调用的是运行时的类型的方法,子类覆盖了父类的,当然调用子类的。
    ------------------------------------------------------------------
    如果我想调用Cleanser.scrub()改怎么做?
    谢谢!
      

  3.   

    new的时候用 new Cleanser()
      

  4.   

    构造出一个Cleanser对象,再调用就可以了.
       Cleanser x = new Cleanser();
       x.scrub();
      

  5.   

    编译器会发现我们试图向一个WaterSource添加一个String对象("source =")。呵呵,翻译的真有水准啊,我想原文的意思应当是:"编译器会发祥我们试图将一个 WaterSource 和 一个 String 对象 相加"吧? "add a string object to watersource" 应当是原文吧?没看过的说。
      

  6.   

    是调用的Detergent.scrub(),子类继承了父类,并覆盖了scrub方法。