首页 > 编程语言 >三分钟理解Java中向上转型和向下转型

三分钟理解Java中向上转型和向下转型

时间:2024-12-01 12:02:17浏览次数:11  
标签:Java 对象 子类 三分钟 转型 Cat Animal 父类

场景:

在学习Java的过程中,理解向上转型(Upcasting)和向下转型(Downcasting)对于掌握面向对象编程中的多态性至关重要。本文将通过简单的例子来阐述这两个概念的作用和意义。


什么是向上转型和向下转型

对象向上转型

父类对象可以调用子类重写父类的方法,这样当需要新添功能时,只需要新增一个子类,在子类中对父类的功能进行扩展,而不用更改父类的代码,保证了程序的安全性。

对象向下转型

向下转型是为了重新获得因为向上转型而丢失的子类特性。


向上转型:

首先定义一个父类对象Animal

Animal 中有shout方法和eat方法

class Animal{
    void shout() {
        System.out.println("动物的叫声");
    }
    void eat(){
        System.out.println("动物吃饭");
    }
}

然后定义子类对象Cat

Cat中有shout方法和play方法

class Cat extends Animal{
    public void shout(){
        System.out.println("猫的叫声:喵喵喵!");
    }
    public void play(){
        System.out.println("猫猫玩球");
    }
}

最后定义一个Test类,实现向上转型

public class Test {
    public static void main(String[] args){
        Cat cat=new Cat();
        Animal an=cat;//向上转型
        an.shout();//子类中被重写的方法
        an.eat();//父类中本来就有的方法
    }
}

向上转型是把子类对象赋值给父类类型。

在代码中,将子类对象cat赋值给父类对象an 实现向上转型,此时an是Animal类型的对象,但是实际上指向了Cat类型的变量;

an可以调用自己本身类Animal 的所有方法和与子类中共有的方法,或者说在子类中被重写的方法。

缺点,an虽然指向了Cat类,但是丢失了Play方法,比如这样子,代码会报错

public class Test {
    public static void main(String[] args){
        Cat cat=new Cat();
        Animal an=cat;//向上转型
        an.play();//报错!!!
    }
}

原因:向上转型后,an只有父类的方法+子类中重写的父类方法,在这个例子中an的方法只有猫叫shout(来自子类重写)和动物吃饭eat(来自父类)。


向下转型:

向下转型前必须要有向上转型!

public class Test {
    public static void main(String[] args){
        Animal an=new Cat();//向上转型
        Cat cat2=(Cat)an;//向下转型
        cat2.play();
        cat2.eat();
        cat2.shout();
    }
}

将已经向上转型的an强制转换为Cat类型并赋给cat2,此时cat2可以调用父类Animal中的全部方法(不包括被重写的方法)和子类Cat中的全部方法。


总结:

向上转型后能够调用的方法:
  • 父类中的全部方法(不包括被子类重写的)
  • 子类中重写的方法
向下转型后能够调用的方法:
  • 父类中的全部方法(不包括被子类重写的)
  • 子类中的全部方法

向上转型的基本格式有两种:

        子类类型 子类对象a = 子类实例;

        父类类型 父类对象b = 子类对象a;

        父类类型 父类对象b = 子类实例;        

向下转型的基本格式:

        子类类型 子类对象a = 子类实例;

        父类类型 父类对象A = 子类对象a;    //向上转型

        子类类型 子类对象b = (子类)父类对象A;

        父类类型 父类对象A = 子类实例;    //向上转型

        子类类型 子类对象b = (子类)父类对象A;

标签:Java,对象,子类,三分钟,转型,Cat,Animal,父类
From: https://blog.csdn.net/2301_81012597/article/details/144165736

相关文章

  • 判断一个自然数是否为完全数(Java)
    importjava.util.Scanner;publicclass完全数{publicstaticvoidmain(String[]args){//输入一个自然数,判断是不是完全数//完全数:所有因子之和等于该数本身Scannersc=newScanner(System.in);System.out.println("请输......
  • Java小白学习之---接口
    1.什么是接口?接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来2.接口语法interface接口名{//属性//方法(1.抽象方法2默认实现方法3.静态方法)}class类名implements接口{自己属性;自己方法;必须实现的接口的抽象......
  • C# + html + fetch + API + javascript
    本随笔,在html利用fetch去callwebapi对数据进行添加,修改,更新和删除。数据库与存储过程,此处略过...创建entity,方便webapi进行互动。 现在可以写WebAPI,html实现添加数据, jsfile, 上面添加的数据,将以下面的数据列呈现,  Insus.NET只是在html静态写了数据的表......
  • Java的现代应用与未来趋势:全面解析2024年技术生态
    引言:Java的演进与现代化技术方向Java的历史与演变​Java自1995年由SunMicrosystems发布以来,已经发展成世界上最流行的编程语言之一。它的设计目标是“WriteOnce,RunAnywhere”(写一次,随处运行),依靠其平台无关性(JVM)得到了广泛应用。随着技术的不断演变,Java语言的版本也......
  • Java设计模式——适配器模式的精妙应用:探秘 JDK 源码中的 Set 类
    在Java编程的世界里,JDK源码犹如一座神秘的宝藏,其中的Set类更是我们日常开发中频繁使用的利器。今天,就让我们像勇敢的探险家一样,深入JDK源码,揭开Set类的神秘面纱,重点剖析适配器模式在其中的巧妙应用,看看它是如何让Set类焕发出独特魅力的!......
  • HTML、CSS 和 JavaScript :它们是如何构成网页的
    ......
  • 每日速记10道java面试题05
    其他面试题:每日速记10道java面试题01-CSDN博客每日速记10道java面试题02-CSDN博客每日速记10道java面试题03-CSDN博客每日速记10道java面试题04-CSDN博客目录1.请你说说java中hashmap的原理2.HashMap的put(key,value)和get(key)过程3.在使用hashmap时,有哪些提升性能......
  • 汽车租赁管理系统|Java|SSM|JSP| 前后端分离
    【重要1⃣️】前后端源码+万字文档+部署文档【重要2⃣️】正版源码有问题包售后            【包含内容】【一】项目提供非常完整的源码注释【二】相关技术栈文档【三】源码讲解视频                     ......
  • 中学校园管理系统|Java|SSM|JSP| 前后端分离
    【重要1⃣️】前后端源码+万字文档+部署文档【重要2⃣️】正版源码有问题包售后            【包含内容】【一】项目提供非常完整的源码注释【二】相关技术栈文档【三】源码讲解视频                     ......
  • Type definition error: [array type, component type: [simple type, class java.lan
     详细报错信息:Typedefinitionerror:[arraytype,componenttype:[simpletype,classjava.lang.String]];nestedexceptioniscom.fasterxml.jackson.databind.exc.InvalidDefinitionException:Cannotconstructinstanceof`java.lang.String[]`:noString-argu......