【多态-动态绑定-向上转型-抽象类】

文章目录

  • 静态绑定
  • 动态绑定
  • 多态的具体实现
  • 向上转型
  • 多态的优缺点
  • 抽象类
    • 抽象类的作用
  • 总结


静态绑定

重载就是典型例子
在这里插入图片描述

动态绑定

在这里插入图片描述

多态的具体实现

//多态
class Animal{public String name;public int age;//无参构造方法public Animal() {}//有参构造方法public Animal(String name,int age) {this.name = name;this.age = age;}//成员方法public void eat(){System.out.println(this.name+"正在吃饭");}}
class Dog extends Animal {//子类构造完成之前要帮助父类构造完成public Dog(String name, int age) {super(name, age);}//重写eat方法public void eat() {System.out.println(this.name + "正在吃狗粮");}
}
class Cat extends Animal {//子类构造完成之前要帮助父类构造完成public Cat(String name, int age) {super(name, age);}//重写eat方法public void eat() {System.out.println(this.name + "正在吃猫粮");}
}
public class Test {//多态的第一种public static void func(Animal animal){animal.eat();//向上转型中的方法传参}public static void main(String[] args) {Dog dog = new Dog("红红",12);func(dog);Cat cat = new Cat("青青",13);func(cat);}//多态的第二种public static void main2(String[] args) {Animal animal = new Dog("红红",12);//向上转型中的直接赋值animal.eat();Animal animal2 = new Cat("青青",13);animal2.eat();}}

在这里插入图片描述

向上转型

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

animal是父类类型,但可以引用一个子类对象,因为是从小范围向大范围的转换。

【使用场景】
例如上面的代码中

  1. 直接赋值
    例如上面的代码
Animal animal = new Dog("红红",12);
  1. 方法传参
    例如上面的代码
   public static void func(Animal animal){animal.eat();}
  1. 方法返回
//  作返回值:返回任意子类对象
public static Animal buyAnimal(String var){
if("狗".equals(var) ){
return new Dog("狗狗",1);
}else if("猫" .equals(var)){
return new Cat("猫猫", 1);
}else{
return null;
}
}

总结:
向上转型的优点:让代码实现更简单灵活。
向上转型的缺陷:不能调用到子类特有的方法

多态的优缺点

【使用多态的好处】

