展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > Java面向对象之多态实例分析

Java面向对象之多态实例分析

多态的理解什么是多态呢??从字面理解就是多种形态,也就是不同类实例化出来的对象调用同一种方法,也可以理解为不同类的对象经过同一种行为产生的状态是不同的,这就是多态。要想理解多态,我们必须要了解向上转型和重写这两个重点然后在来深刻理解多态这一概念,等看完向上转型与重写再来看多态的概念,你就会豁然开朗,一下就通透了不少。因为多态的条件就是向上转型,重写以及继承。向上转型首先多态的前提是继承,那既然是继承,那就肯定就有父类与子类这样的关系。我们再来回忆一下怎么创建子类对象和父类对象。classAnimal{pu

本文目录

      多态的理解

      什么是多态呢??从字面理解就是多种形态,也就是不同类实例化出来的对象调用同一种方法,也可以理解为不同类的对象经过同一种行为产生的状态是不同的,这就是多态。

      要想理解多态,我们必须要了解向上转型和重写这两个重点然后在来深刻理解多态这一概念,等看完向上转型与重写再来看多态的概念,你就会豁然开朗,一下就通透了不少。因为多态的条件就是向上转型,重写以及继承。

      向上转型

      首先多态的前提是继承,那既然是继承,那就肯定就有父类与子类这样的关系。

      我们再来回忆一下怎么创建子类对象和父类对象。

      class Animal{
          public String name;//名字
          public int age;
          public void eat() {
              System.out.println("我要吃饭!!!");
          }
          public void sleep() {
              System.out.println("我要睡觉!!!");
          }
      }
      class Cat extends Animal{
          public void mew() {
              System.out.println("喵喵喵!!!");
          }
      }
      public class TestDemo1 {
          public static void main(String[] args) {
               Cat cat =new Cat();//实例化子类对象
               cat.name="mimi";
               Animal animal = new Animal();//实例化父类对象
               animal.eat();
          }
      }

      这里就创建了猫这个类然后继承了Animal类。我们实例化猫和Animal这个对象就可以调用方法和属性。

      那何为向上转型呢???

      原本子类对象的引用引用子类的对象,现在让父类的引用引用子类对象这就是向上转型。

      Java面向对象之多态实例分析

      我们利用代码理解一下:

      Java面向对象之多态实例分析

       这就是向上转型,我们也可以利用animal这个父类引用 调用方法;

      Java面向对象之多态实例分析

       这时我们就会发现利用这个引用能够调用父类的方法和属性,但是不能够调用子类的方法和属性,那为什么呢??原因就是因为父类没有子类这个方法,所以不能调用。总结:向上转型的时候也就是父类引用引用子类对象,这个父类引用只能调用父类有的属性和方法,不能调用子类的。

      向上转型的三种形式

      第一种:直接赋值

      也就是我们上面的那种写法:

        Animal animal1 = new Cat();//父类对象的引用 引用子类对象--->向上转型
        Animal animal2 = new Dog();

      第二种:作为方法参数:

      Java面向对象之多态实例分析

        第三种作为返回值:

      Java面向对象之多态实例分析

      我们回到刚才的打印结果是什么;

      Java面向对象之多态实例分析

      但如果我把父类的方法变成我要吃猫粮呢?那结果毫无意外就是mimi我要吃猫粮。

      但是这就会出现一个问题,如果我在创建一个狗类,然后在调用eat方法  难道狗也要吃猫粮么?这就会出现问题,那我们可以在子类写一个eat方法;

      class Animal{
          public String name;//名字
          public int age;
          public void eat() {
              System.out.println(this.name+"要吃饭!!!");
          }
      }
      class Dog extends Animal{
          public void dark() {
              System.out.println("汪汪汪!!!");
          }
          public void eat() {
              System.out.println(this.name+"吃狗粮!!!");
          }
      }
      class Cat extends Animal{
          public void mew() {
              System.out.println("喵喵喵!!!");
          }
          public void eat() {
              System.out.println(this.name+"吃猫粮!!!");
          }
      }
      public class TestDemo1 {
          public static void main(String[] args) {
              //语法形式 : 父类 变量 = new 子类();
              Animal animal1 = new Cat();//父类对象的引用 引用子类对象--->向上转型
              Animal animal2 = new Dog();//父类对象的引用 引用子类对象--->向上转型
              animal1.name = "小猫";//访问父类属性
              animal2.name = "小狗";//访问父类属性
              animal1.eat();
              animal2.eat();
              // animal.mew();//访问子类特有的方法
          }
      }

       这时又创建了一个狗类,然后又分别在两个子类创建两个eat方法。

      Java面向对象之多态实例分析

       我们发现这时候就变得很清楚就达到我们想要的效果了。

      但我们又应该想一想,为什么调用子类的eat方法而不调用父类的?

      动态绑定和静态绑定

      此时其实发生了动态绑定,我们可以看一下字节码文件,打开powershell窗口

      Java面向对象之多态实例分析

      我们都知道执行一个程序是先编译后运行,而这个是在编译的时候调用的是Animal的eat方法,而在运行的时候是调用的是Cat的方法这就是我们所说的运行时绑定或者可以说是动态绑定。

      那既然有动态绑定那肯定也有静态绑定。

      动态绑定是在编译的时候调用一个方法,而在运行时才是最后要确定调用的方法,也就是在运行时确定要调用那个方法。

      静态绑定就是在编译期间已经确定要调用哪个方法。

      其中,动态绑定最显著的代表就是方法重写。

      静态绑定最显著的代表就是方法重载。

      我们在回过头看上面的方法 ε=(´ο`*)))......怎么前面的eat方法返回值,参数列表,方法名都是一样的呢?我们来看一下。

      Java面向对象之多态实例分析

      方法的重写

      我们之前学过方法重载这里回顾一下方法重载,方法重载是方法名相同,返回值不做要求,参数列表不同。而我们今天学的方法重写是返回值相同,方法名称相同,参数列表相同,说是叫方法重写其实也可以叫做方法覆盖。

      方法重写有几点注意要求:

      方法重写满足 方法名相同,方法的参数列表相同,方法的返回值相同。

      Java面向对象之多态实例分析

       我们也可以一键生成重写 

      Java面向对象之多态实例分析

       有几个注意事项:

      Java面向对象之多态实例分析

       不能重写被private修饰的方法。

      Java面向对象之多态实例分析

       不能重写被final修饰的方法。

      Java面向对象之多态实例分析

       子类的方法的访问权限一定要大于等于父类的访问权限。

      Java面向对象之多态实例分析

      重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心将方法名字拼写错了 (比如写成eat), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写.

      Java面向对象之多态实例分析

      被static修饰的方法也不能被重写 

      总结方法重写的注意事项:

      • 被private,final修饰的方法不能被重写。

      • 被staitc修饰的方法也不能被重写。

      • @override 可以检查你重写的方法名是否正确,最好要加上。

      • 方法重写一定满足方法名相同,参数列表相同,返回值相同。

      对比方法重写与方法重载:

      Java面向对象之多态实例分析

      最后:重写不是进行在原来基础的修改,而是在原来基础上进行迭代和更新。

      进一步认识和理解多态

      场景:画一个图形

      class Shape{//创建一个图形类---->作为多种图形的父类
          public int length;//图形的长
          public int wide;//图形的宽
          public int height;//图形的高
          public void draw() {
              System.out.println("我要画一个图形!!!");
          }
      }
      class rectangle extends Shape{//长方形
          @Override
          public void draw() {
              System.out.println("我要画一个长方形!!!");
          }
      }
      class square extends Shape{
          @Override
          public void draw() {
              System.out.println("我要画一个正方形!!!");
          }
      }
      class circular extends Shape{
          @Override
          public void draw() {
              System.out.println("我要画一个圆形!!!");
          }
      }
      public class TestDemo1 {
          public static void method(Shape shape) {
              shape.draw();
          }
          public static void main(String[] args) {
              Shape shape1 = new circular();
              Shape shape2 = new rectangle();
              Shape shape3 = new square();
              method(shape1);
              method(shape2);
              method(shape3);
          }
      }

      创建一个Shape(父类),然后创建三个子类分别是square ,circular,rectangle,利用父类引用这三个子类,接着调用method方法。

      Java面向对象之多态实例分析

      这就是多态,不同的对象,调用同一个方法最后结果产生出不同的状态。

      我们再来总结多态产生的条件:

      • 要在继承体系下

      • 子类要对父类的方法进行重写

      • 通过父类的引用调用重写的方法 

      也就是 在继承体系下  进行向上转型  和 方法重写

      多态的优点

      优点:

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

      • 如果使用多态, 则不必写这么多的 if - else 分支语句, 代码更简单.

      • 可扩展能力更强

      缺点:

      • 代码的运行效率降低

      还有一个重要点就是不要在构造方法中调用重写方法

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java
      相关文章 更多
      精品专题 更多
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      macOS软件

      正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

      IOS软件

      正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

      AI

      正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

      Mac软件 更多
      Aperty macOS版
      Aperty macOS版

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      火山引擎 网页版
      火山引擎 网页版

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      立刻MV 网页版
      立刻MV 网页版

      立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

      蛙蛙写作 网页版
      蛙蛙写作 网页版

      蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

      讯飞智作 网页版
      讯飞智作 网页版

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      超级简历WonderCV 网页版
      超级简历WonderCV 网页版

      超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

      音述AI 网页版
      音述AI 网页版

      音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

      AionClaw macOS版
      AionClaw macOS版

      AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

      Loomy macOS版
      Loomy macOS版

      Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

      AirBuddy 3 macOS版
      AirBuddy 3 macOS版

      AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

      AirServer macOS版
      AirServer macOS版

      AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

      AnyDesk macOS版
      AnyDesk macOS版

      AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

      WINDOWS 更多
      讯飞绘文 网页版
      讯飞绘文 网页版

      讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

      Maya(Autodesk Maya) Windows版
      Maya(Autodesk Maya) Windows版

      Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

      Aperty Windows版
      Aperty Windows版

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      火山引擎 网页版
      火山引擎 网页版

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      立刻MV 网页版
      立刻MV 网页版

      立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

      蛙蛙写作 网页版
      蛙蛙写作 网页版

      蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

      讯飞智作 网页版
      讯飞智作 网页版

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      超级简历WonderCV 网页版
      超级简历WonderCV 网页版

      超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

      音述AI 网页版
      音述AI 网页版

      音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

      AionClaw Windows版
      AionClaw Windows版

      AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

      Loomy Windows版
      Loomy Windows版

      Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

      AirServer Windows版
      AirServer Windows版

      AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。