广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java全面分析面向对象之多态
  • 591
分享到

Java全面分析面向对象之多态

2024-04-02 19:04:59 591人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录多态的理解向上转型向上转型的三种形式动态绑定和静态绑定方法的重写进一步认识和理解多态多态的优点多态的理解 什么是多态呢??从字面理解就是多种形态,也就是不同类实例化出来的对象调用

多态的理解

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

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

向上转型

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

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

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这个对象就可以调用方法和属性。

那何为向上转型呢???

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

我们利用代码理解一下:

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

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

向上转型的三种形式

第一种:直接赋值

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

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

第二种:作为方法参数:

  第三种作为返回值:

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

但如果我把父类的方法变成我要吃猫粮呢?那结果毫无意外就是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方法。

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

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

动态绑定和静态绑定

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

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

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

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

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

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

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

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

方法的重写

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

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

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

 我们也可以一键生成重写 

 有几个注意事项:

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

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

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

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

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

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

  • 被private,final修饰的方法不能被重写。
  • 被staitc修饰的方法也不能被重写。
  • @override 可以检查你重写的方法名是否正确,最好要加上。
  • 方法重写一定满足方法名相同,参数列表相同,返回值相同。

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

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

进一步认识和理解多态

场景:画一个图形

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方法。

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

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

  • 要在继承体系下
  • 子类要对父类的方法进行重写
  • 通过父类的引用调用重写的方法 

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

多态的优点

优点:

  • 能够降低代码的 "圈复杂度", 避免使用大量的 if - else
  • 如果使用多态, 则不必写这么多的 if - else 分支语句, 代码更简单.
  • 可扩展能力更强

缺点:

  • 代码的运行效率降低

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

到此这篇关于Java全面分析面向对象之多态的文章就介绍到这了,更多相关Java多态内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java全面分析面向对象之多态

本文链接: https://www.lsjlt.com/news/147321.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java全面分析面向对象之多态
    目录多态的理解向上转型向上转型的三种形式动态绑定和静态绑定方法的重写进一步认识和理解多态多态的优点多态的理解 什么是多态呢??从字面理解就是多种形态,也就是不同类实例化出来的对象调用...
    99+
    2022-11-13
  • Java面向对象之多态实例分析
    这篇文章主要介绍“Java面向对象之多态实例分析”,在日常操作中,相信很多人在Java面向对象之多态实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java面向对象之多态实例分析”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • Java面向对象之多态的示例分析
    这篇文章主要介绍Java面向对象之多态的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!public class Polymorphism {public static&...
    99+
    2023-06-02
  • Java全面分析面向对象之继承
    目录继承什么是继承呢?子类访问父类的成员变量子类访问父类非同名成员变量子类访问父类同名成员变量子类访问父类的成员方法子类访问父类的非同名方法子类访问父类的同名方法super关键字su...
    99+
    2022-11-13
  • Java全面分析面向对象之封装
    目录什么是封装呢封装的好处意义getter方法和setter方法toString方法面向对象封装之包自定义包什么是封装呢 封装就是一种将数据和操作数据的方法进行有机结合,一种函数抽象...
    99+
    2022-11-13
  • java面向对象之多态
    多态的简单理解:student类继承了Person类,则student类的对象既是student又是person类多态性具有两种展现的形式:1.方法的多态性:(1)方法的重载:同一个方法可以根据传入的参数的类型或者个数的不同实现不同的功能(...
    99+
    2019-03-28
    java入门 java 面向对象 多态
  • python 面向对象之多态
    多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。那么,多态的...
    99+
    2023-01-30
    面向对象 多态 python
  • Java 面向对象 之 多态实例2
    转载于 : http://www.verejava.com/id=16992846385655 public class Polymorphism3 {public static&...
    99+
    2023-06-02
  • Java面向对象之如何实现多态
    这篇文章主要介绍了Java面向对象之如何实现多态,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。转载于 : http://www.verejava.com/id=16...
    99+
    2023-06-02
  • 详解Java面向对象编程之多态
    目录Java面向对象编程之多态一.对于多态的理解:二.多态的实现方法总结Java面向对象编程之多态 一.对于多态的理解: 通俗点理解,多态其实就是一词多义,就是一种方法的多种状态,即...
    99+
    2022-11-12
  • Java面向对象之多态的用法示例
    小编给大家分享一下Java面向对象之多态的用法示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!public class Polymorphi...
    99+
    2023-06-02
  • Java面向对象之数组的示例分析
    这篇文章主要介绍Java面向对象之数组的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java面相对象之数组一维数组数组的说明:相同类型数据的组合。说明:①数组是引用数据类型,数组的元素可以是基本数据类型也可...
    99+
    2023-06-02
  • JAVA 面向对象之多态的知识点有哪些
    本篇内容介绍了“JAVA 面向对象之多态的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 概念多态是面向对象程序设计(OOP...
    99+
    2023-07-02
  • java面向对象的示例分析
    这篇文章主要介绍了java面向对象的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Java特效1、简单性人们希望构建一个无须深奥的专业训练就可以进行编程的系统,并...
    99+
    2023-06-29
  • 详解Java面向对象之多态的原理与实现
    目录何为多态代码实现多态理解何为多态 定义: 多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。系统在运行时(而非编译时),...
    99+
    2022-11-13
  • 新手小白入门必学JAVA面向对象之多态
    目录1. 概念2 . 特点3. 练习:多态入门案例4. 多态的好处5. 多态的使用6. 练习:多态成员使用测试7 拓展7.1 设计汽车综合案例7.2 多态为了统一调用标准7.3 静态...
    99+
    2022-11-13
  • java面向对象——多态的详细介绍
    一、概述多态是继封装、继承之后,面向对象的第三大特性。生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也是不一样的。可见,同一行为,通过不同的事物,可以体现出来的不同的形态。多态,描述的就是...
    99+
    2020-05-09
    java入门 java 面向对象 多态
  • java面向对象继承与多态介绍
    目录一.概述  二.继承2.1 继承的概述2.2 继承机制2.3 类中属性,方法的继承与覆盖2.4 super 关键字三. 多态总结一.概述 ...
    99+
    2022-11-12
  • Python 面向对象 组合-多态与多态
    面向对象-组合 1.什么是组合   组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 1 class Foo: 2 xxx = 111 3 4 class Bar: 5 yyy = 222 6...
    99+
    2023-01-30
    多态 组合 面向对象
  • 深入浅析java中面向对象的继承和多态
    深入浅析java中面向对象的继承和多态?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。继承和多态一.this super关键字this: 可以在构造器中的第一代码中...
    99+
    2023-05-31
    java 继承 多态
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作