Java面向对象-多态详解

目录

多态

概述

成员访问特点

多态的优势&劣势

优势

劣势

多态下引用数据类型的类型转换

自动类型转换(从子到父)

强制类型转换(从父到子)

多态综合案例


多态

概述

  • 同类型的对象,执行同一个行为,会表现出不同的行为特征
  • 常见形式:

父类 对象名称 = new 子类构造器()

a和b都是Animal类型的对象,执行run()方法表现不同的行为特征,其中Animal是父类,Dog和Tortoise是子类

接口 对象名称 = new 实现类构造器()

成员访问特点

  • 方法调用:编译看左边,运行看右边
  • 变量调用:编译看左边,运行也看左边(多态侧重行为)

用代码去理解

调用run方法时,编译看左是因为要先有父类Animal的run方法,子类才能去重写run再调用,运行看右也就是说看子类里的run方法,这样才可以表现出子类不同的特征

调用变量name时,因为多态是强调行为多态,所以调的name是父类Animal里的,编译看左,运行也看左

多态的前提:有继承/实现关系;有父类引用指向子类对象;有方法重写

多态的优势&劣势

优势

  • 在多态形式下,右边对象可以实现解耦合,便于扩展和维护

比如说当某一天,我觉得乌龟跑太慢了,代码效率太低,我新开发一个狗来把乌龟换掉,后续的业务会随着这个对象的改变而改变,其他代码无需修改

  • 定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性和遍历

将子类对象,赋给父类类型的变量,调用时调的是父类run,但是运行时运行子类自己的,实现了多态

劣势

  • 多态下不能使用子类独有的功能

因为类型是Animal父类类型,所以没法调用子类Dog独有行为/功能

多态下引用数据类型的类型转换

自动类型转换(从子到父)

子类对象赋值给父类类型的变量指向

强制类型转换(从父到子)

子类 对象变量 = (子类)父类类型变量

作用:可以解决多态下的劣势,可以实现调用子类的独有功能

注意:如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候会出现ClassCastException

Java建议强转转换前先使用instanceof判断当前对象的真实类型,再进行转换

多态综合案例

这个案例结合了多态、接口、实现类等知识点,可以加深印象,深入理解语法!

需求:

  • 设计一个电脑对象,可以安装2个USB设备
  • 鼠标:被安装时可以完成接入、调用点击功能、拔出功能
  • 键盘:被安装时可以完成接入、调用打字功能、拔出功能

分析:

  1. 定义一个USB接口,申明USB的规范是:可以接入和拔出(方法)
  2. 提供2个USB实现类代表鼠标和键盘,让其实现USB接口,并分别定义独有功能
  3. 创建电脑对象,创建2个USB实现类对象,分别安装到电脑中并触发功能执行

代码参考

public interface USB {//USB接口
    void connect();//接入
    void unconnect();//拔出
}
public class Mouse implements USB{//鼠标实现这个USB接口
    private String name;

    public Mouse(String name) {
        this.name = name;
    }

    @Override
    public void connect() {
        System.out.println(name+"成功接入设备");
    }

    @Override
    public void unconnect() {
        System.out.println(name+"成功拔出设备");
    }

    //独有功能
    public void click(){
        System.out.println(name+"点击~");
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class KeyBoard implements USB{//键盘实现这个USB接口
    private String name;

    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 Computer {
    //提供一个安装入口:行为
    public void installUSB(USB usb){
        usb.connect();

        //独有功能
        if(usb instanceof Mouse){
            Mouse m = (Mouse) usb;
            m.click();//点击
        }else if(usb instanceof KeyBoard){
            KeyBoard k = (KeyBoard) usb;
            k.keyDown();//打字
        }

        usb.unconnect();
    }
}
public class Test {
    public static void main(String[] args) {

        //a.创建电脑对象
        Computer c = new Computer();
        //b.创建USB设备对象
        USB u = new Mouse("鼠标1");
        c.installUSB(u);
        System.out.println("-------------------");

        USB u2 = new KeyBoard("键盘1");
        c.installUSB(u2);

    }
}

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值