java复习第2天---2.2---多态

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章