Javase学习-05多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:
-
消除类型之间的耦合关系
-
可替换性
-
可扩充性
-
接口性
-
灵活性
-
简化性
二、多态存在的必要条件
-
继承
-
重写
-
父类引用指向子类对象:Father father = new Son();
1.方式一:重写
/** * @author: TSCCG * @date: 2021/5/12 */ public class PenTest { public static void main(String[] args) { //父类引用指向子类对象 Pen pen = new BluePen(); //调用的是BluePen类的方法,当改成RedPen();时,调用的就是RedPen类中的方法 pen.paintOn(); pen.draw(); } } /** * 父类 */ class Pen { public void paintOn() { System.out.println("涂抹颜料"); } public void draw () { System.out.println("画了一幅画"); } } /** * 红笔 */ class RedPen extends Pen { @Override public void paintOn() { System.out.println("涂抹红色颜料"); } @Override public void draw() { System.out.println("画了一幅红色的画"); } } /** * 蓝笔 */ class BluePen extends Pen { @Override public void paintOn() { System.out.println("涂抹蓝色颜料"); } @Override public void draw() { System.out.println("画了一幅蓝色的画"); } }
结果:
涂抹蓝色颜料
画了一幅蓝色的画
2.方式二:抽象类及抽象方法
/** * @author: TSCCG * @date: 2021/5/12 */ public class PenTest { public static void main(String[] args) { Pen pen = new RedPen(); pen.paintOn(); pen.draw(); } } /** * 父类 */ abstract class Pen { /** * 1.既然Pen类中draw这一方法在子类中都要重写,那么就不需要在父类中对这一方法进行实现, * 可以删去方法体,只定义笔可以draw这一能力就可以了,即抽象方法。 * 抽象方法必须要在返回类型前添加abstract来声明 * 2.如果父类中既有抽象方法又有非抽象方法,那么这个类就叫做抽象类 * 抽象类要在class前加abstract来声明 */ public void paintOn() { System.out.println("涂抹颜料"); } public abstract void draw(); } /** * 红笔 */ class RedPen extends Pen { @Override public void paintOn() { System.out.println("涂抹红色颜料"); } /** * 子类必须实现父类中的抽象方法 */ @Override public void draw() { System.out.println("画了一幅红色的画"); } } /** * 蓝笔 */ class BluePen extends Pen { @Override public void paintOn() { System.out.println("涂抹蓝色颜料"); } @Override public void draw() { System.out.println("画了一幅蓝色的画"); } }
结果:
涂抹红色颜料
画了一幅红色的画
3.方法三:接口
接口,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
代码:
/** * @author: TSCCG * @date: 2021/5/12 */ /** * 父类 */ interface Pen { /** * 如果父类中全部都是抽象方法,那么这个类就叫做接口 */ void paintOn(); void draw(); } /** * 红笔 */ class RedPen implements Pen { /** * 子类必须实现接口中所有方法 */ @Override public void paintOn() { System.out.println("涂抹红色颜料"); } @Override public void draw() { System.out.println("画了一幅红色的画"); } } /** * 蓝笔 */ class BluePen implements Pen { @Override public void paintOn() { System.out.println("涂抹蓝色颜料"); } @Override public void draw() { System.out.println("画了一幅蓝色的画"); } }
结果:
涂抹蓝色颜料
画了一幅蓝色的画