java中向上转型和向下转型

1、对象的向上转型与向下转型

  • 向上转型

    对象的向上转型就是多态的写法:

    格式: 父类名称 对象名 = new 子类名称();

    含义:右侧创建一个子类对象,把他当做父类来看待,比如:创建了一只猫,当做动物来看待。

    注意:向上转型一定是安全的,从小范围转到大范围,

    类似于:自动类型转化;

    代码 实现:

    package Interface.demo6;
    
    /*
    * 动物类
    *
    * */
    public abstract class Animal {
    
        public abstract void eat();
    }
    
    
    package Interface.demo6;
    
    /*
    * 猫类。继承Animal类
    * 并重写了父类中的方法
    * */
    public class Cat extends Animal {
        @Override
        public void eat() {
            System.out.println("猫吃鱼");
        }
    }
    
    
    package Interface.demo6;
    
    /*
    * 测试类
    * */
    public class Demo01Main {
    
        public static void main(String[] args) {
    
            //父类对象指向子类对象的引用
            Animal animal = new Cat();
            animal.eat();
        }
    }
    
    
  • 向下转型

    作用:实例化的类向上转型后,如果想访问子类的成员方法或成员变量,就会无法访问,通过向下转型后,就可以访问。

    对象的向下转型其实就是一个还原动作

    格式:子类的名称 对象名 = (子类名称)父类对象;

    含义:将父类对象 【还原】成本类的子类对象。

    Animal animal = new Cat(); //本来是猫,向上转型为动物,

    Cat cat = (Cat) animal; //本来是猫,向上转型为动物,还原回来成为本来的猫,

    注意:

    1. 必须保证对象创建是,与还原是的类型是一致的,例如:猫还原为猫,够还原为狗
    2. 如果对象创建时候本来不是猫,现在非要还原为猫,就会报运行时错误:ClassCastException,表示:类型转化错误。

    类似于:基本数据类型的强制类型转化

    package Interface.demo6;
    
    /*
    * 动物类
    *
    * */
    public abstract class Animal {
    
        public abstract void eat();
    }
    
    
    package Interface.demo6;
    
    /*
    * 猫类。继承Animal类
    * 并重写了父类中的方法
    * */
    public class Cat extends Animal {
        @Override
        public void eat() {
            System.out.println("猫吃鱼");
        }
    
        public void catchMouse(){
            System.out.println("猫抓老鼠");
        }
    }
    
    
    package Interface.demo6;
    
    /*
    * 测试类
    * */
    public class Demo01Main {
    
        public static void main(String[] args) {
    
            //父类对象指向子类对象的引用
            Animal animal = new Cat();
            animal.eat();
    
            //向下转型,将animal类转化为猫类
            Cat cat = (Cat) animal;
            cat.catchMouse();
        }
    }
    
    

    猫吃鱼
    猫抓老鼠

2、instanceof方法

instanceof可以判断引用类型的变量是否属于这个类型

package Interface.demo6;

/*
* 测试类
* */
public class Demo01Main {

    public static void main(String[] args) {

        //父类对象指向子类对象的引用
        Animal animal = new Cat();
        animal.eat();

        //向下转型,将animal类转化为猫类
//        Cat cat = (Cat) animal;
//        cat.catchMouse();
    }

    public static void getAnPet(Animal animal){
        if(animal instanceof Cat){
            //向下转型
            Cat cat = (Cat) animal;
            cat.catchMouse();
        }else {
            System.out.println("没有其他类");
        }
    }
}

记住:instanceof 在向下转型是判断要转的这个类属于那个类,这个类与他的向上转型的类一致

3、笔记本usb接口案例

cGCLc9.png

package Interface.demo7;

/*
* 笔记本类
* */
public class Computer {

    //打开电脑
    public void powerOn(){
        System.out.println("打开电脑");
    }

    public void powerOff(){
        System.out.println("关闭电脑");
    }

    public void useDrivce(Usb usb){
        //打开设备
        usb.open();

        //使用向下转型
        if (usb instanceof Mouse) {
            Mouse mouse = (Mouse) usb;
            mouse.type();
        }else if (usb instanceof Keyboard){
            Keyboard keyboard = (Keyboard) usb;
            keyboard.type();
        }

        //关闭设备
        usb.close();
    }
}

package Interface.demo7;

/*
* usb接口
* */
public interface Usb {

    //打开设备
    public abstract void open();

    //关闭设备
    public abstract void close();
}

package Interface.demo7;


/*
* 鼠标类
* */
public class Mouse implements Usb {

    //使用鼠标的方法
    @Override
    public void open() {
        System.out.println("打开鼠标");
    }

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

    public void type(){
        System.out.println("鼠标点击");
    }
}

package Interface.demo7;


/*
* 键盘类
* */
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("键盘输入");
    }
}

package Interface.demo7;

/*
* 测试类
* */
public class demoMain {

    public static void main(String[] args) {

        //创建一个电脑
        Computer computer = new Computer();
        //打开电脑
        computer.powerOn();

        //创建一个鼠标
        Usb mouseUsb = new Mouse();
        computer.useDrivce(mouseUsb);

        //创建一个键盘
        Usb keyBoardUsb = new Keyboard();
        computer.useDrivce(keyBoardUsb);


        //关闭电脑
        computer.powerOff();
    }
}

打开电脑
打开鼠标
鼠标点击
关闭鼠标
打开键盘
键盘输入
关闭键盘
关闭电脑

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值