第四章 面向对象之多态

多态单词学习

Polymorphism   多态

Instance  实例      

Override 重写

Constructor构造函数   (抗死抓K特)

ClassCastException   类型转换异常    exception 异常

Upcasting 向上转型   

Downcasting 向下转型

Abstract 抽象

1_多态的概述

面向对象的三大特征之一:  封装 、继承 、多态 、抽象、

多态是同一个行为具有多个不同表现形式或形态的能力。 继承是多态的前提。

 

2_多态的格式与使用

* 代码当中体现多态性,其实就是一句话:父类引用指向子类对象
*
* 格式:
* 父类名称 对象名 = new 子类名称();
* 或者
* 接口名称  对象名 = new 实现类名称();
*/

 

第一步:ch04.com.obtk_01.Demo01Multi

 

 

 

 

第二步:创建父类Fu

 

 

 

 

第三步:创建子类:Zi

 

 

 

 

提问:现在父类和子类方法一样,

以前我们创建对象都是子子new子,跟父类没关系,那我现在要通过多态的写法。

第四步:测试Demo01Multi

 

 

 

第五步:如果子类没有的方法怎么办?

 

 

 

第六步:测试Demo01Multi,

 

 

 

其实规律我们此前已经接触过,只不过我现在把概念告诉大家,什么叫多态?一句话左父右子就叫多态。

右侧子类对象就被当做父类使用,一只猫被当做动物看待,这是没有什么问题的,因为子类就是一个父类,在这里体现了面向对象的多态性。

3_多态中成员变量的使用特点

此前我们曾经总结过在继承关系中成员变量的访问特点,那么接下来我用多态的写法-这个成员变量的访问特点是否有变化?注意:没有任何变化

* 访问成员变量的两种方式:
*
* 1、直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。
* 2、间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找。
*/

 

第一步:ch04.com.obtk_02.Fu

 

 

 

第二步:ch04.com.obtk_02.Zi

 

 

 

第三步:Demo01MultiField 访问成员变量的两种试

 

 

 

 

 

 

4_多态中成员方法的使用特点(其实成员方法的规则也没有变化)

* 在多态的代码当中,成员方法的访问规则是:
*    看new的是谁,就优先用谁,没有则向上找
*
*    口诀:编译看左,运行看右边
*       编译时候,看左边的对象有没有方法,
*        运行时结果看new的对象是谁,就调用谁的方法
*
*对比一下:
*  成员变量:编译看左边,运行还看左边。
*  成员方法:编译看左,运行看右边。
*/

 

第一步:在上一个包里创建类:Demo02MultiMethod.

 

 

 

第二步:在父类中创建方法method()

 

 

 

第三步:在子类当中也有方法

 

 

 

第四步:在父类中增加特有方法,子类中也增加特有方法

 

 

 

 

 

 

第五步: 那么在这种情况下,我们的这句话会不会发生改变?不会

 

 

 

解释:编译看左边,运行看右边意思,但成员变量不在此列。

作业:

1、 接口:P147-148 选择题  多态的英语单词要求背诵p84

2、 第一、二、四章的本章总结请抄写一次。如果能理解并表达可以不用抄写。

 

 

 

 

 

5_使用多态的好处

有同学肯定会问,你直接new一个对象就好了,为什么要用多态呢?

 

 

 

 

6_对象的向上转型

 

 

 

第一步:ch03.com.obtk_04.Animal

 

 

 

第二步:ch03.com.obtk_04.Cat

 

 

 

第三步:

 

 

 

看图讲解:原本是一只猫,我现在转型为动物,这就是对象的向上转型。

 

7_对象的向下转型

 

 

 

上节我通过多态的写法用了一把向上转型,但是向上转型一定是安全的,没有问题的,但是也有一个弊端。

第一步:在上一个包中:Demo01Main

 

 

 

第二步:Cat 在子类中增加方法

 

 

 

第三步:我能不能通过animal来调用抓老鼠的方法catchMouse().

 

 

 

第四步:错误写法解释。

 

 

 

 

 

 

第五步:创建Dog类,继承Animal

 

 

 

