当前位置: 首页 > news >正文

抽象类、比较器和接口

一.抽象类

1.抽象类的概念:如果一个类中没有包含足够的信息来描述一个具体的对象,这样的类就是抽象类。(图例说明:)

2.抽象方法的概念:当一个方法被abstract来修饰,此时代表着这个方法可以不进行实现,此时的方法就成为抽象方法。

3.抽象类:如果一个类当中,包含抽象方法,此时这个类就必须是抽象类。但是没有抽象方法,这个类也可以写为抽象类。

4.当不能描述一个具体的对象的时候,这个类可以被定义为抽象类。

5.抽象类中定义的成员和普通类没有区别。

6.抽象类不可以被实例化,所以抽象类是为了被继承。

7.当一个普通类继承这个抽象类之后,必须重写抽象类当中的抽象方法。

8.抽象类也可以发生多态:

9.此时抽象方法也要满足重写的条件。(被final 或者 static 或者 private修饰的方法不能重写的)

10.当一个普通类A继承了一个抽象类,不想重写这个这个抽象类的方法,此时可以把普通类A改为抽象类,但是如果抽象类A被普通类B继承了,那么B中就要重写A继承的抽象类中的方法和A中抽象的方法。

二.接口(实现某种功能)

1.概念:多个类的公共规范。

2.定义接口使用关键字interface。

3.接口当中的成员变量默认为public static final修饰的,所以定义的时候必须初始化。(这里的public static final也是可以省略的)

4.接口当中的方法默认是public abstract修饰的。(抽象方法是没有具体实现的)

5.接口当中使用default和static修饰的方法可以具体实现。(test3也是可以重写的只是没有进行演示)

6.接口和抽象类一样不能被实例化。        

7.接口需要被类实现,需要使用关键字implements实现(implements就是让类实现接口)

8.当一个类实现了一个接口,那么这个类就要重写这个方法。

9.接口可以发生向上转型,也可以发生动态绑定,也可以发生多态。

10.接口当中不能有静态代码块 实例代码块 和 构造方法。

11.接口虽然不是类,但是编译完成之后字节码文件的后缀格式也是.class。

12.实现多个接口:

13.接口解决了多继承的问题: (若需要继承父类需要先extends再implements)

14.这里还可以让使用者忘记类型,有了接口就可以不用关注具体类型,而只关注某个类是否具有这个功能。

15.接口也可以使用extends来扩展:

16.用接口来完成引用数据类型的比较:(要重写Comparable中的方法)

17.字符串的比较大小要用compareTo:(这里的compareTo和上述重写的compareTo不一样)

18.Compareble接口有局限性,一旦这个类写死了一种比较方式,后期就不能随意进行更改。

三.Clonable接口(任何一个类默认都是继承于Object类的)

1.由于要使用Object中的clone方法是protected,那么这个访问修饰限定符是最多只能在不同包的子类中访问的。所以我们只能通过super来访问它的克隆方法。

2.在自定义类中重写一个clone方法:

3.这里保存是因为这是调用的Object这个父类的方法,所以这里需要向下转型。        

4.还报错的原因是异常的这个原因,这个在后面异常课件中讲解。

5.正确的话就是这样的:

6.代码正确但是运行报错:

7.解决方法是必须一个克隆的接口:

8.这个接口为什么没有抽象方法:(在我们使用这个接口的时候都没有重写方法)

9.因为此时这个接口叫做空接口或者标记接口。当这个接口被实现了,才能证明有被克隆这个功能。

10.克隆示意图:

四.比较器

1.比较器的实现:(年龄比较器)

2.比较器中也有要重写的方法:

3.比较器这个类中有了这个功能后的重写方法:

4.比较器的用法:(先实例化比较器的类对象,在通过比较器的类来调用重写的方法,传入引用就可以进行比较)

五.Arrays.sort方法和比较器联动

1.这是Arrays.sort里面的参数,目前先简单的理解为可以传入一个数组和一个Comparator

2.使用自己的Comparator来排序:

3.此时我们把nameComparator传入Arrays.sort中时,就是发生了向上转型,使排序使通过我们重写的compare进行的。这里就发生了动态绑定。

六.深浅拷贝

1.浅拷贝:

浅拷贝会通过克隆过的对象来改变原来的数据。

2.深拷贝:在上述的浅拷贝中,money的值会被克隆后的对象进行修改,是因为在拷贝之后试student2中克隆过来的是age=10和m中存储money的地址。m的地址又指向了money就与student1中的m中存储的money的地址是一样的。所以在student2中修改money的值也会把student1中的money的值改变。所以就需要让m也进行一次克隆,也就是深拷贝了。

3.深拷贝的实现:首先我们需要让money类和student类一样来实现接口,才能使用克隆。

然后我们在student的类中来克隆m。(因为其中调用clone都是Object类中的方法,所以需要调用父类的方法,然后我们这里是通过子类来调用父类的方法,那么就是向下转型)

示意图:

七.接口和抽象类的区别

1.核心区别:抽象类中可以包含普通的字段和方法,在子类中可以被直接调用(不需要重写)。而接口中并不存在普通方法,每一个方法都是抽象方法,并且字段都是public static final修饰的,子类也必须重写接口中所有的抽象方方法。

2.图表:

相关文章:

  • 基于Java+VUE+echarts大数据智能道路交通信息统计分析管理系统的设计与实现
  • 在Ubuntu 16.04上安装最新版本的MySQL的方法
  • 基于单片机8路数字电压表电压采集系统
  • 服务器开通个人账户
  • Jenkins: fontconfig head is null, check your fonts or fonts configuration;
  • PostgreSQL的表碎片
  • 从0新建一个微信小程序实现一个简单跳转
  • label标签,for属性与input的id属性相匹配
  • UE(网络)
  • excel导出图片---HSSFWorkbook--SXSSFWorkbook
  • <Rust>iced库(0.13.1)学习之部件(三十):button部件的使用
  • 为什么vue加载select大量数据会使页面造成卡顿
  • upsample nearest 临近上采样实现方式
  • taobao.item_get_appAPI接口原app数据测试指南
  • unity安装报错问题记录
  • Angular 响应式表单 基础例子
  • echarts花样作死的坑
  • ES6核心特性
  • FastReport在线报表设计器工作原理
  • iOS 系统授权开发
  • MySQL用户中的%到底包不包括localhost?
  • Python 基础起步 (十) 什么叫函数?
  • Python语法速览与机器学习开发环境搭建
  • Service Worker
  • Yeoman_Bower_Grunt
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 大数据与云计算学习:数据分析(二)
  • 代理模式
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 学习Vue.js的五个小例子
  • 一个SAP顾问在美国的这些年
  • 7行Python代码的人脸识别
  • MPAndroidChart 教程:Y轴 YAxis
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​一些不规范的GTID使用场景
  • #07【面试问题整理】嵌入式软件工程师
  • #WEB前端(HTML属性)
  • (1)(1.11) SiK Radio v2(一)
  • (2)Java 简介
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (70min)字节暑假实习二面(已挂)
  • (二)c52学习之旅-简单了解单片机
  • (分布式缓存)Redis分片集群
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Core 中插件式开发实现
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET简谈设计模式之(单件模式)
  • .net下简单快捷的数值高低位切换
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @RequestBody与@ModelAttribute