Java se的语言特征之多态

目录

  • 满足多态的条件
  • 动态绑定第一步
  • 动态绑定第二步
  • 动态绑定第三步
  • 参数列表,返回类型,访问修饰限定符区别
  • 有动态绑定,那是不是有静态绑定
  • 向下转型
  • 抽象类
  • 接口
    • 实现多个接口(先继承再接口,接口用",")

满足多态的条件

定义:去完成某个状态的时候,当不同的对象去完成的时候会产生不同状态(通俗理解为看人下菜)

满足多态的条件:
1>必须在继承关系上,才可以向上转型
2>子类和父类有同名的覆盖(重写)方法
3>通过父类对象的引用,去调用这个重写的方法
完成以上的三个部分,就会发生动态绑定,动态绑定为多态的基础

通过父类的引用,只能调用父类自己独有的属性,方法,构造方法

动态绑定第一步

向上转型:子类定义的变量,方法给父类

Dog dog = new Dog("小黄",8);
Animal animal = dog;
Animal animal = new Dog("小黄", 8);

这个被称为直接赋值型
是通过animal这个引用指向了dog这个引用所指向的对象

传参时候进行向上转型(方法的参数)

public static void func1(Animal animal){}
public static void main(String [ ] args){Dog dog = new Dog("小黄",8);func1(dog);
}

返回值进行向上转型

public static Animal func2( ){Dog dog = new Dog("小黄", 8);return dog;
}

动态绑定第二步

public static Animal func2( ){System.out.println(this.name + "吃饭");
}
@Override(可以在此写注释,起到防止错误作用)
public void eat( ){System.out.println(this.name + "吃狗粮");
}

注意:
1>在这里面,返回值,方法名以及参数链表要相同
2>被重写的访问修饰限定符,子类一定要大于父类
3>被private修饰的方法不可重写
4>被static修饰的方法不可以重写
5>被final修饰的方法不可重写
6>构造方法不可以重写

动态绑定第三步

Animal animal  = new Dog("小黄",8);
animal eat( );

在产生了重写以后,animal忽然就变成了调用子类的eat.这个过程就叫做动态绑定

父类与子类也可以构成重写,被称为协变类型

public Dog eat( ){System.out.println(this.name + "吃饭");return null;
}
public Animal eat( ){System.out.println(this.name + "吃狗粮");
}

所有的父类,默认都是Object类

public static void eatFun(Animal animal){animal.aet( );
}
public static void main(String [ ] args){Dog dog  = new Dog("小黄", 8);eatFun(dog);Cat cat = new Cat("三月",6);eatFun(cat);
}

当父类的引用,引用的子类对象不一样的时候,调用这个重写的方法,表现出的行为是不一样的,我们把这种思想叫做多态

参数列表,返回类型,访问修饰限定符区别

在这里插入图片描述

有动态绑定,那是不是有静态绑定

add(int a, int b)
add(int a, int b, int c)
main( ){add(1, 2);add(1, 2 ,3);
}

这上面这种就是静态绑定

向下转型

顾名思义,就是父类给子类

Animal animal = new Dog("小黄", 8 );
//狗可以为一个动物
Animal animal = new Cat ("三月", 6);
//猫也可以为一个动物Animal animal = new Dog("小黄", 8 );
Dog dog = animal;
//但是在这个里面,动物不一定是狗,
//所以向下转型是不安全的Animal animal = new Dog ("小黄", 8 );
Dog dog = (Dog) animal;
//因为本身不安全的,所以这里要进行强转
dog.bark( );Cat cat = (Cat)animal;
cat.miaomaio( );
//这里的话就会错,因为animal在上面是引用对象为Dog,
//所以dog可以成功转型,Cat就不可以

在父类的构造方法里面,可以调用子类和父类重写的方法,此时会调用子类的方法,此时也会发生动态绑定,但是注意,不可以这么写

抽象类

abstract class Shape{public abstract void draw( );
}

