【从零开始学习JAVA | 第十五篇】 多态

这篇具有很好参考价值的文章主要介绍了【从零开始学习JAVA | 第十五篇】 多态。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【从零开始学习JAVA | 第十五篇】 多态

前言:

本篇我们来解释一下什么是多态关系,多态关系属于面向对象三大特征的最后一个,可以说面向对象的重点就在多态,因此我们要学好面向对象编程思想,就要学好多态。

多态:

        Java中的多态是指同一类对象在不同情况下可能表现出不同的形态和行为。它包括了方法重载方法重写两种形式。

        方法重载是指在同一个类中定义了两个或多个方法,它们的方法名相同,但参数类型、个数或顺序不同。当程序调用这个方法时,根据传入的参数类型自动匹配最合适的方法进行执行。

        方法重写是指子类重写父类的某一个方法,方法名和参数列表都必须相同。当程序调用该方法时,会首先查找子类中是否存在该方法,如果存在则执行子类中的方法,如果不存在则会向上查找父类中是否有该方法,直到找到为止。

        多态使得同一类对象可以表现出不同的行为,增强了程序的灵活性和扩展性,也是面向对象编程的基本特征之一。在Java中,多态实现通过继承、接口和抽象类等机制来实现。

多态的表现形式:

  • 父类类型 名称 =子类对象;

多态的前提:

  • 有继承关系。
  • 有父类引用指向子类对象。
  • 有方法重写。

多态调用成员变量特点:

  • 变量调用:编译看左边,运行看右边。

  • 方法调用:编译看左边,运行看右边

package testo1;

public class test02 {
    public static void main(String[] args) {
        //利用多态创建对象。
        Animal a= new dog();
        //调用成员变量是编译看左边,运行看左边。
        System.out.println(a.name);
        //调用成员方法:
        //编译看左边,运行看右边。
       a.show();
    }

}
class Animal{
    String name ="动物";
    public void show()
    {
        System.out.println("animal-------show");
    }

}

class dog extends Animal{
    String name ="狗";
    @Override
    public void show ()
    {
        System.out.println("dog---------show");
    }

}
class cat extends Animal{
    String name ="狗";
    @Override
    public void show ()
    {
        System.out.println("cat---------show");
    }

}

运行结果:

【从零开始学习JAVA | 第十五篇】 多态

在这个调用中我们可以发现:成员变量会随着建立对象的不同而不同。例如我们明明是Animal类型的对象,却打印了dog里面的方法。

如果子类对父类方法进行了重写,那么在虚方法表中是会对父类的方法进行覆盖的。

其实可以类比于C++里面的多态,感兴趣的同学可以点击这篇文章进行观看

C++ 动态多态实现底层逻辑_我是一盘牛肉的博客-CSDN博客

多态的优点:

1. 增强程序的灵活性:通过多态机制,同一个类型的不同对象可以表现出不同的行为。这使得程序的调用方式更加灵活,可以针对不同的对象调用不同的方法,无需为每一个具体对象都单独编写方法。

2. 提高代码的复用性:通过抽象类和接口,多态能够很好地实现代码的复用。在编写抽象类和接口时,我们可以定义一些通用的方法和属性,这些方法和属性可以被具体的子类继承和实现,从而减少代码的重复编写。

3. 提高程序的可扩展性:通过多态机制,在程序的运行过程中,可以动态地替换对象的行为。这使得程序的扩展性更加优秀,增加新的功能时,只需要添加新的类和方法即可,无需修改已有的代码。

4. 提高程序的可维护性:多态使得代码更加松散耦合,不同的类之间的关系更加清晰明了。这使得程序的维护性更好,对于模块性较强的程序,修改和维护的难度大大降低。

因此,多态在面向对象编程中具有重要的作用,能够提高程序的灵活性、可复用性、可扩展性和可维护性。

多态的缺点:

