Java継承に関する小さな質問です...

1435 ワード

今日Javaプログラミングの思想を見ていると、実行の結果は自分が考えているのとは全然違います.まずコードを貼ってください.
//CanFight  
interface Canfight {
    void fight();
}
//ActionCharacter 
class ActionCharacter {
    public void fight() {
        System.out.println("Fight from ActionCharacter");
    }
}
//Hero   ActionCharacter   Canfight  
class Hero extends ActionCharacter implements Canfight {
    public void swin() {}
    public void fly() {}
}

public class Adventure {
	//   Canfight,    ,  fight  
    public static void t(Canfight x) {
        x.fight();
    }
    //   ActionCharacter  ,    ,  fight  
    public static void w(ActionCharacter x) {
        x.fight();
    }

    public static void main(String[] srgs) {
        Hero h = new Hero();
        t(h);
        w(h);
    }
}

/*    
 Fight from ActionCharacter
 Fight from ActionCharacter
 */
 

 mainメソッドでは、tメソッドを呼び出すと、HeroのオブジェクトhがCanfightに変換され、Canfightのfightメソッドが呼び出されますが、fightメソッドは具体的に実装されていないため、出力やコンパイラエラーは発生しないと思います.
 
実際の結果、HeroはActionCharacterを継承し、実行時にHeroのActionCharacterで使用できるものをすべてActionCharacterにコピーすることで、ActionCharacterクラスでfightメソッドの具体的な実装が可能になります.別の観点から,ActionCharacterクラスにはインタフェースCanfightにおけるfightメソッドの実装がある.
 
私自身が分析したのはこのようなので、大神が指摘してくれることを望んでいます.の