1>abstract修饰的类,方法为抽象类(方法)
2>抽象类不可以实例化一个对象
3>抽象类中可以和普通类一样,定义方法和变量
4>当一个普通类继承了抽象类,那么要重写这个抽象类中的抽象方法
5>抽象类的出现就是为了被继承
6>abstract 和 final 是天敌,不可以共存
7>被private static 修饰的这个抽象方法也不可以

接口

语法:
1>interface方法来修饰的(就是创建方法时候,把class换成interface)
2>接口中不可以被实现的方法,只有抽象方法(static , deafult修饰的不受限制)
3>接口中的抽象方法,默认都是public abstarct 修饰的
4>接口中的成员变量,默认都是public static final修饰的
5>接口不能进行实例化
6>类和接口之间的关系,可以使用implements来进行关联
7>接口也有对应的字节码文件

注意:
1>接口中的方法不可以在接口中实现,只能由实现接口的类来实现
2>接口中不能包含构造方法,以及静态代码块

实现多个接口(先继承再接口,接口用",")

interface A{void test A( );
}
interface B extends A{void test B( );
}

这个里面的话,B也具备了A的功能,但是后面用接口B的时候,B和A都要重新实现

2个关系
1>类与接口之间的关系,用implements
2>接口与接口之间的关系,用extends

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MTK Android13 user版本进入engineermode的Bluetooth测试项时闪退

平台:MT6771 android13 问题描述:进入到工模,点击进入Bluetooth测试项直接闪退 Log如下: 07-31 10:15:51.480 3605 3605 D EM/EmUtils: getEmAidlService ... 07-31 10:15:51.481 398 398 I servicemanager: Could not fin…

42、JSON 函数

目录 1. json 的两个常用方法 json.dumps()方法 :把python对象编码为json字符串 json.loads()方法:把json字符串编码成python对象 1. json 的两个常用方法 json 的存在有两种形式。 一种是:对象的形式存在,我们叫它 json 对象。…

36V H 桥有刷直流驱动芯片GC8870 GC8871 GC8872的数据选型分析

36V H 桥驱动芯片GC8870 GC8871 GC8872都可替代TI的DRV8870/8871/8872,宽电压,内置电荷泵,短地短电源保护,限流等功能,可应用于水泵,扫地机器人,开关等产品中

数据库系统 --- 关系模型

一、关系模型的数据结构以及形式化定义 1.关系 域:一组具有相同数据结构的值的集合。 笛卡尔积:域上的一种集合运算。多个集合做笛卡尔积的结果是每个集合取一个元素组合得到的一个新的集合。 域的基数:一个域上允许的不同取值的个数。 关系&…

mac 安装anaconda和lightgbm

mac安装anaconda不要去清华大学的anaconda的安装包列表去下载安装包, 去[官网](Free Download | Anaconda)下载, 清华的版本太老了, 老到脸conda 安装lightgbm都不只支持 安装好anaconda 后, 能用conda install xxx 的尽量不用pip install 其他的不知道, 用pip install ligh…

护眼台灯为什么护眼?适合备考使用的台灯推荐

台灯是大家生活中必不可少的一盏灯具,尤其是当夜幕降临时,许多仍然需要工作、或者学习的人,都要使用台灯来提供充足的照明环境。如今随着生活的高度发展,大家对台灯的要求也愈发精进了一步,不仅需要能够提供照明的&…

报表控件FastReport .NET v2024功能演示—更改图图片形状

报表生成器FastReport .NET 是适用于.NET Core 3,ASP.NET,MVC和Windows窗体的全功能报告库。使用FastReport .NET,您可以创建独立于应用程序的.NET报告。 FastReport .net下载(qun:585577353)https://www.e…

webpack的使用

一、5 大核心概念 entry(入口) 指示 Webpack 从哪个文件开始打包 output(输出) 指示 Webpack 打包完的文件输出到哪里去,如何命名等 loader(加载器) webpack 本身只能处理 js、json 等资源…

