Java--多态和抽象类

目录

  • 多态
    • 实现多态的条件
    • 重写
    • 重写和重载
    • 静态绑定和动态绑定
    • 向上转型和向下转型
      • 向上转型
      • 向下转型
        • instanceof
  • 抽象类

多态

在Java中多态就是在完成一件事的时候,不同人去完成产生的结果不同
比方说打印,我们就是要打印一个东西,如果我们交给彩色打印机,那么会打印出来彩色的,而交给黑白打印机的话则会打印出来黑白的。

实现多态的条件

  1. 有继承关系
  2. 子类会重写父类的方法
  3. 会发生向上转型
    在Java中的体现则是,当代码运行时,传递不同的类对象时返回的结果不同。

重写

重写(覆盖),子类对父类非静态,非private,非final的方法的核心部分进行重新编写

  1. 重写时,方法名字不可以变,返回类型不可以改变,参数列表不可以改变。只可以更改核心部分的代码。
  2. 对于修饰方法的修饰符可以有变化,但是就是子类的访问权限不能低于父类的访问权限。
  3. 返回类型也可以修改,只不过需要构成父子类关系,如下:父类中的返回值类型为A,子类的返回值类型为B,两者构成了父子关系,所以可以修改返回类型。
class A {public A eat() {return new A();}
}
class B extends A {@Overridepublic B eat() {return new B();}
}
  1. 我们可以在重写方法的时候,在方法上加上注解@Override,这个注解的作用就是帮助我们检查,我们方法名写没写错等。

重写和重载

这个知识点也经常被作为面试题,当然很多学校也很喜欢考,在以前的文章中介绍过重载,在这就不过说了。
在这里插入图片描述

重载是在一个类中呈现多态性
重写是在父类和子类继承的时候呈现多态性

静态绑定和动态绑定

静态绑定:也可以称为前期绑定(早绑定),在编译的时候,根据用户传递的参数来确定调用哪个方法。(方法重载就是典型的静态绑定)
动态绑定:后期绑定(晚绑定),在编译的时候并不能确定方法的行为,只有真正运行的时候才能知道方法具体是执行哪个类的哪个方法。(向上转型就发生了动态绑定)

向上转型和向下转型

向上转型

向上转型:创建一个子类对象,再将其赋值给父类。小范围转向大范围

父类 对象名 = new 子类();
Eg:Animal animal = new cat();

我们来谈一谈向上转型的内部原理:我在这画了一个大概的图,希望你们能看懂。
在这里插入图片描述

看上图,我们应该有了些许了解,那么我们也可以知道,对于子类而言,在堆中存储的子类对象有两部分:继承下来的和子类自己的内容。下面重点来喽!
向上转型调用的到底是父类的还是子类的呢
1.由于我们进行了向上转型,所以定义的变量只可以访问子类的继承的部分内容。
2 .由于向上转型发生了动态绑定,所以当调用子类父类同名的方法的时候,本来该调用父类的,但由于执行时会调用子类的。
3 .由于向上转型只可以访问子类的继承部分,所以根本访问不到子类特有的方法。(这也就是向上转型的一大弊端)。

这里借鉴我看过的博主的一个图片,我感觉这个图片很好,很方便理解。
在这里插入图片描述
向上转型可以用下面三种方法来应用。
1.直接赋值
2.方法传参
3.作为返回值
有这三种场景可以发生向上转型,我们来看代码吧

class Animal {String name;int age;public Animal(String name, int age) {this.name = name;this.age = age;}public void eat() {System.out.println(name + "吃饭");}
}
class Cat extends Animal {public Cat(String name, int age) {super(name,age);}@Overridepublic void eat() {System.out.println(name + "吃鱼");}
}
class Dog extends Animal {public Dog(String name, int age) {super(name,age);}@Overridepublic void eat() {System.out.println(name + "吃骨头");}
}
public class JavaSE730 {//2.通过参数来向上转型,用父类来接受,可以介绍任何的子类public static void eatFood(Animal a){a.eat();}//3.当成返回值来向上转型public static Animal buyAnimal(String var){if("狗" == var){return new Dog("狗狗",1);}else if("猫" == var){return new Cat("猫猫", 1);}else{return null;}}public static void main(String[] args) {Animal cat = new Cat("元宝",2); // 1. 直接赋值:子类对象赋值给父类对象Dog dog = new Dog("小七",3);eatFood(cat);eatFood(dog);//2.将子类dog对象传过去,那边用Animal接收,也发上向上转型}
}

