Java多态类

Java多态类

  • 一、多态概述
    • 二、多态性形势下的类型转换问题
      • 三.多态类综合案例

一、多态概述

1、什么是多态?
同类型的对象,执行同一个任务,会表现出不同的行为特征。

2、多态的常见形式

父类类型 对象名称 = new 子类构造器
接口 对象名称 = new 实现类构造器

3、多态类成员访问特点

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

4、多态的前提

有继承/实现关系;有父类引用指向子类对象;有方法重写。

5、优势

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

Animal a = new Dog();
a.run(); //后续业务行为随对象而变,后续代码无需修改

  • 定义方法的时候,使用父类作为参数,该方法就可以接受这父类的一切子类对象,体现出多态的扩展性与便利。

6、多态下会产生的一个问题

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

二、多态性形势下的类型转换问题

引用数据类型的类型转换方法:自动类型转换,强制类型转换。

1.自动转换(从子到父):子类对象赋值给父类类型的变量指向。

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

  • 此时必须进行强制类型转换:子类 对象变量 = (子类)父类类型的变量
  • 作用:可以解决多态下的劣势,可以实现调用子类独有的功能。
  • 注意:如果出现强转后的类型和对象真实类型不是同一种类型,那么在转换时就会出现ClassCastException。(编译时不会报错,运行时报错)

Animal t = new Tortoise();
Dog d = (Dog) t;//出现异常 ClassCastException

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

变量名 instanceof 真实类型
判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或者是其子类型,是则返回true,反之为false.

  • 示例
    Java多态类_第1张图片

三.多态类综合案例

Java多态类_第2张图片

1.定义一个USB接口

/**
 * USB接口 == 规范
 */
public interface USB {
    //接入、拔出
    void connect();
    void unconnect();
}

2.提供两个USB实现类代表鼠标键盘

/**
 * 实现键盘类
 */

public class KeyBoard implements USB{

    private String name;
    //使用有参构造器
    public KeyBoard(String name) {
        this.name = name;
    }

    @Override
    public void connect() {
        System.out.println(name + "键盘已成功接入");
    }
    /**
     * 键盘独有功能
     */
    public void keyDown() {
        System.out.println(name+"敲击了,你好");
    }

    @Override
    public void unconnect() {
        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;
    public Mouse(String name){
        this.name = name;
    }
    @Override
    public void connect() {
        System.out.println(name+"成功接入电脑");
    }
    /**
     * 鼠标的独有功能
     */
    public void dbClick(){
        System.out.println(name+"双击点赞");
    }
    @Override
    public void unconnect() {
        System.out.println(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 String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    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();
    }
}

4.安装启动

/**
 * 目标:USB设备模拟
 * 1.定义USB接口,接入(connect),接出(unconnect)
 * 2.定义2个USB的实现类:鼠标、键盘
 * 3.创建一个电脑对象,创建USB设备对象,安装启动
 */

public class Test {
    public static void main(String[] args) {
        //1.创建电脑对象
            Computer c = new Computer("外星人");
            c.start();

        //2.创建鼠标键盘对象
        USB u = new Mouse("罗技");
        c.installUSB(u);

        USB u1 = new KeyBoard("双飞燕");
        c.installUSB(u1);

    }
}

你可能感兴趣的:(java,jvm,开发语言)