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

抽象类、比较器和接口

一.抽象类

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.图表:


http://www.kler.cn/a/319964.html

相关文章:

  • Jira中bug的流转流程
  • Android 12.0 息屏休眠后立即启动屏保功能实现
  • 数字化时代,传统代理模式的变革之路
  • 基于机器学习的用户健康风险分类及预测分析
  • Java设计模式——单例模式(特性、各种实现、懒汉式、饿汉式、内部类实现、枚举方式、双重校验+锁)
  • 如何在谷歌浏览器中设置自定义安全警告
  • 大象机器人资料整理
  • /etc/init.d/mysql
  • 将上一篇的feign接口抽取到公共api模块(包含feign接口示例)
  • 如何在 macOS 上恢复未保存的 Excel 文件 – 文件恢复的最佳方法
  • 运维工程师面试整理-安全常见安全漏洞及修复
  • 31214324
  • 【延时队列的实现方式】
  • Leetcode 1396. 设计地铁系统
  • CentOS 7 aarch64制作openssh 9.9p1 rpm包 —— 筑梦之路
  • 如何在数据分析中处理异常?
  • 模块化编程实战:光敏传感器控制蜂鸣器(江科大stm32练习)
  • 【C#】 EventWaitHandle的用法
  • EchoMimic模型部署教程
  • Swagger 教程(笔记) Knife4j
  • 怎么利用PHP发送彩信
  • layui如何获取当前地址栏的某个参数
  • String类常用的方法
  • linux命令之docker用法
  • uni-app安装插件
  • Rust 运算符快速了解