Java多态

目录

1.多态是什么?

2.多态的条件 

3.重写

3.1重写的概念

3.2重写的作用

3.3重写的规则

4.向上转型与向下转型

4.1向上转型

4.2向下转型

5.多态的优缺点

5.1 优点

5.2 缺点


面向对象程序三大特性:封装、继承、多态。


1.多态是什么?

概念:

        简单的说就是一个对象有多种形态,具体点说多态就是父类中的属性和方法被子类继承后,可以具有不同的数据类型或不同的行为,使父类中的同一个属性和方法在父类与各个子类具有不同的含义。

举例:

如下图:子类都继承了父类,但同一个eat方法在不同父类子类中表现不同行为就是多态。


2.多态的条件 

三大条件:

  1. 继承:必须存在继承;
  2. 重写:子类必须对父类中的方法进行重写;
  3. 向上转型:通过父类的引用调用子类的重写的方法;
class Animal{
    public String name;
    public int age;
    public void eat(){
        System.out.println(this.name + "吃饭");
    }

    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
class Dog extends Animal{ //继承
@Override   //重写               
    public void eat() { //向上转型
        System.out.println(this.name + "吃狗粮");
    }
    public void sleep(){
        System.out.println(this.name + "在睡觉");
    }

    public Dog(String name, int age) {
        super(name, age);
    }
}
class Cat extends Animal{ //继承
    @Override   //重写 
    public void eat() { //向上转型
        System.out.println(this.name + "吃猫粮");
    }
    public void sleep(){
        System.out.println(this.name + "在睡觉");
    }

    public Cat(String name, int age) {
        super(name, age);
    }
}
public class Test1 {
    public static void eat(Animal animal){
        animal.eat();
    }
    public static void main(String[] args) {
        Cat cat = new Cat("花花",1);
        Dog dog = new Dog("多多",2);
        eat(cat);
        eat(dog);
    }
}

上述代码满足了多态的三个条件,并实现了多态。


3.重写

3.1重写的概念

        重写(override):又称覆盖,在子类中创建一个与父类具有相同的返回值类型、方法名、参数列表的方法,以实现与父类不同的行为。

3.2重写的作用

        子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强,满足子类的需求。

3.3重写的规则

  • 参数列表必须完全与被重写的方法参数列表相同;
  • 返回的类型必须与被重写的方法的返回类型相同;
  • 访问权限不能比父类中被重写方法的访问权限更低(public>protected>default>private);
  • 重写方法一定不能抛出新的检査异常或者比被重写方法声明更加宽泛的检査型异常;
  • 不能重写静态、private修饰、final修饰、构造方法等;
  • 父类的成员方法只能被它的子类重写。

2中代码就构成了重写。

注意:

        避免在构造方法中调用重写的方法,不然可能会造成一些隐藏的问题。

4.向上转型与向下转型

4.1向上转型

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

        格式: 父类类型  对象名  =  new 子类类型();

        例如:

Animal cat = new Cat("多多",1);
//向上转型,将Cat类型转换为Animal类型
//小范围向大范围的转换

        这段代码就是直接赋值实现向上转型,2中代码就是通过方法传参来实现向上转型,然后也可以通过方法返回来实现向上转型。

优点:让代码实现更灵活简单;

缺点:不能调用子类特有的方法;

4.2向下转型

        当子类对象向上转型后,将无法调用子类中的方法,如果我们想调用子类特有的方法,我们就可以使用向下转型,将父类引用还原成子类对象即可。

        向下转型有的时候不太安全,例如:一个狗类对象向上转型转换为动物类,在向下转型的时候不一定转换为狗类,可能转换为猫类等,所以当我们向下转型的时候要加上强制转换符。