配电箱安全检查

配电箱怎么检查,如何识破电箱安全隐患? (1)一物一码:每个配电箱都有独一无二标识二维码,巡检人员到达现场扫码即可填写巡检记录,查看配电箱的参数、负责人、操作规则等信息; &#x…

如何用PHP写一个1688平台下的商品API接口代码?

一 定义 PHP(全称:Hypertext Preprocessor)是一种广泛用于开发Web应用程序的服务器端脚本语言。它是一种开源的编程语言,特别适用于快速构建动态网页和Web应用程序。 在PHP中,您可以使用1688商品API接口来获取和操作…

韵达速递查询,韵达速递单号查询,对需要的单号记录进行标记

批量查询韵达速递单号的物流信息,对需要的单号记录进行标记。 所需工具: 一个【快递批量查询高手】软件 韵达速递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主界面左上角…

starknet学习资料汇集这一篇就够了(持续更新)

文章目录 官方资料wtf starknet学习资料Starknet Astro 社区官方资料 starknet-foundry 官方github:https://github.com/foundry-rs/starknet-foundry 官方文档:https://foundry-rs.github.io/starknet-foundry/ https://book.cairo-lang.org/zh-cn/index.html https://boo…

数据结构:第9关:删除链表中满足区间值的结点

任务描述编程要求 输入输出测试说明来源 任务描述 本关任务:利用单链表表示一个递增的整数序列,删除链表中值大于等于mink且小于等于maxk的所有元素(mink和maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同…

银行如何筛选跨网文件交换产品,提升业务效率?

银行业在我国经济发展和社会运转中承载着举足轻重的作用和意义,进入互联网时代,网络的运算和数据管理能力助力银行业高速发展,但同样带来了一些网络安全隐患,网络攻击、数据窃取、敏感信息泄露等问题影响着银行业的根基。为响应和…

python作业题百度网盘,python123作业答案

大家好,小编来为大家解答以下问题,python作业题百度网盘,python123作业答案,今天让我们一起来看看吧! 完整项目分享: 链接: https://pan.baidu.com/s/1CTMOgLYteLrWRaRnouB0SQ?pwd12hf 提取码: 12hf &…

[Linux 基础] Linux使用git上传gitee三板斧

文章目录 1、使用git1.1 安装git1.2 在Gitee上创建项目1.2.1 使用Gitee创建项目1.2.2 上传本地代码到远端仓库 1.3 git上传三板斧1.3.1 三板斧第一招:git add1.3.2 三板斧第二招:git commit1.3.3 三板斧第三招:git push 1、使用git 1.1 安装…

【教3妹学编程-算法题】下一个更大元素 IV

3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包” 2哥 :3妹,什么事呀这么开发。 3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。 2哥&#x…

商城免费搭建之java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c 鸿鹄云商

鸿鹄云商 SAAS云产品概述 【SAAS云平台】打造全行业全渠道全场景的SaaS产品,为店铺经营场景提供一体化解决方案;门店经营区域化、网店经营一体化,本地化、全方位、一站式服务,为多门店提供统一运营解决方案;提供丰富多…

使用C++和双指针算法移除数组中的元素,且原地移除,不使用额外的空间

输入一个数组nums和一个值val&#xff0c;在该数组中&#xff0c;凡是与val相等的元素全部移除&#xff0c;并最终输出该数组&#xff0c;C代码如下&#xff1a; #include<iostream> #include<vector> #include<ctime>//计算代码所需要的时间 using namespac…

qt 容器QVector,QMap,QHash的常见使用与该迭代器的简单介绍

一. QVector容器是一个动态数组&#xff0c;可以容纳任意数量的元素,在相邻的内存中存储给定的数据类型作为一组数据,在QVector前部或中间位置插入元素都会导致内存中大量的数据元素移动,这使得操作速度会减慢.可使用迭代器对这组数据进行访问. 和其他的容器类型类似,QVector…