当前位置:网站首页 > Java基础 > 正文

java基础之多态的详细解释



欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。


欢迎加入团队圈子!与作者面对面!直接点击!

前言

多态是java学习的重难点,因为其高度抽象性,直接从理论上去理解往往是比较困难的。本篇文章将从贴近生活的案例,来解释什么是多态。

多态

(阅读以下内容,需要提前了解java继承和接口的知识)

再结合案例前,得先知道多态的代码怎么写,以及一些相关规则.具有继承关系的父子类(或者是接口及其实现类),才能用多态.

格式

父类名称 对象名 = new 子类名称()//多态写法

或者

接口名称 对象名=new 实现类名称();

通过这个格式new出来的对象,只能访问父类中的成员变量和成员方法,子类独有的成员属性和方法没办法访问.

接下来看看,直接new一个父类对象,直接new一个子类对象,通过多态new一个对象,三者有什么区别?

1.直接new一个父类对象A

对象A只能访问父类中的成员变量和方法,重点:对象A是一个父类对象.

2.直接new一个子类对象B

对象B既可以访问子类对象的成员属性和方法,也可以访问父类的。重点:对象B是一个子类对象

3.通过多态new一个对象C

只能访问父类中的成员变量和成员方法,重点:此时对象C是一个父类对象,但可以通过向下转型变为子类对象,去访问子类对象的成员属性和方法.

重点(多态的特点)

多态对象在创建时是一个父类对象,可以在有需要的时候变成子类对象。也就是说对象C可以在父类对象和子类对象中切换,它拥有多个形态,这就是多态.

这样做有什么用呢?或者说有什么好处呢?来看案例.

案例

每台笔记本上都有usb接口,只需要把usb设备插上去,电脑就可以识别.usb java基础之多态的详细解释设备有鼠标、键盘、u盘等等.

java来模拟上述的事物.

笔记本类LapTop,拥有一个usb接口方法usbIterface,无成员变量. usbIterface方法需要传入usb设备,如果是你,如何区别不同的usb设备呢?

新建鼠标类Mouse、键盘类KeyBoard。然后用方法重载?


//鼠标类

public class Mouse {

    public void on(){

        System.out.println("鼠标链接");

    }

    public void click(){

        System.out.println("鼠标点击");

    }

}

//键盘类

public class KeyBoard {

    public void on(){

        System.out.println("键盘连接");

    }

    public void input(){

        System.out.println("键盘输入");

    }

}

//笔记本类---方法重载

public class LapTop {

    public void usbInterface(Mouse mouse){

        mouse.on();

        mouse.click();

    }

    public void usbInterface(KeyBoard keyBoard){

        keyBoard.on();

        keyBoard.input();

    }

}

这样做虽然可以,但是当usb设备变多,代码就会过度冗余。此时就需要用到多态了。

还记得上文说的,所有采用多态格式new出来的对象,都是父类对象吗?只需要让鼠标、键盘都继承同一个父类,那么就是可以把不同的usb设备传入到一个函数中,该函数只需要接受同一个父类对象.

新建usb设备类,让鼠标和键盘继承.鼠标和键盘类都有on方法,可以抽取到父类中.

//usb设备类

public class UsbDevice {

    public void on(){

        System.out.println("usb设备连接");

    }

}

//鼠标类

public class Mouse extends UsbDevice {

    public void click(){

        System.out.println("鼠标点击");

    }

}

//键盘类

public class KeyBoard extends UsbDevice {

    public void input(){

        System.out.println("键盘输入");

    }

}

//笔记本类

public class LapTop {

    public void usbInterface(UsbDevice usb){

        usb.on();

    }

}

实例

public class Main {

    public static void main(String[] args) {

        //new一个笔记本对象

        LapTop lapTop=new LapTop();

        //多态方式new一个鼠标对象

        UsbDevice mouse= new Mouse();

        //多态方式new一个键盘对象

        UsbDevice keyBoard=new KeyBoard();

        //将鼠标键盘插入到usb接口上

        lapTop.usbInterface(mouse);

        lapTop.usbInterface(keyBoard);

    }

}

usb设备插入到usb接口后,需要判断是什么设备,然后使用该设备的特有方法。这就需要使用多态的向下转型,将父类对象转为子类对象.

格式:

子类名称 对象名=(子类名称)原来多态对象名

在向下转型前,得先判断多态对象的多种形态中是否有对应的子类对象,有才可以转,mouse对象只能转鼠标,不能转键盘,这就需要用到instanceof关键字.

格式:

多态对象名 instanceof 需要转换的子类名称

//笔记本类

public class LapTop {

    public void usbInterface(UsbDevice usb){

        usb.on();

        //判断是否包含鼠标这个形态

        if (usb instanceof Mouse){

            Mouse mouse=(Mouse)usb; //向下转型

            mouse.click();//调用鼠标特有功能

        }

        //判断是否包含键盘这个形态

        else if(usb instanceof KeyBoard){

            KeyBoard keyBoard=(KeyBoard)usb; //向下转型

            keyBoard.input();//调用键盘特有功能

        }

        else{

            System.out.println("无法识别的usb设备");

        }

    }

}

总结

如果有新的设备需要插入usb接口,只需要让这个设备去继承usb设备类,那么新设备就会被当做usb设备.这就是多态的好处.

多态本身是一种向上转型(因为通过多态new出来的对象,会被看作一个父类对象),可以通过向下转型变为子类对象.


END

主 编 | 王文星

责 编 | 木有符号

where2go 团队



微信号:算法与编程之美   

长按识别二维码关注我们!

  • 上一篇: java基础叫什么
  • 下一篇: java 0基础入门
  • 版权声明


    相关文章:

  • java基础叫什么2024-10-18 19:10:02
  • java基础重要么2024-10-18 19:10:02
  • java并发基础教程2024-10-18 19:10:02
  • java注解开发基础2024-10-18 19:10:02
  • Java基础面试题软件2024-10-18 19:10:02
  • java 0基础入门2024-10-18 19:10:02
  • java基础的小程序2024-10-18 19:10:02
  • java可达性分析哪些基础类2024-10-18 19:10:02
  • 有java基础搞安卓要多久2024-10-18 19:10:02
  • java最基础的游戏2024-10-18 19:10:02