        有的时候也会造成抛出异常,所以Java中引入了instanceof,如果结果为true,则可以安全转换。

public class Test{
  public static void main(String[] args) {
    Cat cat = new Cat("花花",2);
    Dog dog = new Dog("多多", 1);
    // 向上转型
    Animal animal = cat;
    animal.eat();
    animal = dog;
    animal.eat();
    if(animal instanceof Cat){
      cat = (Cat)animal;
      cat.mew();
   }
    if(animal instanceof Dog){
      dog = (Dog)animal;
      dog.bark();
   }
 }
}

5.多态的优缺点

5.1 优点

举例:

//假如打印一个形状
class Shape {
  //属性....
  public void draw() {
    System.out.println("画图形!");
 }
}
class Rect extends Shape{
  @Override
  public void draw() {
    System.out.println("♦");
 }
}
class Cycle extends Shape{
  @Override
  public void draw() {
    System.out.println("●");
 }
}
class Flower extends Shape{
  @Override
  public void draw() {
    System.out.println("❀");
 }
}
//不使用多态
public static void drawShapes() {
  Rect rect = new Rect();
  Cycle cycle = new Cycle();
  Flower flower = new Flower();
  String[] shapes = {"cycle", "rect", "cycle", "rect", "flower"};
 
  for (String shape : shapes) {
    if (shape.equals("cycle")) {
      cycle.draw();
   } else if (shape.equals("rect")) {
      rect.draw();
   } else if (shape.equals("flower")) {
      flower.draw();
   }
 }
}
//使用多态
public static void drawShapes() {
  // 我们创建了一个 Shape 对象的数组.
  Shape[] shapes = {new Cycle(), new Rect(), new Cycle(),
           new Rect(), new Flower()};
  for (Shape shape : shapes) {
    shape.draw();
 }
}
//我们可以明显看出使用多态的好处
  •  能够降低代码的 "圈复杂度", 避免使用大量的 if - else;
  • 可扩展能力更强,如果要新增一种新的形状, 使用多态的方式代码改动成本也比较低;

5.2 缺点

