一,概念:
多态:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)。
通俗的说法:所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性
二,多态发生的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象(向上转型)
三,代码示例
//建一个animal类
class Animal{
public void eat(){
System.out.println("动物吃饭");
}
}
//建一个cat类,继承自animal类,并重写eat方法
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public void CatchMouse(){
System.out.println("猫抓老鼠");
}
}
//建一个dog类,继承自animal类,并重写eat方法
class Dog extends Animal{
public void eat(){
System.out.println("狗吃骨头");
}
}
//假如现在需要创建一个猫对象和一个狗对象并使用eat方法,如果不使用多态 ,常规思路:
class Demo_Animal{
public static void main(String[] args) {
Cat c1=new Cat();
Dog d1=new Dog();
c1.eat();
d1.eat();
}
}
//当同一类对象都要使用eat方法时,要大量的调用eat方法,显然这样写代码冗余,我们可以先优化一下创建对象和调用方法的过程,把创建对象和调用方法的过程提取成为一个方法,同一类调用同一个方法传入不同参数即可
class Demo_Animal{
public static void main(String[] args) {
Cat c1=new Cat();
Dog d1=new Dog();
method1(c1);
method2(d1);
}
public static void method1(Cat c){
c.eat();
}
public static void method2(Dog d){
d.eat();
}
}
//这个时候,如果有十个,百个类,猫,狗,猪,牛,羊........我们每次都需要写一个对应的method,这样是不现实的,因
此我们需要进一步优化,使用多态,把父类当做形参
class Demo_Animal{
public static void main(String[] args) {
method(new cat());
method(new dog());
}
public static void method(Animal a){
//此时父类的引用为a,当子类调用这个方法是,就将子类对象让父类引用a引用了,此时就发生了向上转型,当调用父类的eat方法时,而子类已经重写了eat方法,就会发生动态绑定,从而调用子类自己的eat方法,
a.eat();
}
}
//最终就实现了,同一个类,做出了不同的表现,即多态
四,多态的优点和缺点
优点:
- 减耦合
- 增强可以替换性
- 可扩展性
- 灵活性等...
缺点:
因为要有继承关系,同时发生向上转型,父类引用只能访问父类的方法,无法访问子类独有的方法。