Java学习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("画了一幅蓝色的画");
}
}
结果:
涂抹蓝色颜料
画了一幅蓝色的画