class Rodent{
public void eat(){
System.out.println("Rodent.eat()");
drink();
}
public void drink(){
System.out.println("Rodent.drink()");
}
}
class Mouse extends Rodent{
public void drink(){
System.out.println("Mouse.drink()");
}
}
public class DuotaiTest {
public static void main(String[] args){
Rodent m = new Mouse();
m.eat();
}
}
其结果是:Rodent.eat()
Mouse.drink()
解释一下该代码是如何运行的,为什么会出现上述结果? 作者: 坚持远方 时间: 2012-11-22 17:06
class Rodent{
public void eat(){
System.out.println("Rodent.eat()");
drink();
}
public void drink(){
System.out.println("Rodent.drink()");
}
}
class Mouse extends Rodent{//该类继承了Rodent类,所以就继承了他的eat方法,可是该类重写了drink
//方法,所以运行时按子类重写后的方法输出,因为eat方法调用了drink方法,所以就输出Rodent.eat()Mouse.drink()
public void drink(){
System.out.println("Mouse.drink()");
}
}
public class DuotaiTest {
public static void main(String[] args){
Rodent m = new Mouse();
m.eat();
}
}作者: 金鑫 时间: 2012-11-22 17:09
多态中成员函数的特点
编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失败。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译看左边,运行看右边。
1、 因为多态中 Rodent m = new Mouse();父类指向了子类对象,也就是说将子类对象提升为了父类对象。
2、 m.eat(); 提升为父类对象后,调用eat()方法。因为父类中也定义了eat()方法,所以编译通过,如果父类中没有定义该方法,就会编译失败。即所谓的编译看左边,左边即父类。
3、 因为m被提升为父类对象,m.eat()也是调用父类中的方法,但是为什么输出的是Mouse.drink()而不是Rodent.drink()。
愿意很简单,因为子类中也定义了同名的drink()方法,发生了函数的覆盖,子类覆盖了父类中的同名函数,所以运行的是子类的函数,也就是所说的运行看右边,因为右边是子类。