多态的定义是:
同一操作作用于不同类的实例(即对象),将产生不同的执行结果,即不同类的对象收到相同的消息时,得到不同的结果。
多态性包含 编译时的多态性 及 运行时的多态性两大类,即多态性也分静态多态性和 动态多态性 两种。
静态多态性 是指:定义在一个类或一个函数中的同名函数,他们根据 参数表(类型 以及个数)区别语义和执行的功能。
动态多样性是指定义在一个类层次的不同类中的重载函数,他们具有相同的函数原型,需要根据指针指向的对象所在类来区别语义,他通过动态动态联编实现。java从多个方面支持多态性,一方面可以通过方法重载实现,另一方面也可以通过继承过程中出现的方法覆盖以及对象转换类型(父类引用指向子类对象)来实现。
1.方法重载【一个类中】(Overloading)和方法覆盖【子类和父类】(Overriding重写)
方法重载 和 方法覆盖 是实现多态性的基本手段,但两者的机制不同。
方法重载 是指一个类中可以有多个方法具有相同的名字,但这些方法的参数不同(类型不同,或个数不同)。
方法覆盖 是指子类的方法名与父类的方法名完全相同,并且返回值类型,入口参数的个数和类型玩全相同,即在子类中重写了父类的同名方法。(只有方法体不同)。
2.运行时动态
【例5-18】
package com.ch5;
public class Ex5_18_Convert {
public static void main(String[] args) {
Lady missliu = new Lady();
missliu.pet = new Dog2();
missliu.petEnjoy();
System.out.println("++++++++++++++++++++++++");
Lady missWang = new Lady();
missWang.pet = new Bird();
missWang.petEnjoy();
}
}
class Lady{
Pet pet;
void petEnjoy(){
pet.enjoy();
}
}
class Pet{
int name;
Pet(){
System.out.println("Pet() 构造方法执行完毕。。。。。。。。。。");
}
void enjoy(){
System.out.println("宠物高兴");
}
}
class Bird extends Pet{ // 方法覆盖
void enjoy(){
System.out.println("渣渣.......");
}
}
class Dog2 extends Pet{ // 方法覆盖
void enjoy(){
System.out.println("汪汪.......");
}
}
结果:
以上程序中,Lady类的成员变量pet 是父类对象。missLiu.pet父类引用指向了子类对象(一个鸟的实例对象),missWang.pet父类引用也同样指向了子类对象(一个狗的实例对象)。此时,父类引用指向子类对象,java只能在运行时根据父类引用的具体指向,选择不同类的方法,实现了用相同的接口完成不同功能,实现了多态性。
由此可以看出,多态性提高了程序的灵活性和编程的效率,程序员可以使用统一的形式实现不同功能的调用,简化了对应用软件的代码编写和修改过程。