认识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
上一篇: 有时候专家的话挺有道理