向下转型

我们上面提到了,向上转型的话,我们不能访问子类独有的内容,而我们有时又想要访问独有的内容,这就引出来了向下转型。向下转型即将父类引用对象还原为子对象。

Cat cat = new Cat("元宝",2);
Animal animal = cat;//向上转型
cat = (Cat)animal;//向下转型

向下转型并不常用,因为不安全。如果原来子类为猫,向上转型后再向下转型为猫没有问题,因为原来就为猫类;但是假设原来为狗类向下转型为猫类则就出错了,这也正是不安全的地方。狗一定是动物而动物并不一定是狗。

instanceof

如果向下转型的时候子类不对应的话,会抛出异常,在Java中我们可以通过instanceof进行处理异常。

if(animal instanceof Cat){//判断向上转型时的子类是否为cat,是进行下面操作
cat = (Cat)animal;
cat.mew();
}

抽象类

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

上面那个了解就可以,下面内容才是重要的!
1.被abstract修饰的类为抽象类,被abstract修饰的方法为抽象方法,抽象方法不用有方法体并且要有分号。

abstract class A {abstract void func();
}

2.抽象类也可以包含普通方法和属性,也可以有构造方法。
3.抽象类不可以进行实例化。
4.抽象类存在的意义就是被继承。
5.抽象方法不可以被private修饰,也不能被final和static修饰,因为抽象方法要保证能重写。
6.抽象类不可以被final修饰,要保证抽象类能被继承。
7.抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰。
8.抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

性能提升20%,字节跳动HTTPDNS从中心下沉到边缘

摘要:本文介绍了HTTPDNS服务从中心迁移至边缘详细的落地过程。主要内容为: HTTPDNS下沉边缘实践遇到的挑战,包括服务放置、流量调度 HTTPDNS下沉边缘解决方案 从性能、成本出发,谈谈HTTPDNS下沉边缘后的收益 传统的DNS流程中…

微信小程序-获取手机号:HttpClientErrorException: 412 Precondition Failed: [no body]

问题: 412 异常就是你的请求参数获取请求头与服务器的不符,缺少请求体! 我的问题: 我这里获取微信手机号的时候突然给我报错142,但是代码用的是原来的代码,换了一个框架就噶了! 排查问题&am…

java算法day27

java算法day27 动态规划初步总结509 斐波那契数杨辉三角打家劫舍完全平方数 动态规划初步总结 如果你感觉某个问题有很多重叠子问题,使用动态规划是最有效的。 动态规划的过程就是每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心了。贪心是…

鄂维南院士:人工智能的零数据、小数据、大数据和全数据方法

源自: 中国计算机学会 注:若出现无法显示完全的情况,可 V 搜索“人工智能技术与咨询”查看完整文章 人工智能、大数据、多模态大模型、计算机视觉、自然语言处理、数字孪生、深度强化学习 课程也可加V“人工智能技术与咨询”报名参加学习 致…

android java socket server端 可以不断的连接断开,不断的收发 TCP转发

adb.exe forward tcp:5902 tcp:5902 前面本地5901 转发到 后面设备为5902查看转发 adb forward --list删除所有转发 adb forward --remove-allpublic static final String TAG "Communicate";private static boolean isEnable;private final WebConfig webConfig;//…

四步教你快速解决UE5文件迁移失败❗️

本期作者:尼克 易知微3D引擎技术负责人 不知道大家在用UE5迁移文件时,有没有发现这个问题:如果文件输出的路径选择了非项目路径,那么UE会提示无法迁移。在UE4中,这样做是不存在问题的,只要选择「忽略」就可…

Studying-代码随想录训练营day48| 739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II

第48天,单调栈part01,栈的特殊应用场所!编程语言:C 目录 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II 总结: 739. 每日温度 文档讲解:代码随想录每日温度 视频讲解:手撕每日…

AI识别智能称重-收银系统源码

系统概况 专门为零售行业的连锁店量身打造的收银系统,适用于常规超市、生鲜超市、水果店、便利店、零食专卖店、服装店、母婴用品、农贸市场等类型的门店使用。同时线上线下数据打通,线下收银的数据与小程序私域商城中的数据完全同步,如商品…

什么是数据血缘?怎么做好数据血缘分析?

