java向下转型前提必须要向上转型吗 java向下转型注意_java

public class DemoMain {
    public static void main(String[] args) {
        //对象的向上转型,就是:父类引用指向子类对象。
        Animal animal = new Cat();
        animal.eat(); 
    }
}
public abstract class Animal {

    public abstract void eat();
}
public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

 2.对象的向下转型


向上转型一定是安全的,没有问题的,正确的,但是也有一个弊端: 对象一旦向上转型为父类,那么就无法调用子类原本特有的内容。 解决方案:用对象的向下转型[还原]


public class DemoMain {
    public static void main(String[] args) {
        //对象的向上转型,就是:父类引用指向子类对象。
        Animal animal = new Cat();//本来创建的时候是一只猫
        animal.eat();
        //animal.cathcMouse();//错误写法

        Cat cat = (Cat) animal;
        cat.catchMouse();
    }
}
public abstract class Animal {

    public abstract void eat();
}
public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    //子类特有方法
    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}
public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃shit");
    }

    public void watchHouse(){
        System.out.println("狗用来看家");
    }

    //下面是错误的向下转型
    //本来new的时候是一只猫,现在非要当做狗
    //Dog dog = (Dog) Animal;//错误写法
}

如何才能知道一个父类引用的对象,本来是什吗子类?
格式:
  对象 instanceof 类
这将会得到一个boolean值结果,也就是判断前面的对象能不能当做后面类型的实例。

public class Demo2Instanceof {
    public static void main(String[] args) {
        Animal animal = new Cat();
        animal.eat();

        //如果希望调用子类特有方法,需要向下转型
        //判断一下父类引用animal本来是不是Dog
        if(animal instanceof Dog){
            Dog dog = (Dog) animal;
            dog.eat();
        }
        //判断一下animal本来是不是Cat
        if(animal instanceof Cat){
            Cat cat = (Cat) animal;
            cat.catchMouse();
        }
        giveMeAPeat(new Dog());
    }

    public static void giveMeAPeat(Animal animal){
        if(animal instanceof Dog){
            Dog dog = (Dog) animal;
            dog.eat();
        }
        //判断一下animal本来是不是Cat
        if(animal instanceof Cat){
            Cat cat = (Cat) animal;
            cat.catchMouse();
        }
    }

}

3.usb接口例子

java向下转型前提必须要向上转型吗 java向下转型注意_java向下转型前提必须要向上转型吗_02

 

public interface USB {
    public  abstract void open();//打开设备
    
    public  abstract void close();//关闭设备
}
public class Computer {

    public void powerOn(){
        System.out.println("笔记本电脑开机");
    }

    public void powerOff(){
        System.out.println("笔记本电脑关机");
    }

    //使用USB设备的方法,使用接口作为方法参数
    public void usbDevice(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();//关闭设备
    }
}
//鼠标就是一个USB设备
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("鼠标点击");
    }
}
//键盘就是一个USB设备
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 DemoMain {
    public static void main(String[] args) {
        Computer computer = new Computer();
        //首先创建一个笔记本电脑
        computer.powerOn();

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

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

        System.out.println("=========================");
        method(10.0);
        method(10);
        int a ;
        a = 20;
        method(a);
    }
    public static void method(double num) {
        System.out.println(num);
    }
}