类的多态性(JAVA)

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

目录

多态 

重写 

向上转型

类的多态性例子: 

多态的优缺点


 

多态 

所有的OOP语言都会有三个特征:

  1. 封装(点击可跳转)
  2. 继承(点击可跳转)
  3. 多态

多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。

在java中要实现多态,必须要满足如下几个条件,缺一不可:

  1. 必须在继承体系下;
  2. 子类必须要对父类中方法进行重写 ;
  3. 通过父类的引用调用重写的方法。

重写 

继承我们已经知道了,那我们面临的第一个问题就是什么是重写?

重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写, 返回值(返回类型满足父子关系也可以)和形参都不能改变。即外壳不变,核心重写!

重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。

注:避免在构造方法中调用重写的方法。

方法重写的规则:

  1. 子类在重写父类的方法时,一般必须与父类方法原型一致:方法名,参数列表要完全一致
  2. 被重写的方法返回值类型可以不同,但是必须是具有父子关系的
  3. 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为 protected,父类被static、private修饰的方法、构造方法都不能被重写
  4. 重写的方法, 可以使用 @Override 注解来显式指定,有了这个注解能帮我们进行一些合法性校验。例如不小心将方法名字拼写错了 (比如写成 aet),那么此时编译器就会发现父类中没有 aet 方法,就会编译报错, 提示无法构成重写。

 此时我们已经满足两点了还差最后一点。而第三点是通过父类的引用调用重写的方法。而要实现这一点就必须进行向上转型。

向上转型

向上转型就是为了实现代码通过父类的引用调用重写的方法。向上转型其实很简单

向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。

语法格式:父类类型 对象名 = new 子类类型()
类的多态性(JAVA),开发语言,java

向上转型的使用场景:

  • 直接赋值(上面的例子就是直接赋值)
  • 方法传参
  • 方法返回

向上转型的优点:让代码实现更简单灵活。
向上转型的缺陷:不能调用到子类特有的方法。

使用了向上转型之后就可以通过父类的引用调用重写的方法,而不是重写方法的就没法调用

class Animal{
    public String name = "花花";
    public void eat(){
        System.out.println(this.name+"正在吃饭");
    }
}
class Dog extends Animal{
    @Override
    public void eat(){
        System.out.println(this.name+"在吃狗粮");
    }
    public void a(){
        System.out.println("hhh");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.eat();
        //打印花花在吃狗粮
        Animal dog2 = new Animal();
        dog2.eat();
        //打印花花正在吃饭
    }
}

类的多态性(JAVA),开发语言,java

类的多态性例子: 

class Animal{
    public String name = "花花";
    public void eat(){
        System.out.println(this.name+"正在吃饭");
    }
}
class Dog extends Animal{
    @Override
    public void eat(){
        System.out.println(this.name+"在吃狗粮");
    }
}
class Cat extends Animal{
    @Override
    public void eat(){
        System.out.println(this.name+"在吃猫粮");
    }
}
public class Test {
    public static void fun(Animal arr){
        arr.eat();
    }
    public static void main(String[] args) {
        //数组的每个成员都会发生向上转型
        Animal[] arr = {new Dog(),
                        new Cat()};
    //此时就会发现调用同一个方法fun()会有两种结果
        fun(arr[0]);
        fun(arr[1]);
    }
}

类的多态性(JAVA),开发语言,java

多态的优缺点

  • 能够降低代码的 "圈复杂度", 避免使用大量的 if - else;

什么叫 "圈复杂度" ?

圈复杂度是一种描述一段代码复杂程度的方式。一段代码如果平铺直叙,那么就比较简单容易理解。而如果有很多的条件分支或者循环语句,就认为理解起来更复杂;

因此我们可以简单粗暴的计算一段代码中条件语句和循环语句出现的个数,这个个数就称为 "圈复杂度"。如果一个方法的圈复杂度太高, 就需要考虑重构。文章来源地址https://www.toymoban.com/news/detail-636235.html

  • 可扩展能力更强;
  • 多态缺陷:代码的运行效率降低。

