版权声明: https://blog.csdn.net/li_xunhuan/article/details/88932792
例程: /** * 测试多态 * @author lixunhuan * */
class Animal{
public void shout(){
System.out.println("叫了一声!");
}
}
class Dog extends Animal {
public void shout(){
System.out.println("汪汪汪!");
}
public void watchDoor(){
System.out.println("看门中!!");
}
}
class Cat extends Animal{
public void shout(){
System.out.println("喵喵喵!!");
}
}
public class TestPolym {
public static void main(String[] args){
Animal a1 = new Cat();
animalCry(a1);
Animal a2 = new Dog();
animalCry(a2);
//编写程序时,如果想调用运行时类型的方法,只能进行强制类型转换。
// 否则通不过编译器的检查。
Dog dog = (Dog)a2;//向下需要强制类型转换
dog.watchDoor();
}
static void animalCry(Animal a){
a.shout();
}
}
运行结果: 喵喵喵!! 汪汪汪! 看门中!!
多态的要点: 1.在一个方法中,其定义入口为父类引用对象(指向的是地址),但是输入却是指向了子类引用对象; 2.多态是方法的多态,而不是属性的多态 3.多态三个必要条件::继承,方法重写,父类引用指向子类对象 4.Animal a1 = new Cat();animalCry(a1);和Cat a1 = new Cat();animalCry(a1);实际上是等效的,也就是第一种只是说a1的编译类型为Animal,但是Cat才是运行时的对象类型,所以两者的运行结果是相同的(这也是我的疑问,这改一下就避免5出现的缺点,为何一定要用父类去进行编译?而且真的不影响多态吗?) 5.就是无法调用子类特有的功能,比如,我不能使用父类的引用变量调用Dog类特有的seeDoor()方法,必须要么强制类型转换才能调用,如: Dog dog = (Dog)a2;//向下需要强制类型转换 dog.watchDoor(); 要么,定义的时候将 Animal a2 = new Dog();转化为Dog a2 = new Dog();
6.
7.多态的实现语句: static void animalCry(Animal a){//注意一定要采用父类描述输入引用对象 a.shout(); }