Java面向对象之多态

 更新时间:2021年10月23日 11:51:00   作者:执久呀  
这篇文章主要介绍了Java面向对象之多态,文章以什么是多态、多态的实现条件、多态的访问特点、多态的优点和缺点的相关资料展开文章内容,需要的小伙伴可以参考一下

一、前言

前面我们了解和学习了继承的使用,现在我们来学习三大面向对象之一的多态。

多态使java面向对象丰富起来,所以学好多态十分重要。

二、什么是多态?

这个问题其实是显然的,从字面上看,也是多种状态,其实没错,多态就是在

不同情况表现出来的不同状况,叫多态。

 比方说我们可以说,🍉是水果,也可以说,🍉是🍉 ((华强买🍉🤭)

是动物,也可以说,🐂是🐂(有人可能会问这是什么🐂🐎)

💸这里西瓜和牛有两种不同状态,这个就是多态。

三、多态的实现条件

  • 🌤①有(继承/实现)关系
  • 🌤②有方法重写
  • 🌤③有(父类/接口)引用指向(子类/实现)对象

解读

  • 💸①有(继承/实现)关系(说明这里有子类父类或者接口的实现)
  • 💸② 有方法的重写(重写抽象方法,或者重写父类中的方法) 
  • 💸 ③有(父类/接口)引用指向(子类/实现)对象(说明有父类/接口 对象名= new 子类/实现 )

四、多态的访问特点

  • 🐟成员方法:编译看左边,执行看右边
  • 🐟成员变量:编译看左边,执行看左边

解读:①所谓编译看左边,就是在语法问题上,看new的左边(父类或者接口)

有没有此方法或者变量, 如果有则编译通过,反之则不通过

② 执行就是最终结果看,比如,在方法中执行时看右边就是看new的右边,

就是说 对象调用的时候,子类和父类都有此方法时,以子类中的方法为结果。

接口我们这篇未涉及到,所以这次我们用继承的方式类实现多态。

1.我们建一个service包放Animal类

package service;
 
public class Animal {
    public String name="动物";
    public void eat(){
        System.out.println("动物吃东西");
    }
    public void sleep(){
        System.out.println("动物要💤");
    }
}

2.再servic包下建一个impl包,包下放Cat类

因为我们要继承Animal类,而Animal在与之不再 同一个包所以需要导包(导包就是

告诉程序我要用的这个在哪里)

package service.impl;
 
import service.Animal;//导包
 
public class Cat extends Animal {
    public String name="猫";
    @Override
    public void eat() {//重写父类的方法
        System.out.println("🐱吃🐟");
    }
    public void play(){
        System.out.println("🐱玩毛球");
    }
}

3.我们在建一个controller包,在里面建一个动物测试类

import service.Animal;//导包
import service.impl.Cat;
 
public class AnimalController {
    public static void main(String[] args) {
           //多态创建对象
        Animal a=new Cat();//父类引用指子类对象
        a.eat();
        a.sleep();
        System.out.println("名字:"+a.name);
    }
}
 


4.弄完之后我们程序一运行

如图:

 看结果,可以知道,方法的编译看做左边,执行看右边,成员的编译看做左边,

执行看左边也就是,在方法中,以子类方法为主,在变量上,以父类的变量为主。

当父类有该方法,而子类没有该方法时,此时,结果时父类的方法。

 4.1为什么两个有区别呢?

其实主要的原因时方法有重写,而成员变量则没重写(变量不能重写)

五、多态的优点和缺点?

  •  🗡多态的优点:是提高了扩展性,子类可以在父类的基础上进行扩展。
  •  🗡 多态的缺点:就是不能访问子类的中的成员变量和成员方法。

解决方法:后期涉及

其实只要通过继承,实现时,子类所含有的方法是最多的,此时我们通过子类

创建对象,就可以访问所有成员(非子类的私有成员除外)

如图:

import service.Animal;
import service.impl.Cat;
 
public class AnimalController {
    public static void main(String[] args) {
 
        Cat c=new Cat();//通过子类创建对象
        c.eat();
        c.sleep();
        c.play();
        System.out.println("名字:"+c.name);
    }
}

六、为什么要分开建包

🗡有人不解,在同一个包下建就不用导包了,就没那么麻烦了,确实这话一点问题

都没有,但是我们要养成这种开建包的好习惯,以便于在代码很多的时候,便于

排查错误。因为写代码向来都是写时一时爽,找bug时满脸苦。为了防止这种情况

我们要养成分开建包的好习惯。

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

相关文章

  • Spring中@Configuration和@Component注解的区别及原理

    Spring中@Configuration和@Component注解的区别及原理

    这篇文章主要介绍了Spring中@Configuration和@Component注解的区别及原理,从功能上来讲,这些注解所负责的功能的确不相同,但是从本质上来讲,Spring内部都将其作为配置注解进行处理,需要的朋友可以参考下
    2023-11-11
  • 详解如何在SpringBoot中优雅地重试调用第三方API

    详解如何在SpringBoot中优雅地重试调用第三方API

    在实际的应用中,我们经常需要调用第三方API来获取数据或执行某些操作,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 详解Java数组的一维和二维讲解和内存显示图

    详解Java数组的一维和二维讲解和内存显示图

    这篇文章主要介绍了Java数组的一维和二维讲解和内存显示图,数组就相当于一个容器,存放相同类型数据的容器。而数组的本质上就是让我们能 "批量" 创建相同类型的变量,需要的朋友可以参考下
    2023-05-05
  • 详解Java编写算法时如何加快读写数据速度

    详解Java编写算法时如何加快读写数据速度

    这篇文章主要为大家详细介绍了Java在编写算法时如何加快读写数据速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • SpringBoot多数据源配置详细教程(JdbcTemplate、mybatis)

    SpringBoot多数据源配置详细教程(JdbcTemplate、mybatis)

    这篇文章主要介绍了SpringBoot多数据源配置详细教程(JdbcTemplate、mybatis),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java中的回调

    Java中的回调

    这篇文章主要介绍了Java中回调的相关资料,帮助大家更好的理解和学习java,感兴趣的朋友可以了解下
    2020-08-08
  • 打包SpringBoot程序为exe的案例教程

    打包SpringBoot程序为exe的案例教程

    这篇文章主要介绍了打包SpringBoot程序为exe的案例教程,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-12-12
  • SpringBoot调用第三方接口的几种方式小结

    SpringBoot调用第三方接口的几种方式小结

    在项目中调用第三方接口时,确实需要根据项目的技术栈、架构规范以及具体的业务需求来选择最适合的调用方式,下面我们就介绍几种调用第三方接口的实现方式以及代码示例,需要的朋友可以参考下
    2024-07-07
  • @RequestBody 部分属性没有转化成功的处理

    @RequestBody 部分属性没有转化成功的处理

    这篇文章主要介绍了@RequestBody 部分属性没有转化成功的处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • jxl操作excel写入数据不覆盖原有数据示例

    jxl操作excel写入数据不覆盖原有数据示例

    网上很多例子,都是用Jxl读或者写excel,本文实现的功能就是将数据源in.xls的第几行第几列数据写入到out.xls的第几行第几列,不覆盖out.xls其他原有的数据。
    2014-03-03

最新评论