多态:就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
多态分为两种:
1. 编译时多态:方法的重载;
2. 运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态);
面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。
多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。
多态的好处
1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
多态的实现方式:
方式一:重写:
方式二:接口
方式三:抽象类和抽象方法
以上来自百度
多态例子:
public class Main { public static void main(String[] args) { Animal animal1 = new Dog();// 向上转型 ,父类引用指向子类对象 Animalfoog(animal1); Animal animal2 = new Cat();// 向上转型 ,父类引用指向子类对象 Animalfoog(animal2); } //根据传入的不同的类来实现不同的方法,这就是多态的精髓 public static void Animalfoog(Animal animal) { animal.eat(); } } class Animal { public void eat() { } } class Dog extends Animal { /** * 重写父类的方法 */ public void eat() { System.out.println("狗吃骨头"); } public void look(){ System.out.println("看门"); } } class Cat extends Animal { /** * 重写父类的方法 */ public void eat() { System.out.println("猫吃鱼"); } }
结果:
在Animalfoog()方法中调用eat(),此时在代码的编译阶段,animal调用的仍然是自己的eat(),不是猫狗的。而当程序运行时,animal调用的却是猫或者狗的eat()。这个动态的过程就是多态 。
父类引用子类的对象,但是不可以用子类特有的方法,例如这个例子中Animal animal1 = new Dog();animal1不可以使用子类特有的look()的方法。如果类被final修饰后是不可以被继承的