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设备有鼠标、键盘、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
主 编 | 王文星
责 编 | 木有符号
- 迪菲-赫尔曼密钥交换
- 分布式系统组件之配置中心
- github 提交报403 forbidden的错误解决
- Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架
- redis主从集群搭建及容灾部署(哨兵sentinel)
- 浅谈ASP.NET的Postback
- redis配置详解(中英文)
- 我所理解的Remoting(1):Marshaling & Activation[下篇]
- 5分钟短视频,带你走进日志易SPL,助你日志分析更容易
- Unity Application Block 1.2 for Silverlight - December 2008
- 算法学堂 - 二分查找及其变形
- Zookeeper权限管理与Quota管理
- 刘鹏:保大还是保小?无人汽车也将面临这样的道德窘境
- 浅谈DNS
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- python 文件管理神器os.walk-文件指定日期整理程序
- 项目驱动-两日速成Docker日记
- python os模块 --- 操作系统接口模块
- 自动采集各种美女图片站并下载图和自动搭建图片站
- 修改其他函数的功能的神器——python装饰器
- AllTube:视频解析下载源码安装教程
- Zsh和Oh My Zsh的安装配置
- 程序猿怎么利用技术挣钱?——python量化实践
- 利用WireGuard建立IPv6隧道
- selenium爬虫相关报错解决
- 小涴熊漫画CMS:非常不错的免费开源的漫画连载系统,带采集API
- 成都电信宽带获取IPV6地址全过程
- android studio 3.6.1导入项目报错提示无法下载classpath里的内容
- Linux VPS使用命令行快速查询百度网盘提取码
- Flutter 首页必用组件NestedScrollView的示例详解