1. 程序执行效率略低:由于多态的实现需要动态绑定,即在运行时才能确定对象的类型和方法的执行地址,所以程序的执行效率会略微降低。

2. 代码可读性不高:由于多态性质的特殊性,程序中可能出现一个方法被多次重载、覆盖的情况,这样会使得代码的可读性变差,不容易理解。

3. 可能会造成误解或错误:由于父类无法完全限制子类的行为,所以在使用多态时,很容易陷入到某些无法预知的情况下,例如仅仅使用父类的属性而忽略了子类的某些特殊属性或方法,从而出现意外结果或错误。

虽然多态存在一些缺点,但是这些缺点可以通过适当的编码和测试来避免。在实际编程中,正确使用多态,在对程序的可维护性、可扩展性以及灵活性等方面都具有重要意义。

 因为父类不可以调用子类的特有功能,因此例如我们在子类中的函数,如果我们的创建对象是父类,那么就无法使用这个方法,因此我们在JAVA中设置了转型

转型:

多态的转型是指通过类型转换,将一个对象在继承关系中沿着层次向上或向下进行类型转换,在转型过程中可以访问不同层次的方法和变量。

在Java中,类型转换分为向上转型向下转型两种:

  • 向上转型:将子类转换为父类对象,这种转换不需要进行特殊处理,自动完成向上转型。例如:Animal animal = new Cat(),Cat类是Animal类的子类,在这里就进行了向上转型。
  • 向下转型:将父类对象转换为子类对象,需要强制类型转换才能实现。例如:Cat cat = (Cat) animal,在这里需要将Animal类型的对象进行强制类型转换为Cat对象,才能实现向下转型。

需要注意的是,在进行向下转型之前,必须进行向上转型,否则会报错。另外,在进行向下转型时,必须保证进行转换的对象是正确的类型,否则也会报错。

下面给出一个Java多态中的类型转换示例,通过向上转型和向下转型操作,来演示多态的转型过程:


interface Animal {
    public void eat();
}

class Cat implements Animal {
    public void eat() {
        System.out.println("Cat eat fish.");
    }

    public void meow() {
        System.out.println("Cat say meow.");
    }
}

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

        Cat cat = (Cat) animal;
        cat.eat();
        cat.meow();
    }
}

在上述代码中,首先定义了一个接口 Animal,包含一个抽象方法 eat()。接着,定义一个实现了 Animal 接口的类 Cat,并且在 Cat 类中实现了 eat() 方法和 meow() 方法。在主方法中,创建了 Animal 类型的引用 animal,并将其设置为 Cat 类的实例。由于 Cat 类是 Animal 类的子类,因此可以进行向上转型。接着对 animal 调用 eat() 方法,输出“Cat eat fish.”。

接下来进行向下转型,在将 Animal 类型的引用 animal 转换为 Cat 类型的引用 cat。在向下转型后,可以调用 Cat 类特有的方法 meow(),输出“Cat say meow.”。

需要注意的是,在进行向下转型之前,必须进行向上转型。否则将会出现编译错误。同时,当进行向下转型时,必须进行类型检查,保证进行转换的对象是正确的类型。否则将会出现运行时错误。

总结:

多态更加丰富了子类与父类之间的关系网,更加完善了JAVA的功能,学好面向对象三大特征很重要,各位要熟练掌握这里的内容,才可以更加娴熟的使用JAVA。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

【从零开始学习JAVA | 第十五篇】 多态文章来源地址https://www.toymoban.com/news/detail-498491.html

