java多态的是一个比较抽象的概念,虽然感觉懂了但是一直不能讲清楚,偶然发现一段比较容易理解多态的代码,可以体现出多态的优势,在这里记录分享总结一下。
什么是多态
多态形式
多态性,是面向对象中最重要的概念,在Java中的体现形式是:父类的引用指向子类的对象。
什么是多态?
多态是同一个行为具有多个不同表现形式或形态的能力。
多态中成员访问特点
方法调用:编译看左边,运行看右边。
变量调用:编译看左边,运行也看左边。(多态侧重行为多态)
多态的前提和体现
有继承/实现关系
有方法重写
有父类引用指向子类对象
优势和使用场景:
在多态形式下,右边对象可以实现组件化切换,
举个例子
 //定义一个Animal类
 class Animal {
     //Animal有一个跑的方法
     public void run() {
         System.out.println("Animal会跑");
     }
 }
 //定义一个Animal的子类,猫类
 class Cat extends Animal {
     @Override
     public void run() {
         System.out.println("Cat会跑");
     }
 
     //写一个Cat特有的方法
     public void eatFish() {
         System.out.println("Cat正在吃Fish");
     }
 }
 
 //写一个测试类
 public class Test {
     public static void main(String[] args) {
         //我们创建一个Cat对象并执行他的run方法是肯定没问题的
         Cat cat = new Cat();
         cat.run();
         //多态的形式我们可以用一个Animal的变量去接受一个Cat对象
         Animal animalCat = new Cat();
         animalCat.run();
     }
 }
 
	 
可以看到虽然我们用Animal去接受了一个Cat类,但是调用run方法时执行的是Cat重写的run方法而不是Animal的run方法
优势
便于扩展和维护。可以实现类与类之间的解耦。
劣势:
多态下不能使用子类的特有功能
下面介绍一个容易理解的应用场景
需求:
创建一个Person、Student、Teacher三个类,Person是父类并且实现Comparable接口并重写compareTo方法,Student和Teacher是Person的子类。
创建一个测试类在测试类中写一个比较年龄的静态方法。
写一个Person类并实现Comparable重写compareTo方法
 public class Person implements Comparable<Person> {
     private String username;
     private int age;
 
     public String getUsername() {
         return username;
     }
 
     public void setUsername(String username) {
         this.username = username;
     }
 
     public int getAge() {
         return age;
     }
 
     public void setAge(int age) {
         this.age = age;
     }
 
     @Override
     public String toString() {
         return "Student{" +
                 "username='" + username + '\'' +
                 ", age=" + age +
                 '}';
     }
 
     @Override
     public int compareTo(Person o) {
         return this.age-o.age;
     }
 }
写一个Student类继承Person类
 public class Student extends Person {
 }
写一个Teacher类继承Person类
 public class Teacher extends Person{
 }
写一个测试类并且在测试类中写一个静态的年龄比较方法
 public class Test {
     public static void main(String[] args) {
         //创建一个Student对象
         Student student = new Student();
         student.setUsername("小明");
         student.setAge(20);
 
         //创建一个Teacher对象
         Teacher teacher = new Teacher();
         teacher.setUsername("刘老师");
         teacher.setAge(35);
 
         Comparable maxAge = getMaxAge(student, teacher);
         System.out.println(maxAge);
 
     }
 
     //创建一个静态的比较年龄的方法
     //传入两个Comparable实现类对象
     //返回一个Comparable实现类对象
     public static Comparable getMaxAge(Comparable a, Comparable b){
         int result = a.compareTo(b);
         //如果result<0,则c1比c2小;
         //如果result>0,则c1比c2大;
         //如果result==0,则c1和c2一样大;
         if (result>=0){
             return a;
         }else{
             return b;
         }
     }
 }
执行结果
	 
这个年龄的比较方法就使用了多态的形式,我们可以传Student类Teacher类,只要两个被比较的类都属于同一个父类,那么就可以直接调用这个静态方法比较。