java复习第2天---2.2---多态
目录
文章目录
内容
1、多态
面向对象三大特性:封装、继承和多态。继承为多态的前提,通过extends 或者 implements 关键字体现。
1.1、格式与使用
-
格式
父类 对象名 = new 子类(); 或者 接口 接口名 = new 实现类();
-
示例1.1-1:
public class Father {...} public interface MyInterface {...} public extends Father implements MyInterface {...} public class MultiTest1 { public static void main(String[] args){ Father f1 = new Son(); MyInterface mi = new Son(); } }
1.2、多态中的成员变量
-
成员变量调用方式
- 子类对象直接调用
- 子类方法间接调用
-
调用顺序
- 直接调用:优先调用 = 左边的成员变量,没有向上查找。
- 子类方法间接调用:优先调用子类成员变量,没有向上查找
-
示例1.2-1:
package inherited.Multi; public class Father { int num = 10; public void show() { System.out.println(num); } } package inherited.Multi; public class Son extends Father{ int num = 20; public void show() { System.out.println(num); } } package inherited.Multi; public class TestVar1 { public static void main(String[] args) { Father s1 = new Son(); System.out.println(s1.num); s1.show(); } } 结果: 10 20
1.3、多态中的成员方法
-
调用规则:
- 优先调用子类的成员方法,子类中没有向上查找
-
示例1.3-1:
package inherited.Multi; public class FatherMulti { public void show() { System.out.println("父类中的show方法"); } public void methodFu() { System.out.println("父类中的特有方法"); } } package inherited.Multi; public class SonMulti extends FatherMulti{ public void show() { System.out.println("子类中的show方法"); } } package inherited.Multi; public class TestMulti1 { public static void main(String[] args) { FatherMulti f1 = new SonMulti(); f1.show(); f1.methodFu(); } } 结果: 子类中的show方法 父类中的特有方法
1.4、多态的优缺点
- 优点:不需要关心子类或者实现类的功能实现细节,当子类或者实现类改变的时候,调用API无需改变。
- 缺点:不能使用子类或者实现类的特有方法,解决方法见向下转型
1.5、向上向下转型
- 向上转型:即我们常用的多态形式,即父类或者接口引用指向子类或者实现类对象。
- 向下转型:由于父类或者接口引用指向子类或者实现类对象,那么它就不能使用子类或者实现类的特有方法。如果想使用,那么需要强制向下转型,即前面加(子类)。
- 问题:当向下转型不是原有的类型时,会暴类型转换错误,怎么解决呢,见instanceof关键字
1.6、instanceof关键字
-
instanceof: 判断一个对象是不是某个类的对象
-
格式
对象 instanceof 类 // 结果为true 或者 false
-
应用:上面提到,当向下转型时,可能并不是原有的类型是,就可以使用instanceof提前判断下是不是原有类型。
1.7、接口多态综合小案例
1.7.1、需求
笔记本电脑(laptop)通常具有使用usb设备的能力。生产时,会预留供usb设备插入的usb接口。生产商不关心是什么usb设备,只要符合usb接口规范即可。
定义usb接口,具有开启和关闭的功能。鼠标和键盘要想在笔记本电脑上使用,必须遵循ubs接口规范,实现usb接口,否则不能在笔记本电脑上面使用。
1.7.2、分析
描述笔记本类,实现使用鼠标和键盘的功能。
- 笔记本类
- 方法:
- 使用usb设备
- 开机
- 关机
- 方法:
- 鼠标类
- 实现usb接口
- 点击方法
- 键盘类
- 实现usb接口
- 敲击方法
- ubs接口
- 方法
- 开启设备
- 关闭设备
- 方法
1.7.3、实现
-
笔记本类代码1.7.3-1:
package inherited.IMCase; public class Laptop { public void powerOn() { System.out.println("开机"); } public void powerOff() { System.out.println("关机"); } /** * 使用USB设备功能 * @param usb usb设备 */ public void useUSBDevice(USB usb) { usb.open(); // 开启设备 usb.close(); // 关闭设备 } }
-
USB接口代码1.7.3-2:
package inherited.IMCase; public interface USB { void open(); // 开启设备 void close(); // 关闭设备 }
-
鼠标类代码1.7.3-3:
package inherited.IMCase; public class Mouse implements USB{ @Override public void open() { // TODO Auto-generated method stub System.out.println("启用鼠标"); } @Override public void close() { // TODO Auto-generated method stub System.out.println("停用鼠标"); } public void click() { System.out.println("鼠标点击"); } }
-
键盘类代码1.7.3-4:
package inherited.IMCase; public class Keyboard implements USB{ @Override public void open() { // TODO Auto-generated method stub System.out.println("启用键盘"); } @Override public void close() { // TODO Auto-generated method stub System.out.println("停用键盘"); } public void click() { System.out.println("键盘敲击"); } }
-
测试类代码1.7.3-5:
package inherited.IMCase; public class IMCaseTest { public static void main(String[] args) { // 1.创建笔记本电脑对象 Laptop lt = new Laptop(); System.out.println("=========="); // 2.调用电脑开机功能 lt.powerOn(); // 3、调用电脑关机功能 lt.powerOff(); System.out.println("=========="); // 4、创建1个鼠标对象 // 4.1、多态形式 USB usb = new Mouse(); // 5、笔记本电脑使用鼠标 lt.useUSBDevice(usb); System.out.println("=========="); // 6、创建键盘对象 // 6.1、非多态形式 Keyboard keyboard = new Keyboard(); // 7、笔记本电脑使用键盘 lt.useUSBDevice(keyboard); } }
-
结果:
========== 开机 关机 ========== 启用鼠标 停用鼠标 ========== 启用键盘 停用键盘
2、final关键字
3、权限修饰符
后记 :
本项目为参考某马视频开发,相关视频及配套资料可自行度娘或者联系本人。上面为自己编写的开发文档,持续更新。欢迎交流,本人QQ:806797785
前端项目源代码地址:https://gitee.com/gaogzhen/vue-leyou
后端JAVA源代码地址:https://gitee.com/gaogzhen/JAVA