例程:
/**
* 测试多态
* @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();
}