欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

认识Java的第十二天(上)——多态引用类型转换、综合案例

程序员文章站 2022-03-25 13:05:22
引用类型转换多态的类型转换向上造型(转型)向下造型(转型)为啥转型?转型的异常:三级目录多态的类型转换:向上造型和向下造型向上造型多态的类型转换多态的类型转换:向上造型和向下造型向上造型(转型)多态本身的子类类型向父类类型的转换的过程,默认的过程Fu fu=new Zi();向下造型(转型)想要调用子类独有方法Zi zi=(Zi)fu;为啥转型?当使用多态的时候调用方法时,首先检查父类中的是否有该方法,如果没有,则编译报错,也就是说,不能调用子类中的独有的方法,这是个小问题,我们需要...


多态的类型转换:向上造型和向下造型
向上造型

多态的类型转换

多态的类型转换:向上造型和向下造型

向上造型(转型)

多态本身的子类类型向父类类型的转换的过程,默认的过程
Fu fu=new Zi();

向下造型(转型)

想要调用子类独有方法
Zi zi=(Zi)fu;

为啥转型?

当使用多态的时候调用方法时,首先检查父类中的是否有该方法,如果没有,则编译报错,也就是说,不能调用子类中的独有的方法,这是个小问题,我们需要解决一下,所以想要调用子类的独有方法,需要向下转型。

转型的异常:

public class Animal {
    int age=100;
    public void eat(){
        System.out.println("我是动物类");
    }
}
public class Cat extends Animal {
    int age=10000;
    @Override
    public void eat() {
        System.out.println("吃鱼!");
    }
}
public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("吃骨头");
    }

}
public class Demo {
    public static void main(String[] args) {
        Animal animal = new Cat();
        Animal animal1 = new Dog();
        animal.eat();
        Dog dog = (Dog) animal;
    }
}
//编译不会报错 运行会报错
ClassCastException: doutai.Cat cannot be cast to doutai.Dog

解决方法:
Instanceof
如果变量属于该数据类型,则返回true
如果变量属于该数据类型,则返回false

public class Demo {
    public static void main(String[] args) {
        Animal animal = new Cat();
        Animal animal1 = new Dog();
        animal.eat();
        if (animal instanceof Cat){
            Cat cat=(Cat) animal;
            cat.eat();
        }else if (animal instanceof Dog) {
            Dog dog = (Dog) animal;
        }
    }
}

综合案例

我们的笔记本都有usb设备的功能,在生产的时候,笔记本电脑都可以预留USB设备的接口,但是具体是USB设备,我们笔记本厂家也不需要关心你的设备,这要你使用的设备符合我USB的设备的规范就可以。
定义一个usb接口,具备我们设备功能的开启或者关闭功能,鼠标和键盘要想能在电脑上使用,那么键盘和鼠标就必须遵循我们usb规范,实现usb接口。

分析:

进行描述笔记本的类,实现笔记本使用的usb鼠标和usb键盘
USB接口,包含了设备的开启和关闭的功能
笔记本类,包含运行功能,关机功能,使用usb设备的功能
鼠标类,要实现usb接口,并且有自己独有的功能就点击的方法
键盘类,要实现usb接口,并且有自己独有的功能就是敲击的方法

Usb接口

public interface Usb {
    //抽象方法
    void open();//开启功能
    void close();//关闭功能
}

鼠标类:

public class Mouse implements Usb{
    @Override
    public void open() {
        System.out.println("鼠标开启,红灯一亮");
    }

    @Override
    public void close() {
        System.out.println("鼠标关闭,红灯熄灭");
    }
    //鼠标类自己独有的方法
    public void click(){
        System.out.println("鼠标点击的功能");
    }
}

键盘类:

public class Keyboard implements Usb{
    @Override
    public void close() {
        System.out.println("键盘开启");
    }
    @Override
    public void open() {
        System.out.println("键盘关闭");
    }
    //键盘独有的方法
    public  void type(){
        System.out.println("键盘敲击");
    }
}

笔记本类:

public class LAP {
//笔记本开启功能
    public void run(){
        System.out.println("笔记本开始运行");
    }
    //笔记本使用我们的usb设备,这时当笔记本对象调用这个功能的时候
    //必须传统一个符合usb接口规范的设备
    //Usb use-new Mouse();
    public void useUSB(Usb usb){//比较多的一种写法
        if (usb!=null){
            usb.open();
            if (usb instanceof Mouse){
            //向下转型
                Mouse m=(Mouse)usb;
                m.click();//鼠标独有的功能
            }else if (usb instanceof Keyboard){
            //向下转型
                Keyboard keyboard=(Keyboard) usb;
                keyboard.type();//键盘独有的
            }
            usb.close();
        }
        }
public void shutDown(){
        System.out.println("笔记本关闭");
        }
        }

测试

public class Demo {
    public static void main(String[] args) {
    //创建一个笔记本对象
        LAP lap=new LAP();
        //笔记本开启功能
        lap.run();
        //创建鼠标类的对象
        Usb usb=new Mouse();
        lap.useUSB(usb);
        //创建键盘类对象
        Usb usb1=new Keyboard();
        lap.useUSB(usb1);
        //关闭我们的笔记本
        lap.shutDown();
    }
    }

结果:
笔记本开始运行
鼠标开启,红灯一亮
鼠标点击的功能
鼠标关闭,红灯熄灭
键盘关闭
键盘敲击
键盘开启
笔记本关闭

本文地址:https://blog.csdn.net/weixin_44051191/article/details/109803412