今天看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方法的实现。
我自己分析的是这样的,希望大神给出指点。。。