  1. 能够降低代码的 “圈复杂度”, 避免使用大量的 if - else
  2. 可扩展能力更强
    如果要新增一种新的形状, 使用多态的方式代码改动成本也比较低

【多态缺陷】
3. 代码的运行效率降低。
4. 属性没有多态性
当父类和子类都有同名属性的时候,通过父类引用,只能引用父类自己的成员属性
5. 构造方法没有多态性

【避免在构造方法中调用重写的方法】
尽量不要在构造器中调用方法(如果这个方法被子类重写, 就会触
发动态绑定, 但是此时子类对象还没构造完成), 可能会出现一些隐藏的但是又极难发现的问题。

抽象类

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
在这里插入图片描述

1.被abstract修饰的类叫做抽象类
2.被abstract修饰的方法叫做抽象方法
3.抽象类不可以实例化

在这里插入图片描述
4.当一个普通类继承了抽象类,那么需要重写这个抽象类中的所有抽象方法!!

abstract class Shape{public abstract void draw();
}
class Cycle extends Shape{@Overridepublic void draw() {System.out.println("⚪");}
}

如果不继承 ,子类也是抽象类,必须要使用 abstract 修饰

abstract class C{public abstract void draw();
}
abstract class A extends C {abstract public void run();
}
class B extends A{@Overridepublic void draw() {}@Overridepublic void run() {}
}

总结:抽象类的出现就是为了被继承

abstract class Shape{public abstract void draw();
}
class Cycle extends Shape{//重写抽象类的抽象方法@Overridepublic void draw() {System.out.println("⚪");}
}class Rect extends Shape{//重写抽象类的抽象方法@Overridepublic void draw() {System.out.println("矩形");}
}
public class Test {public static void func(Shape shape){shape.draw();}public static void main(String[] args) {Shape shape =new Cycle();Shape shape2 =new Rect();shape.draw();shape2.draw();}
}

7.abstract 和final 是天敌,不能共存
8.private 、static 也不可以修饰 抽象方法

抽象类的作用

在这里插入图片描述

总结

继承多态之间涉及到的子类构造方法,向上转型,动态绑定,以及抽象类和继承的关系等等知识还是挺复杂的,多写写代码思路会清晰些。

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

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

相关文章

MySQL Server 5.5 软件和安装配置教程

MySQL 5.5.58(32/64位)下载链接: 百度网盘:百度网盘 请输入提取码 提取密码:7act 软件简介: MySQL 是由瑞典MySQL AB 公司开发一个关系型数据库管理系统,目前属于 Oracle 旗下产品。MySQL 是最…

代码没注释?一个方法几百行?

干程序员的都有接收别人的代码的经历,大部分时候,我们都会偷偷骂一句“这人是傻逼吧,这代码写的这么烂!” “一个方法写几百行,还没有注释,鬼知道写的什么东西!” 现在,你不需要为…

__707设计链表

单向链表设计 package 日常Java程序测试.代码随想录.链表;public class __707设计链表__单向链表设计 {class MyLinkedList {//我们首先需要自己定义属性出来int val;MyLinkedList next;int size; //记录链表大小//MyLinkedList() 初始化 MyLinkedList 对象。public MyLinke…

2.flink编码第一步(maven工程创建)

概述 万里第一步,要进行flink代码开发,第一步先整个 flink 代码工程 flink相关文章链接 flink官方文档 两种方式 一种命令行 mvn 创建,另一种直接在 idea 中创建一个工程,使用 mvn 的一些配置 mvn命令行创建 mvn 创建flink工程&…

吴恩达《机器学习》1-4:无监督学习

一、无监督学习 无监督学习就像你拿到一堆未分类的东西,没有标签告诉你它们是什么,然后你的任务是自己找出它们之间的关系或者分成不同的组,而不依赖于任何人给你关于这些东西的指导。 以聚类为例,无监督学习算法可以将数据点分成…

《微习惯》-微习惯策略的八大规则

绝不要自欺欺人满意每一个进步经常回报自己,尤其在完成微习惯之后保持头脑清醒感到强烈抵触时,后退并缩小目标提醒自己这件事很轻松绝不要小看微步骤用多余精力超额完成任务,而不是制定更大目标

LeetCode383. Ransom Note

文章目录 一、题目二、题解 一、题目 Given two strings ransomNote and magazine, return true if ransomNote can be constructed by using the letters from magazine and false otherwise. Each letter in magazine can only be used once in ransomNote. Example 1: I…

接口测试,一篇搞定

大多数人对于接口测试都觉得是一种高大上的测试,觉得学会接口测试就可以从小白测试员,变成了高级测试员,但其实接口测试只是测试的基础内容 什么是接口 接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体)&…

9、电路综合-基于简化实频的任意幅频响应的微带电路设计

9、电路综合-基于简化实频的任意幅频响应的微带电路设计 网络综合和简化实频理论学习概述中的1-8介绍了SRFT的一些基本概念和实验方法,终于走到了SRFT的究极用途,给定任意响应直接综合出微带电路。 1、任意幅频响应的微带电路设计用途 我们演示了采用…

Django的静态文件目录(路径)如何配置?

通常用下面的三条语句配置Django的静态文件目录 STATICFILES_DIRS [os.path.join(BASE_DIR, static)] STATIC_URL /static/ STATIC_ROOT os.path.join(BASE_DIR, /static)那么这三条语句分别的作用是什么呢? 请参考博文 https://blog.csdn.net/wenhao_ir/articl…

STM32单片机智能小车一PWM方式实现小车调速和转向

目录 1. 电机模块开发 2. 让小车动起来 3. 串口控制小车方向 4. 如何进行小车PWM调速 5. PWM方式实现小车转向 1. 电机模块开发 L9110s概述 接通VCC,GND 模块电源指示灯亮, 以下资料来源官方,具体根据实际调试 IA1输入高电平&#xff…

添加主仓库后报错error: remote upstream already exists.

可能的原因 远程名 upstream 已经被使用: 这通常意味着你在之前已经添加了一个名为 upstream 的远程仓库。 解决方案 检查现有的远程仓库: 运行 git remote -v 来查看所有配置的远程仓库。这个命令会列出所有远程仓库的URL,你可以检查是否已…

视频分辨率/帧率/码率选择参考

1. 视频码率与分辨率的参考表 1080*720的分辨率,用5000K左右; 720*576的分辨率,用3500K左右; 640*480的分辨率,用1500K左右。 2. 计算公式 基本算法:码率(kb…

部署vuepress项目到githubPage

部署vuepress项目到githubPage 1. 项目文件夹下有两个分支(main和gh-page) 1.1 main分支存放项目代码 1.2 gh-page分支存放 npm run docs:build之后的dist里面的所有文件 2. 分别提交到github上 3. 你的项目/docs/.vuepress/config.js module.export…

3.1每日一题(定积分求压力问题)

公式: (1) 压力等于压强乘以面积 (2) 压强等于ρgh(即密度,重力加速度,水的深度) 注:题目表面不一样,实际的原理都一样,做透一道题等于做懂一类题

FLinkCDC

序言 CDC 是 Change Data Capture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动(包括数据或数据表的插入、更新以及删除等),将这些变更按发生的顺序完整记录下来,写入到消息中间件中…

论文阅读——InstructGPT

论文:Training_language_models_to_follow_instructions_with_human_feedback.pdf (openai.com) github:GitHub - openai/following-instructions-human-feedback 将语言模型做得更大并不能从本质上使它们更好地遵循用户的意图。例如,大型语…

光学仿真|优化汽车内部照明体验

当我们谈论优化人类感知的内部照明时,我们实际上指的是两个重点领域:安全性和驾驶员体验。如果内部照明可以提供尽可能最佳的体验,驾驶员则能够更好地应对颇具挑战性或意外的驾驶状况,并且减轻疲劳感。除了功能优势外,…

Vue 3 响应式对象:ref 和 reactive 的使用和区别

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是尘缘,一个在CSDN分享笔记的博主。📚📚 👉点击这里,就可以查看我的主页啦!👇&#x…

【深度学习】吴恩达课程笔记(二)——浅层神经网络、深层神经网络

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 笔记链接 【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础 吴恩达课程笔记——浅层神经网络、深层神经网络 四、浅层神经网络1.双层神经网络表示2.双层神经网络的前向传播第一层前向传播第二层前…