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


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

多态的类型转换

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

向上造型(转型)

多态本身的子类类型向父类类型的转换的过程,默认的过程
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();
    }
    }

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值