多态与重写
多态中父类如何调用子类方法
public class test {//test类
public static void main(String[] args) {
Animal animal = new Cat();//创建Cat对象,编译类型为Animal
animal.eat();//调用Cat对象的eat()方法,成功
//animal.sleep();//调用cat对象的sleep()方法,报错
}
}
class Animal {//Animal父类
String name;
public void eat(){
System.out.println("动物吃东西。。。");
}
}
class Cat extends Animal {//Cat子类
public void eat(){//重写Animal父类的eat()方法
System.out.println("猫咪吃东西。。。");
}
public void sleep(){
System.out.println("小猫睡大觉。。。");
}
}
分析
编译器在编译Animal animal = new Cat()时,编译的类型是Animal,所以会在方法区加载Animal的成员方法cry(),所以在编译器中animal对象所能调用的方法只有cry()
在运行时animal指向的对象是Cat()对象,当想调用cry()方法时,会从子类Cat中开始寻找方法区Cry()方法,如果找到了同名方法则执行,找不到就向上寻找父类中的同名方法。所以会执行Cat类中的cry()方法。
当想调用Cat类中的sleep()方法时,由于编译Animal类时方法区并没有sleep(),所以会提示无法解析Animal类中的sleep()方法。
编译和运行的情况不一致,头大;
结论在多态中想要调用子类成员方法就必须在父类中声明同名方法,要求返回值、函数名、形参列表完全相同。或强转一下父类类型((Cat) animal).sleep();