文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【Java面向对象】多态的详细介绍,简单易懂,看这一篇就够了

2023-10-07 13:40

关注

文章目录


什么是多态

A: 方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承的基础之上的。简单来说,多态是具有表现多种形态的能力的特征。


多态的优点


多态的分类

重载式多态

重载式多态在编译时已经确定好了。方法名相同而参数列表不同的一组方法就是重载。在调用这种重载的方法时,通过传入不同的参数最后得到不同的结果。

案例

public void add(int a, int b) {    int c = a + b;    System.out.println("两个整数相加得 " + c);}public void add(float a, float b) {    float c = a + b;    System.out.println("两个float型浮点数相加得" + c);}

重写式多态

重写式多态是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。也就是说,只有程序运行起来,你才知道调用的是哪个子类的方法。 这种多态通过函数的重写以及向上转型来实现,我们接下来讲的所有多态都是重写式多态,因为它才是面向对象编程中真正的多态。

多态的向上转型

Q:什么是多态的向上转型?
A:父类的引用指向子类的对象叫做向上转型。

Q:向上转型的怎么写?
A:父类类型 引用名 = new 子类类型();

Q:向上转型有什么特点?
A:编译类型看左边,运行类型看右边。可以调用父类中的所有成员。最终运行效果看子类的具体实现。

案例

 //动物类,拥有一个call()方法class Animal {    public void call() {        System.out.println("动物叫!");    }} // 狗类,实现父类动物,并重写call()方法class Dog extends Animal {    public void call() {        System.out.println("汪汪!");    }    public void color() {        System.out.println("狗狗颜色!");    }} // 猫类,实现父类动物,并重写call()方法class Cat extends Animal {    public void call() {        System.out.println("喵~");    }    public void color() {        System.out.println("猫猫颜色!");    }} //测试类public class Test {    public static void main(String[] args) {     //向上转型        Animal animal = new Dog();        animal.call();        animal = new Cat();        animal.call();    }}

这里 Animal animal = new Dog();将子类对象Dog转化为父类对象Animal,这个时候Animal引用指向的是子类对象,所以调用的方法是子类方法。
向上转型时,子类单独定义的方法会丢失。比如,上面案例中的Dog类和Cat类都定义了自己的call方法,当进行了向上转型后,Animal引用指向Dog类的实例时是访问不到color方法的,Animal.color()会报错。

多态的向下转型

Q:什么是多态的向下转型?
A:子类引用指向父类对象(父类型,实例是子类的实例化)叫做多态的向下转型。通常需要进行强制类型转换。

案例

 //动物类,拥有一个call()方法class Animal {    public void call() {        System.out.println("动物叫!");    }} // 狗类,实现父类动物,并重写call()方法class Dog extends Animal {    public void call() {        System.out.println("汪汪!");    }    public void color() {        System.out.println("狗狗颜色!");    }} // 猫类,实现父类动物,并重写call()方法class Cat extends Animal {    public void call() {        System.out.println("喵~");    }    public void color() {        System.out.println("猫猫颜色!");    }} //测试类public class Test {    public static void main(String[] args) {    //向上转型    Animal animal = new Dog();     //向下转型        Dog dog = (Dog)animal;//向下转型,强制类型转换        dog.color();//输出狗狗颜色!        Cat cat = (Cat)animal;//报错        Animal animal = new Animal();        Dog dog = (Dog)animal;//报错    }}

这里需要注意Dog dog = (Dog)Animal;可以正常运行,是因为dog本身就是Dog对象,可以正常转型为Dog,而不能转型为Cataniaml类是Animal对象,他也不能向下转型成任何子类对象。

总结一下:

1)向下转型的前提是父类引用指向的是子类对象,也就是说,向下转型之前,它得先进行过向上转型。
2)向下转型只能转型为本类对象。

来源地址:https://blog.csdn.net/Ceylan__/article/details/127589290

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