第六步:Demo01Main中继续,查看结果

 

 

 

ClassCastException:类转换错误

 

 

 

 

总结:向下转型,本来就是才能转,本来就不是,他就会报错ClassCastException.

 

8_用instanceof关键字进行类型判断

第一步:在上一个包中创建类:Demo02InstanceOf

 

 

 

第二步:如果new Cat改为new Dog呢?运行查看结果。

 

 

 

问题:本来想用狗的方法,为什么还要向上转型?向上转、向下转两种格式都知道,但是你这个代码好像没有意义,只有演示的意义,确实如此,

但是我们考虑另外一种情况:有的时候animal不是自己new出来,比如我现在有个Main方法,这个main方法是自己new了对象自己去转对吗?

比如我现在想养只宠物,不管是猫、狗、鱼都可以,我就是为了打发时间,我应该怎么做?

第三步:Demo02Instanceof类中继续

 

 

 

特别注意:向下转型一定要做instanceof类型判断,否则有可能会发生异常。ClassCastException

9_笔记本USB接口案例——分析

接口与多态的综合案例

需求:笔记本电脑

笔记本电脑(laptop)通常具备使用USB设备的功能,在生产时,笔记本都预留了可以插入USB设备的USB接口,但具体是什么USB设备,笔记本厂商并不关心,只要符合USB规格的设备都可以。

 

 

 

定义USB接口,具备最基本的开启功能和关闭功能,鼠标和键盘要想能在电脑上使用,那么鼠标和键盘也必须遵守USB规范,实现USB接口,否则鼠标和键盘生产出来无法使用。

案例分析

笔记本类,实现笔记本使用USB鼠标、USB键盘、U盘

USB接口,包含打开设备功能,关闭设备功能。

鼠标类:实现USB接口,具备点击功能

键盘类:实现USB接口,具备按键功能。

U盘:实现USB接口,具备存取功能。

笔记本类:包含开机功能、关机功能、使用USB设备的功能

 

第一步:创建ch05.com.obtk_laptop. USB

/*
* USB
接口类
* **/
public interface USB {
    //打开设备
   
public abstract  void open();
    //关闭设备
   
public abstract void close();
}

第二步:Laptop

/**
 * @author fly
 * @date 2019-11-13 09:30:40
 */
public class Laptop {
    public void powerOn(){
        System.out.println("打开笔记本电脑");
    }
    public void powerOff(){
        System.out.println("关机笔记本电脑");
    }
    //使用USB设备的方法,使用接口作为方法的参数
   
public void useDevice(USB usb){
        usb.open();//打开设备
       
usb.close();//关闭设备
   
}
}

第三步:Mouse

* 鼠标就是一个USB设备
 */
public class Mouse implements  USB {
    @Override
    public void open() {
        System.out.println("打开鼠标");
    }

    @Override
    public void close() {
        System.out.println("关闭鼠标");
    }
}

第四步:Keyborad 

* 键盘也是USB的设备
 */
public class Keyborad  implements  USB{
    @Override
    public void open() {
        System.out.println("打开键盘");
    }

    @Override
    public void close() {
        System.out.println("关闭键盘");
    }
}

 

第五步:测试

public class DemoMain {
    public static void main(String[] args) {
        //创建笔记本对象
       
Laptop laptop = new Laptop();
        laptop.powerOn();


        //准备一个鼠标,供电脑使用
       // Mouse mouse = new Mouse();
        //使用多态的写法  向上转型
       
USB usbMouse = new Mouse();
        //参数是USB类型,
       
laptop.useDevice(usbMouse);
        System.out.println("=======1=========");
        //创建一个USB键盘
       
Keyborad keyborad = new Keyborad();
        //方法参数是USB类型,传递 进去的实现类的对象
       
laptop.useDevice(keyborad);
        System.out.println("========2============");
        //使用子类对象,匿名对象,也可以
       
laptop.useDevice(new Device());
    }
}

1—静态static关键字

 

 

 

2——静态static关键字修饰成员变量

 

3——静态static关键字修饰成员方法

 

posted @ 2021-04-29 22:13  丰斤豆  阅读(111)  评论(0)    收藏  举报