我在看Thinking in Java的接口部分,遇到一个例子,不太好理解,特向各位请教,例子我简化了一下,如下:
interface CanFight {
  void fight();
}
class ActionCharacter {
  public void fight() {}
}class Hero extends ActionCharacter
    implements CanFight{
。。
}public class Adventure {
  public static void t(CanFight x) { x.fight(); }
  public static void w(ActionCharacter x) { x.fight(); }
  public static void main(String[] args) {
    Hero h = new Hero();
    t(h); // Treat it as a CanFight
    w(h); // Treat it as an ActionCharacter
  }

在基类actionCharacter中实现了一个方法fight(),在接口Canfight中也有一个同名的方法fight();
在继承类Hero中并没有实现接口的函数fight();但是为何一个继承类Hero的对象h,却可以但看成是一个接口canfight的对象,并调用fight方法?难道是说只要Hero中有个fight()方法就可以,而不用管它是从哪继承来的?
在书中有这么一段解释“注意,CanFight接口与ActionCharacter类中的fight()方法的签名是一样的,而且,在Hero中并没有提供fight()的定义。接口的规则是:你可以从接口中继承(就像稍后你会看到的那样),但是你得到的只是另一个接口。如果你想创建该新类型的对象,就必须有一个提供了其全部定义的类。即使Hero没有显式地提供fight()的定义,其定义也随ActionCharacter而存在,因此它是被自动提供的,这使得创建Hero对象成为了可能。”我也不太明白其中的含义,谁能给我通俗的解释一下?谢谢

解决方案 »

  1.   

    你Hero类继承了ActionCharacter中的public void fight() {} 方法,因为它是公共的,而Hero同时实现了CanFight接口,意味着它必须实现接口中的方法,由于Hero已经继承了ActionCharacter中的fight()方法,所以它相当于实现了接口CanFight中的fight()方法,也就可以创建Hero的对象了
      

  2.   

    但是为何一个继承类Hero的对象h,却可以但看成是一个接口canfight的对象,并调用fight方法?
    ============
    这就是OO语言的多态性质。[用父类声明,用子类实现]和[用接口声明,用子类实现]都是多态的实现方式!
    难道是说只要Hero中有个fight()方法就可以,而不用管它是从哪继承来的? 
    ============
    你可以不用管它从哪来。但是编译器会选择覆盖该方法。继承父类在前,实现接口在后。
    而如果有2个接口出现类似情况,则以先实现的接口为准!!
      

  3.   

    [Quote=引用 1 楼 gesanri 的回复:]
    你Hero类继承了ActionCharacter中的public void fight() {} 方法,因为它是公共的,而Hero同时实现了CanFight接口,意味着它必须实现接口中的方法,由于Hero已经继承了ActionCharacter中的fight()方法,所以它相当于实现了接口CanFight中的fight()方法,也就可以创建Hero的对象了
    [/Qu]
    正解