【Java基础笔记】第二十一章 多态
发布时间
阅读量:
阅读量
目录
- 前言
- 第二十一章 多态
- 21.1 多态的主要表现形式
- 探讨多态访问特性时需重点关注
- 21.2 确定多态的基础条件
- 其显著特征体现在操作灵活性上
- 21.3 理解多态的前提条件
- 识别多态的关键要素在于对象层次
- 21.4 其显著特征体现在操作灵活性上
- 机制设计中常涉及引用数据类型的转录方式
-
21.5 涉及引用数据类型的转录机制:
-
自动转录机制:从子类到父类
-
强制转录策略:从父类到子类
- 【多态案例】模拟连接USB设备
前言
- 该文章为Java基础自学笔记。
- 其他内容:Java基础学习笔记目录
- 学习用书:
- 教材推荐如下:
- 第一本是《Java核心技术 卷Ⅰ 基础知识(第10版)》,另一本是《Java经典编程300例》。
- 教材推荐如下:
第二十一章 多态
对于同一类别中的实例,在响应相同的指令时会呈现出独特的行为模式。
21.1 多态的常见形式
父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;
代码解释
21.2 多态中成员访问特点(重点)
public abstract class Animal {
public String name = "父类——动物";
public abstract void eat();
}
class Dog extends Animal {
public String name = "子类——狗";
@Override
public void eat() { System.out.println("狗吃骨头");}
}
代码解释
- 方法调用: 编译看左边,运行看右边
Animal animal = new Dog();
animal.eat(); // 运行结果:狗吃骨头
代码解释
- 变量调用: 编译看左边,运行看左边**(多态侧重行为多态)**
Animal animal = new Dog();
System.out.println(animal.name); // 运行结果:父类——动物
代码解释
21.3 多态的前提
- 有继承/实现关系
- 有父类引用指向子类对象
- 有方法重写
21.4 多态的特点
- 在多态形式下,右边对象可以实现解耦合,便于扩展和维护
Animal animal = new Dog();
animal.eat();
代码解释
可以直接将new Dog()替换成new Cat();这会导致业务流程会根据对象不同而有所调整;同时后续代码则无需更改.
Animal animal = new Cat();
animal.eat();
代码解释
在设计系统架构时,在定义一个新方法时,请确保所使用的接口参数能够支持所有可能的实现类型。这样做的好处是能够方便地实现模块间的 loose coupling(松耦合),从而提高系统的可维护性和扩展性。
public void go(Animal a) {
a.eat();
}
代码解释
Animal a1 = new Dog();
go(a1);
Animal a2 = new Cat();
go(a2);
代码解释
- 多态下不能使用子类的独有功能
21.5 多态下引用数据类型的类型转换
21.5.1 自动类型转换(从子到父)
- 子类对象赋值给父类类型的变量指向
21.5.2 强制类型转换(从父到子)
- 从父到子必须进行强制类型转换:
子类 对象变量 = (子类)父类类型的变量
代码解释
- 作用: 可以解决多态下的劣势,实现调用子类独有的功能
Animal a = new Dog();
a.eat();
Dog d = (Dog) a;
d.狗类独有方法();
代码解释
提示: 当转换后的目标类型与真实对象的类型不一致时,尽管编译过程不会抛出编译错误(compilation error),但程序在运行过程中将导致一个ClassCastException异常。
Animal a = new Dog();
Cat c = (Cat) a; // 编译不会报错,运行时报异常
代码解释
- 此时使用 instanceof 判断当前对象的真实类型,再进行强制转换
变量名 instanceof 真实类型
代码解释
【多态案例】模拟连接USB设备
通过面向对象编程仿真创建一个计算机对象,并配置2个USB接口;在被安装的情况下,鼠标能够实现接续、执行点击操作以及断开功能;键盘在被安装的情况下能够实现接续操作,并执行打字指令以及断开操作
-
分析: * 明确一个USB接口的标准(明确规定 USB 设备必须具备接入和拔出的功能)
-
创建鼠标的 USB 实现类和键盘的 USB 实现类,并分别设置各自独特的功能
-
建立一个电脑模型,并生成两个 USB 设备实例;将这些设备配置到该电脑模型中
- USB接口
public interface USB {
// 接入
void connect();
// 拔出
void unConnect();
}
代码解释
- KeyBord 类
public class KeyBord implements USB {
private String name;
public KeyBord(String name) {
this.name = name;
}
/** * 键盘独有功能
*/
public void keyDown() {
System.out.println("键盘" + name + "敲击!");
}
@Override
public void connect() {
System.out.println("键盘" + name + "接入电脑");
}
@Override
public void unConnect() {
System.out.println("键盘" + name + "拔出电脑");
}
}
代码解释
- Mouse类
public class Mouse implements USB {
private String name;
public Mouse(String name) {
this.name = name;
}
/** * 鼠标独有功能
*/
public void dbClick() {
System.out.println("鼠标" + name + "双击!");
}
@Override
public void connect() {
System.out.println("鼠标" + name + "接入电脑");
}
@Override
public void unConnect() {
System.out.println("鼠标" + name + "拔出电脑");
}
}
代码解释
- Computer类
public class Computer {
private String name;
public Computer(String name) {
this.name = name;
}
public void start() {
System.out.println("电脑" + name + "开机了~~");
}
/** * 提供安装USB设备的入口
* @param usb USB设备
*/
public void installUSB(USB usb) {
usb.connect();
// 独有功能:先判断再强转
if (usb instanceof KeyBord) {
KeyBord keyBord = (KeyBord) usb;
keyBord.keyDown();
} else if (usb instanceof Mouse) {
Mouse mouse = (Mouse) usb;
mouse.dbClick();
}
usb.unConnect();
}
}
代码解释
- 测试方法
public static void main(String[] args) {
// 创建电脑对象
Computer computer = new Computer("IBM");
// 启动电脑
computer.start();
// 安装键盘
USB u1 = new KeyBord("Cherry");
computer.installUSB(u1);
// 安装鼠标
USB u2 = new Mouse("罗技");
computer.installUSB(u2);
}
代码解释
电脑IBM开机了~~
键盘Cherry接入电脑
键盘Cherry敲击!
键盘Cherry拔出电脑
鼠标罗技接入电脑
鼠标罗技双击!
鼠标罗技拔出电脑
代码解释
全部评论 (0)
还没有任何评论哟~