到了这里,关于【从零开始学习JAVA | 第十五篇】 多态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【从零开始学习JAVA | 第十八篇】接口介绍

    目录 前言: 接口: 如何定义一个接口: 如何使用一个接口: 接口中成员的特点: 接口与类的区别:   接口的应用: 总结:         接口其实是为了弥补继承的缺点: 我们无法让父类完美的适应每一个子类的要求 。 例如我们有一个动物类的父类,有一个蝌蚪类,鱼

    2024年02月10日
    浏览(49)
  • 【从零开始学习JAVA | 第十九篇】初识内部类

    内部类是类的五大成员。一个类的其他的成员分别是属性,方法,构造方法,代码块。本文将详细介绍什么是内部类,以及内部类的意义。 内部类(Inner Class)是 Java 中的一个特殊概念,它指的是 一个类定义在另一个类内部的类。 内部类可以访问外部类的成员,包括私有的

    2024年02月15日
    浏览(43)
  • 从零开始学习 Java:简单易懂的入门指南之线程同步(三十五)

    1.1卖票【应用】 案例需求 某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票 实现步骤 定义一个类SellTicket实现Runnable接口,里面定义一个成员变量:private int tickets = 100; 在SellTicket类中重写run()方法实现卖票,代码步骤如下

    2024年02月08日
    浏览(49)
  • 从零开始学习 Java:简单易懂的入门指南之正则表达式(十五)

    在Java中,我们经常需要验证一些字符串,例如:年龄必须是2位的数字、用户名必须是8位长度而且只能包含大小写字母、数字等。正则表达式就是用来验证各种字符串的规则。它内部描述了一些规则,我们可以验证用户输入的字符串是否匹配这个规则。 先看一个不使用正则表

    2024年02月12日
    浏览(42)
  • 从零开始学习 Java:简单易懂的入门指南之可变参数及Collections类(二十五)

    在 JDK1.5 之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化. 格式: 底层: ​ 其实就是一个数组 好处: ​ 在传递数据的时候,省的我们自己创建数组并添加元素了,JDK底层帮我们自动创建数组并添加元素了 代码演示: 注意: ​

    2024年02月07日
    浏览(43)
  • 【MySQL数据库 | 第十五篇】事务

        目录    前言:  介绍事务:  控制事务:  事务四大特性:  并发事务问题:  事务隔离级别: 总结:   这章我们将进入到MySQL基础篇的最后一章:事务,希望大家可以坚持下去,跟着我一起走完MySQL的学习之旅。 MySQL是一种关系型数据库管理系统,支持事务管理。 事

    2024年02月08日
    浏览(57)
  • PerfView专题 (第十五篇): 如何洞察 C# 中的慢速方法

    在 dump 分析旅程中,经常会遇到很多朋友反馈一类问题,比如: 方法平时都执行的特别快,但有时候会特别慢,怎么排查? 我的方法第一次执行特别慢,能看到慢在哪里吗? 相信有朋友肯定说,加些日志不就好了,大方向肯定是没问题的,但加日志的颗粒度会比较粗而且侵

    2024年02月16日
    浏览(60)
  • 二十三种设计模式第十五篇--模版方法模式

    模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,而将一些步骤延迟到子类中实现。通过使用这种模式,我们可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。 模板方法模式的核心思想是将一个算法分解为一系列步骤,并将可变的部分封装在

    2024年02月12日
    浏览(63)
  • 【Python入门系列】第十五篇:Python数据可视化和图表绘制

    数据可视化是数据分析和数据科学中非常重要的一部分。通过可视化,我们可以更好地理解数据、发现数据之间的关系、展示数据的趋势和模式,并向他人传达我们的发现。 Python是一种功能强大的编程语言,拥有许多用于数据可视化的库和工具。其中,Matplotlib是最常用的绘

    2024年02月13日
    浏览(61)
  • 干翻Dubbo系列第十五篇:Rest协议基于SpringBoot的规范化开发

    文章目录 一:Rest协议 1:协议概念 2:协议作用 二:搭建开发环境 1:父项目里边引入的新的版本内容 2:Api中的操作 3:Provider模块 4:Consumer模块 三:编码 1:API模块 2:Provider模块 3:Consumer模块         Rest协议就是我们我们一开始基于SpringBoot或者是SpringMVC开发说的Re

    2024年02月10日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包