浅谈多态中的向上转型与向下转型

向上转型

概念明细

【原理】:实际就是创建一个子类对象,将其当成父类对象来使用.

语法格式:父类类型 对象名 = new 子类类型()

Animal animal = new Cat("元宝",2);	
//animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换
复制代码
class Animal{
     String name;
     int age;

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println(age + "岁的" + name + "正在吃东西");
    }
}

class Cat extends Animal {
    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(age + "岁的" + name + "正在吃猫粮");
    }
}

class Dog extends Animal {
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(age + "岁的" + name + "正在吃狗粮");
    }
}
复制代码

使用场景1:直接赋值

public class Test1 {
    public static void eat(Animal animal)
    {
        animal.eat();
    }
    public static void main(String[] args) {
        Animal animal1 = new Animal("动物",3);
        Animal animal2 = new Cat("加菲猫",2);
        Animal animal3 = new Dog("哈士奇",1);
        
        eat(animal1);
        eat(animal2);
        eat(animal3);
    }
}
复制代码

使用场景2:方法传参

public class Test1 {
    public static void eat(Animal animal)
    {
        animal.eat();
    }
    public static void main(String[] args) {
        eat(new Animal("动物",3));
        eat(new Cat("加菲猫",2));
        eat(new Dog("哈士奇",1));
    }
}
复制代码

使用场景3:方法返回

public static void eat(Animal animal)
{
    animal.eat();
}
复制代码
public static Animal BuyAnimal(String var)
{
    if(var.equals("猫")){
        return new Cat("加菲猫",2);
    }else if(var.equals("狗")){
        return new Dog("哈士奇",1);
    }else{
        return null;
    }
}
复制代码
Animal animal1 = BuyAnimal("猫");
eat(animal1);
Animal animal2 = BuyAnimal("狗");
eat(animal2);
Animal animal3 = BuyAnimal("兔");
eat(animal3);
复制代码

上述便是向上转型的三种场景。学会辨别和使用即可

向上转型的优缺点

【优点】:让代码实现更简单灵活,这个从上面的三个不同场景就可以看得出来 【缺点】:不能调用到子类特有的方法

class Dog extends Animal {
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(age + "岁的" + name + "正在吃狗粮");
    }

    public void lookdoor(){
        System.out.println(name + "在看门");
    }
}
复制代码

【注意事项】

向下转型

接下去我们来讲讲向下转型,这种类型的转化不太安全,如果没有特殊需求,不建议使用

向下转型解决【调用子类独有方法】

Animal animal1 = new Dog("哈士奇",1);
animal1.eat();
//animal1.lookdoor();
Dog dog = (Dog) animal1;
dog.lookdoor();
复制代码

向下转型的缺陷

那为什么说向下转型不安全呢,因为它存在安全隐患

Animal animal1 = new Cat("加菲猫",2);
animal1.eat();
//animal1.lookdoor();
Dog dog = (Dog) animal1;
dog.lookdoor();
复制代码

向下转型的优化

向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。 Java中为了提高向下转型的安全性,引入了 instanceof ,如果该表达式为true,则可以安全转换

Animal animal1 = new Cat("加菲猫",2);
animal1.eat();
//animal1.lookdoor();
if(animal1 instanceof Dog){   //判断一下animal1是否获取到了Dog类的引用
  Dog dog = (Dog) animal1;
  dog.lookdoor();
}
复制代码

如果对instance关键字感兴趣的可以看看官方的文档 ——> instanceof关键字


再度对比二者【碎碎念】

可能在上面这一系列说来有点难分辨,我们再来对比看看

总结与提炼

来总结一下本文所学到的内容


原文链接:https://juejin.cn/post/7205406121678225445

展开阅读全文

页面更新:2024-03-08

标签:子类   赋值   加菲猫   重写   场景   对象   动物   类型   代码   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top