当前位置:主页 > java教程 > Java多态向上转型与向下转型

Java多态中的向上转型与向下转型浅析

发布:2023-04-02 15:00:01 59


给网友朋友们带来一篇相关的编程文章,网友勾良策根据主题投稿了本篇教程内容,涉及到java、多态、向上转型、java多态的概念、java向下转型的意义、Java多态向上转型与向下转型相关内容,已被965网友关注,下面的电子资料对本篇知识点有更加详尽的解释。

Java多态向上转型与向下转型

向上转型

概念明细

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

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

Animal animal = new Cat("元宝",2);	
//animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换

以下是定义的父类Animal类它的两个继承类Cat类和Dog类,分别重写了Animal类的eat()方法

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:

方法传参 第二种方法传参很简单,我们连对象都不需要创建,只需要直接将三种不同对象的引用作为实参传递给到eat()中的形参接受,就可以产生【向上转型】

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();
}

稍微讲一下这个方法,可以看到形参是String字符类型,在方法中通过判断外界传入进来的字符串然后对应地进行返回

  •  若是“猫”就返Cat对象的引用;
  •  若是“狗”就返Dog对象的引用;
  •  若是其他就返null
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);

然后可以看到,前两个传入的是【猫】和【狗】,因此执行的便是不同对象的行为,但是在最后传入了【兔】,因此在BuyAnimal()方法中会return null

这就使得传入eat()方法中去调用相关对象的行为时因为不存在这个对象的引用,所以就会产生空指针异常

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

向上转型的优缺点

【优点】:让代码实现更简单灵活,这个从上面的三个不同场景就可以看得出来

【缺点】:不能调用到子类特有的方法


参考资料

相关文章

  • Java中转义字符反斜杠╲的代替方法及repalceAll用法分析

    发布:2020-01-30

    这篇文章主要介绍了Java中转义字符反斜杠\的代替方法及repalceAll内涵解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一


  • Java数组(Array)最全汇总(中篇)

    发布:2023-03-08

    这篇文章主要介绍了Java数组(Array)最全汇总(中篇),本文章内容详细,通过案例可以更好的理解数组的相关知识,本模块分为了三部分,本次为中篇,需要的朋友可以参考下


  • Java线程安全中的原子性浅析

    发布:2023-03-27

    这篇文章主要介绍了Java线程安全中的原子性,原子性是指一条线程在执行一系列程序指令操作时,该线程不可中断。一旦出现中断,那么就可能会导致程序执行前后的结果不一致


  • JavaScript命令模式实例讲解

    发布:2020-01-25

    这篇文章主要介绍了JavaScript设计模式之命令模式,结合实例形式分析了javascript命令模式的概念、原理、用法及相关注意事项,需要的朋友可以参考下


  • java实现udp通讯的实例讲解

    发布:2019-06-09

    这篇文章主要为大家详细介绍了java实现udp通讯的代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • Java设计模式中的外观模式详解

    发布:2023-04-08

    外观模式为多个复杂的子系统,提供了一个一致的界面,使得调用端只和这个接口发生调用,而无须关系这个子系统内部的细节。本文将通过示例详细为大家讲解一下外观模式,需要的可以参考一下


  • Java程序使用MySQL时返回参数为乱码的解决方案大全

    发布:2020-01-07

    这篇文章主要介绍了解决Java程序使用MySQL返回参数为乱码的问题的教程,通过示例来讲解utf-8编码在MySQL中的相关配置,示例需要的朋友可以参考下


  • 基于Java网上购物系统的设计与实现

    发布:2020-02-19

    这篇文章主要为大家详细介绍了Java购物系统设计与实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


网友讨论