13.多态的好处

多态的好处

多态

  • 值同一行为,具有多个不同的变现形式

前提

  • 继承或者实现(父类、抽象类、接口)【二选一】
  • 方法的重写【意义体现】
  • 父类引用指向子类对象【格式体现】

格式

  • 父类类型 变量名 = new 子类对象(参数列表);
  • 父类类型\<泛型\> 变量名 = new 子类对象\<\>(参数列表);

父类类型:指子类对象继承父类类型,或者实现的父类接口类型。

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译报错;如果有,执行的是子类重写(继承)后的方法

多态的好处
实际开发中,父类类型作为方法形式的参数,传递子对象给方法,进行方法调调用,更能体现书多态的扩展性与便利。

引用类型转换

  • 向上转型:多态本身就是子类类型向父类类型向上转换的过程,这个过程是默认的。当父类型引用指向一个子类对象时,便是向上转型。

  • 向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。 一个已经向上转型的子对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。
    子类类型 变量名 = (子类类型) 父类变量名;

为什么要转型?

当使用多态方式调用方法时,首先检查父类是否有该方法,如果没有,则编译报错,也就是说,多态不能调用子类拥有而父类没有的方法,这也就是 多态的不足,这就需要向下转型,调用子类独有的方法。

转型验证instanceof: 变量名 instanceof 数据类型
如果变量属于该数据类型,返回true,否则返回false,可以在向下转型的时候进行判断

接口与多态的栗子:

  • USB接口
public interface USB {

    void open();
    void close();
}
  • Mouse鼠标类
public class Mouse implements USB {

    public Mouse() {}

    @Override
    public void open() {
        System.out.println("插上了鼠标线");
    }

    @Override
    public void close() {
        System.out.println("鼠标线被拔掉了");
    }

    public void click() {
        System.out.println("鼠标点击事件");
    }
}
  • KeyBord键盘类
public class KeyBord implements USB {

    @Override
    public void open() {
        System.out.println("键盘线插上了");
    }

    @Override
    public void close() {
        System.out.println("键盘线被拔了");
    }

    public void tupe() {
        System.out.println("我在使用键盘打字");
    }
}
  • Laptop笔记本类
public class Laptop {

    public void run() {
        System.out.println("笔记本系统开启了。。。。");
    }

    public void useUSB(USB usb) {
        if(usb != null) {
            // 多态(向上转型)
            usb.open();

            // 向下转型
            if(usb instanceof Mouse) {
                Mouse mouse = (Mouse) usb;
                mouse.click();
            } else if( usb instanceof KeyBord) {
                KeyBord keyBord = (KeyBord) usb;
                keyBord.tupe();
            }

            // 多态
            usb.close();
        }
    }

    public void shutDown() {
        System.out.println("系统关闭。。。。。");
    }
}
  • Main测试类
public class Main {

    public static void main(String[] args) {
        Laptop laptop = new Laptop();
        Mouse mouse = new Mouse();
        KeyBord keyBord = new KeyBord();

        laptop.run();

        laptop.useUSB(mouse);
        laptop.useUSB(keyBord);

        laptop.shutDown();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,646评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,145评论 1 32
  • 1 面向对象No6 面向对象 OO Object Oriented 编程时以对象为单元,封装数据和逻辑,以此提...
    征程_Journey阅读 1,196评论 0 2
  • 在暴风雨来临之前 燃尽最后一簇火焰 而火一般滚烫的 滚烫的泪 已在胸腔溢满 将要喷发而出的 漫过干涸的脸 灼烧僵硬...
    卿常笑阅读 405评论 0 4
  • 如果是一般有限责任公司的话,股份是按照投资金额和注册资金的比例确定的,利润也是按照股份占有情况按照比例分配的,这个...
    酷聊析曼阅读 116评论 0 0