Advertisement

【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)

还没有任何评论哟~