面向对象三大特征之三 —— 多态
一、多态的概述,多态的形式
1、什么是多态?
- 同类型的对象,执行同一个行为,会表现出不同的行为特征。
2、多态的常见形式
![image]()
3、多态中成员访问特点
- 方法调用:编译看左边,运行看右边。
- 变量调用:编译看左边,运行也看左边。(多态侧重行为多态)
4、多态的前提
-
有继续/实现关系; * 有父类引用指向子类对象;
-
有方法重写。
-
![image]()
二、多态的好处
1、优势
-
在多态形势下,右边对象可以实现解耦合,便于扩展和维护。
-
![image]()
-
定义方法的时候,使用父类型作为参数,该方法就可以接收这个父类的一切子类对象,体现出多态的扩展性与便利。
2、多态下会产生一个问题:
- 多态下不能使用子类的独有功能
三、多态下引用数据类型的类型转换
1、自动类型转换(子——>父):
子类对象赋值给父类类型的变量指向。
2、强制类型转换(父——>子):
- 此时必须进行强制类型转换:子类 对象变量 = (子类)父类类型的变量
- 作用:可以解决多态下的劣势,可以调用子类独有的功能。
- 注意:如果转换后的类型和对象真实类型不是同一种类型,那么转换的时候就会出现ClassCastException。

3、Java建议强制转换前使用intanceof判断当前对象的真实类型,再进行强制转换。
四、多态的综合案例
1、创建一个USB接口
点击查看代码
public interface USB {
//接入 拔出
void connect();
void unconnect();
}
2、分别创建键盘和鼠标类(属性,方法)继承USB接口。
- 键盘
点击查看代码
/**
实现类
*/
public class KeyBoard implements USB {
private String name;
public KeyBoard() {
}
public KeyBoard(String name) {
this.name = name;
}
@Override
public void connect() {
System.out.println(name + "接入成功");
}
@Override
public void unconnect() {
System.out.println(name + "成功拔出");
}
/**
独有功能
*/
public void KeyDown(){
System.out.println(name +"敲击了");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 鼠标
点击查看代码
public class Mouse implements USB {
private String name;
@Override
public void connect() {
System.out.println(name +"连接成功");
}
@Override
public void unconnect() {
System.out.println(name + "成功拔出");
}
/**
独有功能
*/
public void dbClick(){
System.out.println(name + "双击点亮小红心");
}
public Mouse() {
}
public Mouse(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、创建电脑类
点击查看代码
public class Computer {
private String name;
public Computer(String name) {
this.name = name;
}
public Computer() {
}
public void start(){
System.out.println(name + "电脑开始启动");
}
/**
提供安装USB设备的入口
*/
public void installUSB(USB usb){
//多态:usb 可能是鼠标 也可能是键盘
usb.connect();
//独有功能:先判断再强转
if (usb instanceof KeyBoard){
KeyBoard k = (KeyBoard) usb;
k.KeyDown();
}else if (usb instanceof Mouse){
Mouse m = (Mouse) usb;
m.dbClick();
}
usb.unconnect();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4、创建Test3实现
点击查看代码
public class Test3 {
public static void main(String[] args) {
// 1、创建对象
Computer c = new Computer("dell");
c.start();
//2、创建鼠标对象,键盘对象
USB u1 = new Mouse("蓝牙鼠标");
c.installUSB(u1);
USB u2 = new KeyBoard("键盘");
c.installUSB(u2);
}
}








浙公网安备 33010602011771号