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