目录 一、什么是数据血缘? 二、数据血缘关系的四大特征 三、数据血缘分析怎么做? 1.定义元数据模型 2.收集元数据 3.建立血缘关系模型 4.追踪数据流动 5.可视化分析 6.集成到数据治理中 7.持续更新和维护 8.应用分析结果 四、数据血缘技术趋势 1.通用的血…

测试环境领域到测试环境产品

作者:攻心 去年之前,阿里巴巴的淘天集团测试环境是以领域方式运作:不局限测试环境治理本身,从测试模式方法论及用好测试环境思路引领集团测试环境治理。领域运作最难的是“统一思想”。业务进一步细分调整后,测试环境治…

修改所属用户/用户组——chown

目录 (1)修改所属用户 (2)修改所属用户组 (3)修改所属用户和用户组 (4) 选项 -R 使用 chown 可以修改文件/文件夹的所属用户,所属用户组; 当然与 chmod …

数字人直播系统搭建能力评测!3招教你快速摸清源码厂商的真实实力?

随着数字人直播的应用场景不断拓展和应用频率的持续升高,其所蕴含着的市场前景和收益潜力逐渐显现,连带着数字人直播系统搭建的热度也迎来了新的高潮。在此背景下,作为非科班和研发资源有限的创业者们主要的入局途径,各大数字人源…

C++原创系列创斯人工智能Trons10.0.135.7911最新概念版本预告及思路总结

这次更新删掉了以前的所有代码,重新编写,只因我有了新的思路,以前的思路太过于原始,我的思路中的聊天功能如下 这只是聊天函数的原理,聊天函数对一句话的回答有5个到10个,在主函数中多次运行这个函数&#…

ruoyi vue3版本web端隐藏侧边栏及其顶部导航栏

做项目时有个需求是在web端里面嵌入一个页面全屏的大屏,但若依web自带的侧边栏导航和顶部导航一时还不知道怎么隐藏起来,于是在网上到处查找资料,终于,还是在若依的gitee文档中发现了线索 怎么隐藏侧边栏和顶部导航栏实现完全的全…

<数据集>工程机械识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:6338张 标注数量(xml文件个数):6338 标注数量(txt文件个数):6338 标注类别数:7 标注类别名称:[Excavator, Loader, Dumb_truck, Mobile_crane, Roller, Bull_dozer, …

微信小程序之使用智能对话服务,客服回复的跳转小程序指定页面链接无效

在微信小程序中使用了微信智能对话服务&#xff0c;客服回复的是小程序指定页面的链接&#xff0c;无法正确跳转&#xff0c;而是返回到进入客服时的页面去了 解决方案&#xff1a; 需在小程序的客服组件 button 上添加 bindcontact 监听事件即可 <movable-area class"…

【ROS 最简单教程 007/300】ROS 架构 - 目录解析 增删改查 计算图

⭐ 工作空间目录解析如下 &#xff1a; WorkSpace --- 自定义的工作空间|--- build:编译空间&#xff0c;用于存放 CMake 和 catkin的 缓存信息、配置信息和其他中间文件|--- devel:开发空间&#xff0c;用于存放编译后生成的目标文件&#xff0c;包括头文件、动态&静态链接…

MySQL基础练习题14-产品销售分析1

题目&#xff1a;获取 Sales 表中所有 sale_id 对应的 product_name 以及该产品的所有 year 和 price 。 准备数据 分析数据 题目&#xff1a;获取 Sales 表中所有 sale_id 对应的 product_name 以及该产品的所有 year 和 price 。 准备数据 ## 创建库 create database db;…

DNS查询服务器的基本流程以及https的加密过程

DNS查询服务器的基本流程&#xff0c;能画出图更好&#xff0c;并说明为什么DNS查询为什么不直接从单一服务器查询ip&#xff0c;而是要经过多次查询&#xff0c;多次查询不会增加开销么&#xff08;即DNS多级查询的优点&#xff09;&#xff1f; 用户发起请求&#xff1a;用户…

Linux 修改磁盘挂载的目录路径

确认新路径地址&#xff0c;能找到&#xff0c;或者mkdir新创建新路径&#xff0c;考虑权限 #查看当前挂载情况 df -h 卸载已经挂载的目录 umount /media/vdtest #挂载新目录 mount /dev/vdb /mnt #查询/dev/vdb的UUID blkid /dev/vdb #修改 fstab文件实现开机自动挂载&…