Java三大特性之一 (多态)
什么是多态(核心概念):
多态就是指同一操作,作用于某一类对象,可以有不同的解释,产生不同的执行结果。
(考虑到文字讲解会不会有点抽象,下面用代码来演示更直观些)在写代码前我先说两个死公式(没有为什么,反正就死公式):
(重点一)
多态存在的三个必要条件:
1、需要存在继承关系。 既:子类要继承父类 (结论:继承是实现多态的基础)
2、需要存在实现关系。 既:子类要重写父类的方法 (结论:要有方法的重写)
3、父类引用指向子类对象。 既:(父类) Animal obj = new (子类) Dog (); (结论:父类数据类型的引用指向子类对象)
(重点二)
多态的作用:
1、多态消除了类型之间的耦合关系。
既:Animal obj = new Dog (); 父类 Animal 指向子类 Dog (); 就由 Dog (); 对象来实现 Animal 里面的方法
既:Animal obj = new Cat (); 父类 Animal 指向子类 Cat (); 就由 Cat (); 对象来实现 Animal 里面的方法
总结:父类指向谁就由谁来实现父类里面的方法,类型之间相互独立不受彼此的影响,所以说多态消除了类型之间的耦合关系。
2、多态的存在提高了程序的扩展性和后期的可维护性。
既:Animal obj = new Dog (); 父类 Animal 指向子类 Dog (); 就由 Dog (); 对象来实现 Animal 里面的方法
既:Animal obj = new Cat (); 父类 Animal 指向子类 Cat (); 就由 Cat (); 对象来实现 Animal 里面的方法
总结:父类指向谁就由谁来实现父类里面的方法,不仅提高了代码的扩展性也提高了代码的可维护性。
3、多态通过分离做什么(父类)和怎么做(子类),从另一个角度将接口和实现进行分离。
/**
* 创建一个父类 Animal (动物)
*/
public class Animal {
public void eat(){
System.out.println("动物具有吃的能力");
}
}
/**
* 创建一个子类 Dog (狗)并继承父类 Animal (动物)
*/
public class Dog extends Animal {
@Override
public void eat() { // 子类重写了从父类继承过来的方法
System.out.println("狗具有吃骨头的能力");
}
public void attack() { // attack 是子类独有的方法,不是从父类继承过来的
System.out.println("狗具有攻击的能力");
}
}
/**
* 创建一个子类 Cat (猫) 并继承父类 Animal (动物)
*/
public class Cat extends Animal {
// 子类 Cat 什么都没有,只是单单的从父类继承了所有的东西过来
}
/**
* 主程序类 Test
*/
public class Test {
public static void main(String[] args) {
Animal obj = new Animal(); // 父类的引用指向本类的对象
a.eat(); // 调用的是本类的方法
Animal obj2 = new Dog(); // 父类的引用指向子类的对象
d.eat(); // 调用的是子类重写后的方法(程序会优先调用子类重写过的方法)
// d.attack(); //父类的引用指向子类的对象,不能调用子类独有的方法。只能调用它跟父类有关联的方法
Animal obj3 = new Cat(); // 父类的引用指向子类的对象
c.eat(); // 调用的是从父类继承过来的方法
}
}
执行结果如下:
动物具有吃的能力
狗具有吃骨头的能力
动物具有吃的能力