  • 属性没有多态性,当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性;
  • 构造方法没有多态性;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/5700.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

七结(4.2)遍历集合与javaFX界面

今天由学长学界们进行了一次授课,算是温习了一遍面向对象的知识,同时配置了关于javaFX的环境,以及一些关于项目的知识。 java学习总结: Collection的遍历: 迭代器遍历(Iterator):…

leetcode 87. Scramble String(扰乱字符串)

scramble(字符串s) 算法: s长度为1时结束。 s可以拆分成2部分x和y,sxy, 这两部分可以交换,也可以不交换,即 s xy 或 s yx. 上面scramble还会递归作用于x 和 y. 给出相同长度的字符串s1, s2, 问s2是否可通过scramble(s1)获得。 …

WTW-16P 应用电路

1、WTW-16P 按键控制 PWM 输出应用电路 软件设置: 按键控制模式。 I/O 口定义: 选取 I/O 口 P00、P01、P02、P03 作为触发口,在编辑 WT588D 语音工程时,把触发口的按键定义为可触发播放的触发方式,就可进行工作。 BUS…

如何提高网站安全防护?

网站的安全问题一直是很多运维人员的心头大患,一个网站的安全性如果出现问题,那么后续的一系列潜在危害都会起到连锁反应。就好像网站被挂马,容易遭受恶意请求呀,数据泄露等等都会成为杀死网站的凶手。 1、让服务器有一个安全稳定…

百度双塔召回引擎MOBIUS

1. 概述 对于一个搜索或者推荐系统来说,分阶段的设计都是当下的一个标配,主要是为了平衡效率和效果,在百度的广告系统中,也是分成了如下的三层结构: 最上层的Matching阶段负责从全库中找到与query相关的候选集&#x…

KD2511N系列微电阻测试仪

一、产品概述 KD2511N系列微电阻测试仪是一款对变压器、电机、开关、继电器、接插件等各类直流电阻进行测试的仪器。其基本测试精度最高可达 0.05%,并具有较高的测量速度。 KD2511N微电阻测试仪使用了高精度恒流流经被测件以及四端测量,有效的消除了 引线…

Kafka 如何保证消息的消费顺序

文章目录先直接给出答案吧。在集群或者多partition下无法保障完全顺序消费,但是可以保障分区顺序消费。具体下面讲解。我们在使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序,比如我们同时发了 2 个消息,这 2 个消息对应的操作…

蓝桥杯——根据手册写底层

一、 DS18B20温度传感器 1.官方所给源码 /* # DS1302代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求,进行代码…

ssm入门

文章目录1.介绍ssm2.Spring篇基础内容🪅什么是IOC(控制反转)Spring和IOC之间的关系IOC容器的作用以及内部存放IoC入门案例📬DI(Dependency Injection)依赖注入依赖注入的概念IOC容器中哪些bean之间要建立依…

函数微分和导数的定义

1.我们先来看可导的定义: 相信这个大家都看的懂。 2.接下来我们看可微的定义: 你们有没用想过为什么会有可微,他是用来干什么的,我们接下来看下面这张图,特别是结合图2-11来说, 我们可以看到书上说可微是在…

【day2】Android Jetpack Compose环境搭建

【day2】Android Jetpack Compose环境搭建 以下是适用于 Jetpack Compose 的环境要求: Android Studio 版本:4.2 Canary 15 或更高版本Gradle 版本:7.0.0-beta02 或更高版本Android 插件版本:4.2.0-beta15 或更高版本Kotlin 版本…

MySQL 幻读问题

承接上文MySQL多版本并发控制MVCC实现原理 幻读现象 因为在RR(可重复读)隔离级别里,事务1的第二次查询没有生成新的readview,而是用的第一次查询时生成的readview,所以第二次查询返回2条数据,而不是3条数据…

看过来,这里有JavaScript技术干货?

今天是一篇正经的技术分享,针对JavaScript技能的十来个专业小技巧,如果你想提升一下JS方面的能力成为一个更好的前端开发人员,那么就可以接着看下去哦。 1、使用逻辑运算符进行短路评估 您可以使用逻辑运算符进行短路评估,方法是…

云边协同与人工智能AI的深度融合(云端训练、边端推理)

在面向物联网、大流量等场景下,为了满足更广连接、更低时延、更好控制等需求,云计算在向一种更加全局化的分布式节点组合形态进阶,边缘计算是其向边缘侧分布式拓展的新触角。 以物联网场景举例,设备产生大量数据,上传到…

都2023了,学习自动化测试还有必要么?会不会浪费我时间

最近收到不少小伙伴私信提问,其中问得比较多的就是“学习自动化测试有那么重要吗?”。 我的回答是肯定的——很重要。 相信不少同学都有诸如此类的疑问,例如:“日常工作中好像用不上自动化?”、“手工点点点好像也可…

【从零开始学习 UVM】9.1、UVM Config DB —— UVM Resource database 资源库详解

文章目录 resource 是一个参数化的容器,可以保存任意数据。资源可用于配置组件、为序列提供数据或在TestBench不同部分之间启用信息共享。它们使用作用域信息(scope)存储,因此其可见性可以限制在TestBench的某些部分中。您可以将任何数据类型放入资源数据库中,并使另一个组…

若依后端管理系统学习日志

文章目录遇到的问题1. 自定义模块404解决方案1. 自定义后台异常返回2. 添加导入按钮3. 树形列表搜索遇到的问题 1. 自定义模块404 idea没有报错,但是点击进去页面显示404。 F12查看错误信息,原来是访问后端controller接口没有成功,找不到导…

上传文件—ajax

目录 一、上传图片文件 1.写基本html 完成页面主框架 2.script部分 2-0 主框架 上传文件按钮被点击触发事件 2-1验证使得否选择文件 2-2 介绍 FormData 2-3 监听onreadystatechange事件 小结 二、实现上传文件进度条 1. 在bootstrap找进度条组件 2.script 完成进度条算法…

Java锁深入理解2——ReentrantLock

前言 本篇博客是《Java锁深入理解》系列博客的第二篇,建议依次阅读。 各篇博客链接如下: Java锁深入理解1——概述及总结 Java锁深入理解2——ReentrantLock Java锁深入理解3——synchronized Java锁深入理解4——ReentrantLock VS synchronized Java锁…

QT Qwidget 事件处理机制

qlineEdit Qt事件处理是指在Qt应用程序中处理各种事件的过程。事件是指在应用程序中发生的各种操作,例如按键、鼠标点击、窗口移动等。Qt提供了一个事件处理机制,使得开发者可以对这些事件进行处理,以实现应用程序的各种功能。 Qt中的事件处…