10.2 java多态、多态中的成员变量与成员方法、向上转型、向下转型、instanceof关键字、电脑与鼠标和键盘实例

想了解更多请查看java学习(idea版)

目录

多态

多态的体现

列:实现多态

多态中的成员变量、成员方法

引用类型转换

向上转型

向下转型

instanceof

列:向上转型、向下转型、instanceof使用

列:接口多态的综合案例


 

多态

面向对象三大特性:封装、继承、多态

多态: 是指同一行为,具有多个不同表现形式

多态的好处,体现在,可以使程序编写的更简单,并有良好的扩展

多态的体现

  • 父类引用指向子类对象
  • 父类类型:指子类对象继承的父类类型,或者实现的父接口类型。
父类类型 变量名 = new 子类对象;//父类引用指向子类对象
 变量名.方法名();

列:实现多态

 

多态中的成员变量、成员方法

  • 当访问成员变量时,看等号左边时谁,优先用谁在多态中,
  • 当访问成员方法时,父子类都此方法,用子类方法;子类没有此方法,用父类方法

在多态中,当访问成员方法时,父子类都此方法,用子类方法;子类没有此方法,用父类方法

引用类型转换

多态中引用类型转换分为向上转型向下转型

向上转型

向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。

父类类型 变量名 = new 子类类型(); 
如:Animal a = new Cat();

向下转型

向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的

子类类型 变量名 = (子类类型) 父类变量名; 
如:Cat c =(Cat) a;

instanceof

为了避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验

instanceof格式    得到一个boolean值结果,也就是判断前面的对象能不能当做后面类型的实例

对象 instanceof 类名称

列:向上转型、向下转型、instanceof使用

 

 

 

为了解决向下转型出现java.lang.ClassCastException类转换异常,可以使用instancefo

/**
格式:
对象 instanceof 类名称
这将会得到一个boolean值结果,也就是判断前面的对象能不能当做后面类型的实例。
/
public class Demo02Instanceof {
    public static void main(String[] args) {
        Animal animal=new Dog();
        animal.eat();
//        if(animal instanceof Animal){
//            Dog dog=(Dog)animal;
//            dog.watchHouse();
//        }else  if (animal instanceof Cat){
//            Cat cat=(Cat)animal;
//            cat.catchMouse();
//        }
        giveObject(animal);
    }

    public static void giveObject(Animal animal){
        if(animal instanceof Animal){
            Dog dog=(Dog)animal;
            dog.watchHouse();
        }else  if (animal instanceof Cat){
            Cat cat=(Cat)animal;
            cat.catchMouse();
        }
    }

}

 

列:接口多态的综合案例

接口

public interface USB {
    public abstract void open(); // 打开设备
    public abstract 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 open() {
        System.out.println("打开键盘");
    }

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

    public void type() {
        System.out.println("键盘输入");
    }
}

电脑类  实现对鼠标、键盘接口的配置

public class Computer {
    public void powerOn() {
        System.out.println("笔记本电脑开机");
    }
    public void powerOff() {
        System.out.println("笔记本电脑关机");
    }
    // 使用USB设备的方法,使用接口作为方法的参数
    public void useDevice(USB usb) {
        usb.open(); // 打开设备
        if (usb instanceof Mouse) { // 一定要先判断
            Mouse mouse = (Mouse) usb; // 向下转型
            mouse.click();
        } else if (usb instanceof Keyboard) { // 先判断
            Keyboard keyboard = (Keyboard) usb; // 向下转型
            keyboard.type();
        }
        usb.close(); // 关闭设备
    }

}

测试

    public static void main(String[] args) {
        // 首先创建一个笔记本电脑
        Computer computer = new Computer();
        computer.powerOn()

       // 准备一个鼠标,供电脑使用 
       USB usbMouse = new Mouse(); //向上转型 多态写法 // Mouse mouse = new Mouse();
        // 参数是USB类型,我正好传递进去的就是USB鼠标
        computer.useDevice(usbMouse);

        // 创建一个USB键盘
        Keyboard keyboard = new Keyboard(); // 没有使用多态写法
        // 方法参数是USB类型,传递进去的是实现类对象
        computer.useDevice(keyboard); // 正确写法!也发生了向上转型
        // 使用子类对象,匿名对象,也可以
        // computer.useDevice(new Keyboard()); // 也是正确写法

        computer.powerOff();
        System.out.println("==================");
}

结果

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值