到了这里,关于类的多态性(JAVA)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Python 中的多态性

    多态性是 OOP 的一个特征,这意味着一个名称可以具有不同的功能。 单个实体可以采取不同的形式。 本篇文章将介绍如何在 Python 中实现多态性。 理解这一点的最佳方法是使用 len() 函数。 对于不同的对象,该函数有不同的解释。 对于列表,它将返回存在的总元素;对于字符

    2024年02月05日
    浏览(35)
  • 实训7:虚函数与多态性

    参考代码 by 小喾苦 答案仅供参考! 实验目的 掌握运算符重载的方法; 实验任务 参考实验指导书第八章的实验任务 1。 实验步骤 参考实验指导书第八章的实验步骤 1。 测试说明 平台会对你编写的代码进行测试: 输入描述:空格隔开的两个整数x和y,表示一个坐标 输出描述

    2024年02月07日
    浏览(43)
  • 【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)

    前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数也认识了什么是类和对象以及怎么去new一个 ‘对象’ ,也了解了C++中的模版,以及学习了几个STL的结构也相信大家都掌握

    2024年02月11日
    浏览(48)
  • C# 类class、继承、多态性、运算符重载,相关练习题

    34.函数重载 35.几个相同的函数  print() ,用于打印不同的数据类型。   36.基类和派生类   37.基类的初始化   38.多重继承   39.动态多态性   40.抽象性和虚方法   41.通过虚方法 area() 来计算不同形状图像的面积   42.运算符重载的实现   @www.runoob.com 

    2024年02月09日
    浏览(45)
  • 【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】

    前言 大家好吖,欢迎来到 YY 滴C++考前速过系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《

    2024年01月25日
    浏览(54)
  • 年度语言之--c#与java的多态

    引言 多态是面向对象编程中的一个核心概念,它赋予语言更强大的表达力和灵活性。 Java和C#作为广泛使用的两中面向对象编程语言,多态这一特性都起到重要的作用,但它们实现这一概念的方式存在着一些差异。 本文将讨论Java与C#在实现多态方面的不同。 我们将分析这两种

    2024年02月22日
    浏览(40)
  • Java语言------四种内部类的详细讲解

    目录 一.内部类的介绍 二.内部类的种类 2.1实例内部类       2.2.静态内部类 2.3局部内部类 2.4匿名内部类 总结        内部类: 一个类定义在  另一个类  的  内部。        内部类分为 四种 : 实例内部类、静态内部类、局部内部类、匿名内部类。 使用时机:当一个事

    2023年04月25日
    浏览(43)
  • c、c++、java、python、js对比【面向对象、过程;解释、编译语言;封装、继承、多态】

    目录 内存管理、适用 区别 C 手动内存管理:C语言没有内置的安全检查机制,容易出现内存泄漏、缓冲区溢出等安全问题。 适用于系统级编程 C++ 手动内存管理:C++需要程序员手动管理内存,包括分配和释放内存,这可能导致内存泄漏和指针错误。 适用于游戏引擎和系统级编

    2024年02月08日
    浏览(76)
  • 反射机制-体会反射的动态性案例(尚硅谷Java学习笔记)

    // 举例01 public class Reflect{ } 案例:榨汁机榨水果汁,水果分别有果(com.reflect.Apple)、香蕉(Banana)、桔子(Orange)等。 效果如图。 提示: 1、声明(Fruit)水果接口,包含榨汁抽象方法: void squeeze(); /skwi:z/ 2、声明榨汁机(Juicer),包含运行方法: public void run(Fruit f),方法体中,调用f的榨汁方

    2024年02月11日
    浏览(47)
  • 【JAVA语言-第12话】API中的工具类 之 Date,DateFormat,SimpleDateFormat,Calendar类的详细解析

    目录 日期和时间 1.1 Date类 1.1.1 概述 1.1.2 常用方法  1.1.3 案例 1.2 DateFormat类  1.2.1 概述 1.2.2 常用方法 1.3 SimpleDateFormat类 1.3.1 概述 1.3.2 构造方法 1.3.3 模式字符  1.3.4 日期转字符串 1.3.5 字符串转日期 1.4 Calendar类 1.4.1 概述 1.4.2 静态方法 1.4.3 常用成员方法 1.4.4 成员方法中参数

    2024年02月02日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包