多态polymorphism
概述
-
多态性是指同一个操作作用于某一个对象时可以有不同的解释,产生不同的执行结果。
-
多态存在的三个必要条件:
- 需要存在继承或实现关系
- 方法的重写
- 父类引用指向子类对象:Parent p = new Child()
-
多态通过分离做什么和怎么做从一个角度实现了接口和实现进行分离,消除了类型之间耦合关系,提高了程序的拓展性和后期维护性。
-
示例
class Animal{ public String name; public void eat(){} } class Dog extends Animal{ public void eat(){ System.out.println("狗吃奥利给"); } } class Cat extends Animal{ public void eat(){ System.out.println("猫吃小老鼠"); } } public class Test { public static void main(String[] args) { Animal dog = new Dog(); Animal cat = new Cat(); dog.eat(); cat.eat(); } }
-
输出
狗吃奥利给 猫吃小老鼠
对象的上下转型
- 多态的转型分为向上转型和向下转型两种。
向上转型
- 多态本身就是向上转型过的过程,比如上面我们把狗类实例化时将其声明为了动物类,这就是向上转型,即从一个较专用类型转向一个较通用类型。
- 向上转型时可能造成方法的丢失,当父类不存在子类的方法时则此方法不能再用。
向下转型
-
跟向上转型相反的过程,将已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
-
强转是有风险的,我们使用instanceof关键字来判断左边的对象是否为右边的类的实例
-
示例
class Animal{ public String name; public void eat(){} } class Dog extends Animal{ public void eat(){ System.out.println("狗吃奥利给"); } } class Cat extends Animal{ public void eat(){ System.out.println("猫吃小老鼠"); } } public class Test { public static void main(String[] args) { Animal dog = new Dog(); Animal cat = new Cat(); dog.eat(); if(cat instanceof Cat){ Cat mimi =(Cat)cat; mimi.eat(); }else{ System.out.println("cat不是Cat的对象"); } } }
-
输出
狗吃奥利给 猫吃小老鼠
多态案例-打印机
-
代码
class School{ private Printer type; public void anZhuang(Printer type){ this.type = type; } public void print(String contex){ type.print(contex); } } class Printer{ public String type; public void print(String contex){} } class ColorPrinter extends Printer{ public void print(String contex){ System.out.println("彩色打印机打印:" + contex); } } class BawDayin extends Printer{ public void print(String contex){ System.out.println("黑白打印机打印:" + contex); } } class PinDayin extends Printer{ public void print(String contex){ System.out.println("针打印机打印:" + contex); } } public class Printor { public static void main(String[] args) { School s = new School(); ColorPrinter c = new ColorPrinter(); s.anZhuang(c); s.print("花花世界迷人眼,没有颜值别赛脸"); BawDayin b = new BawDayin(); s.anZhuang(b); s.print("刀不锋利马太瘦,你拿什么和我斗"); PinDayin p = new PinDayin(); s.anZhuang(p); s.print("辉煌岁月人人有,别把一刻当永久"); } }
-
输出
彩色打印机打印:花花世界迷人眼,没有颜值别赛脸 黑白打印机打印:刀不锋利马太瘦,你拿什么和我斗 针打印机打印:辉煌岁月人人有,别把一刻当永久
❤️ 本回完!❤️ ❤️ ❤️