<!--此处接上周-->

3、相关接口

对象的排序,可以通过以下两种方法:

1、实现Comparable接口,重写compareTo方法;

2、Comparator<>比较器接口,重写compare方法;

区别:Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比较代码嵌入自身类中,而后者在一个独立的类中实现比较。

(1)Comparator比较器接口

想要对一个类的对象进行排序,需要写一个实现类实现此接口,调用Arrays.sort()或Collection.sort()进行排序,先重写Comparator<>的实现类中的compare方法,然后将排序的规则写在方法中。

compare(T o1,T o2)方法排序规则

例如比较年龄:

o1.getAge()>o2.getAge()返回 1,

o1.getAge()<o2.getAge()返回 -1,

相等返回0,可继续通过其它属性来比较

最后会按照年龄从小到大来输出。

下面举例比较员工类Emps:

1、先写一个员工类

  1. 1 package comparator;
  2. 2
  3. 3 public class Emps {
  4. 4 private String name;
  5. 5 private int age;
  6. 6 private int sal;
  7. 7 public Emps(String name, int age, int sal) {
  8. 8 this.name = name;
  9. 9 this.age = age;
  10. 10 this.sal = sal;
  11. 11 }
  12. 12 public Emps() {}
  13. 13 public String getName() {
  14. 14 return name;
  15. 15 }
  16. 16 public void setName(String name) {
  17. 17 this.name = name;
  18. 18 }
  19. 19 public int getAge() {
  20. 20 return age;
  21. 21 }
  22. 22 public void setAge(int age) {
  23. 23 this.age = age;
  24. 24 }
  25. 25 public int getSal() {
  26. 26 return sal;
  27. 27 }
  28. 28 public void setSal(int sal) {
  29. 29 this.sal = sal;
  30. 30 }
  31. 31 @Override
  32. 32 public String toString() {
  33. 33 return "Emp [ename=" + name + ", age=" + age + ", sal=" + sal + "]";
  34. 34 }
  35. 35 }

2、然后是实现类EmpsComparator

  1.  
  1. 1 package comparator;
  2. 2 import java.util.Comparator;
  3. 3
  4. 4 public class EmpsComparator implements Comparator<Emps> {
  5. 5 @Override
  6. 6 public int compare(Emps o1, Emps o2) {
  7. 7 //比较年龄
  8. 8 if(o1.getAge()>o2.getAge()){
  9. 9 return 1;
  10. 10 }else if(o1.getAge()<o2.getAge()){
  11. 11 return -1;
  12. 12 }else{
  13. 13 //年龄相同,比较工资
  14. 14 if(o1.getSal()>o2.getSal()){
  15. 15 return 1;
  16. 16 }else if(o1.getSal()<o2.getSal()){
  17. 17 return -1;
  18. 18 }
  19. 19 }
  20. 20 return 0;
  21. 21 }
  22. 22 }

3、测试

  1. 1 package comparator;
  2. 2 import java.util.Arrays;
  3. 3
  4. 4 public class Test {
  5. 5 public static void main(String[] args) {
  6. 6 Emps[] emps={
  7. 7 new Emps("佐菲",35,30000),//姓名,年龄,工资
  8. 8 new Emps("赛文",33,28000),
  9. 9 new Emps("杰克",33,25000),
  10. 10 new Emps("艾斯",32,24000),
  11. 11 new Emps("泰罗",30,22000),
  12. 12 };
  13. 13 Arrays.sort(emps,new EmpsComparator());
  14. 14 for (Emps e:emps) {
  15. 15 System.out.println(e);
  16. 16 }
  17. 17 }
  18. 18 }

4、输出

上面代码是通过Arrays.sort(emps,new EmpsComparator())进行排序的,若没有new EmpsComparator()比较规则会显示ClassCastException异常,这默认是从小到大排序的,若想从大到小,只需将返回值1和-1调换。

(2)Comparable接口

此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。

  1. 1 package comparator;
  2. 2
  3. 3 public class Emp implements Comparable<Emp>{
  4. 4 private String name;
  5. 5 private int age;
  6. 6 private int sal;
  7. 7
  8. 8 @Override
  9. 9 public int compareTo(Emp o) {
  10. 10 //比较年龄
  11. 11 if(this.getAge()>o.getAge()){
  12. 12 return 1;
  13. 13 }else if(this.getAge()<o.getAge()){
  14. 14 return -1;
  15. 15 }else{
  16. 16 //年龄相同,比较工资
  17. 17 if(this.getSal()>o.getSal()){
  18. 18 return 1;
  19. 19 }else if(this.getSal()<o.getSal()){
  20. 20 return -1;
  21. 21 }
  22. 22 }
  23. 23 return 0;
  24. 24 }
  25. 25
  26. 26 public Emp(String name, int age, int sal) {
  27. 27 this.name = name;
  28. 28 this.age = age;
  29. 29 this.sal = sal;
  30. 30 }
  31. 31 public Emp() {
  32. 32 }
  33. 33 public String getName() {
  34. 34 return name;
  35. 35 }
  36. 36 public void setName(String name) {
  37. 37 this.name = name;
  38. 38 }
  39. 39 public int getAge() {
  40. 40 return age;
  41. 41 }
  42. 42 public void setAge(int age) {
  43. 43 this.age = age;
  44. 44 }
  45. 45 public int getSal() {
  46. 46 return sal;
  47. 47 }
  48. 48 public void setSal(int sal) {
  49. 49 this.sal = sal;
  50. 50 }
  51. 51 @Override
  52. 52 public String toString() {
  53. 53 return "Emp [ename=" + name + ", age=" + age + ", sal=" + sal + "]";
  54. 54 }
  55. 55
  56. 56
  57. 57 }
  58. 58 package comparator;
  59. 59 import java.util.Arrays;
  60. 60 public class Test {
  61. 61 public static void main(String[] args) {
  62. 62 Emp[] emps={
  63. 63 new Emp("佐菲",35,30000),
  64. 64 new Emp("赛文",33,28000),
  65. 65 new Emp("杰克",33,25000),
  66. 66 new Emp("艾斯",32,24000),
  67. 67 new Emp("泰罗",30,22000),
  68. 68 };
  69. 69 Arrays.sort(emps);
  70. 70 for (Emp e:emps) {
  71. 71 System.out.println(e);
  72. 72 }
  73. 73 }
  74. 74 }

此接口只需用要排序的类来实现它,然后重写compareTo方法即可,关于这个方法里面是用本类对象和其他类对象进行比较,然后测试类中只需写Arrays.sort(emps);即可比较的规则跟Comparator相同

int compareTo(T o) 比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

4、接口总结

让规范和实现分离正是接口的好处,让系统的各组件之间通过接口耦合,是一种松耦合的设计。软件系统各模块之间也应该采用这种面向接口的耦合,为系统提供更好的可扩展性和维护性。

抽象类与接口的区别

1、组成上:抽象类=普通类的组成+【抽象方法】,接口中只能包含抽象方法,常量,静态方法、默认方法。

2、抽象类和接口均不能直接实例化。

3、接口看成是对抽象类的再次抽象。

4、抽象类受到继承单根性的限制,接口可以多继承。

5、接口可以更好的实现多态。接口一般用于系统间的解耦。一般情况使用面向接口编程。

6、接口不包含构造函数;抽象类可以包含构造函数,抽象类里的构造函数并不是用于创建对象,而是让其子类调用这些构造函数来完成属于抽象类的初始化操作。

7、能用接口地方尽量使用而不要使用抽象类。

8、抽象类一般用于模板设计、适配器设计。

今天就总结到这了,下周继续!!!!!奥里给!!!

第三周:java面向对象部分总结(2)的更多相关文章

  1. 实验三《Java面向对象程序设计》实验报告

    20162308 实验三<Java面向对象程序设计>实验报告 实验内容 XP基础 XP核心实践 IDEA工具学习 密码学算法基础 实验步骤 (一)Refactor/Reformat使用 p ...

  2. 2017-2018-2 20165236 实验三《Java面向对象程序设计》实验报告

    2017-2018-2 20165236 实验三<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计            班级:1652 姓名:郭金涛     ...

  3. 2017-2018-2 20165318 实验三《Java面向对象程序设计》实验报告

    2017-2018-2 20165318 实验三<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计        班级:1653班        姓名:孙晓暄  ...

  4. 20155201 实验三《Java面向对象程序设计》实验报告

    20155201 实验三<Java面向对象程序设计>实验报告 一.实验内容 XP基础 XP核心实践 相关工具 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门 ...

  5. 20155218 《Java程序设计》实验三(Java面向对象程序设计)实验报告

    20155218 <Java程序设计>实验三(Java面向对象程序设计)实验报告 一.实验内容及步骤 (一)编码标准 在IDEA中使用工具(Code->Reformate Code) ...

  6. 20165301陈潭飞2017-2018-2 20165301 实验三《Java面向对象程序设计》实验报告

    2017-2018-2 20165301 实验三<Java面向对象程序设计>实验报告 一.敏捷开发与XP实践-1 实验要求: 在IDEA中使用工具(Code->Reformate C ...

  7. 第三周java学习总结

    学号 20175206 <Java程序设计>第三周学习总结 教材学习内容总结 本周为第四章的学习,分为以下几个方面: 1.包与代码组织 2.String类 3.对象创建 4.包装类 经过代 ...

  8. 三、java面向对象编程_1

    目录 一.对象和类的概念 二.对象和引用 1.对象 2.成员变量 3.引用 三.java类的定义 四.构造函数(构造方法) 五.内存分析 一.对象和类的概念 1.对象 对象用计算机语言对应问题域中事物 ...

  9. 20175215 2018-2019-2 第三周java课程学习总结

    第三周 一.使用JDB调试java代码(主要内容为断点) 以下文字内容转自使用JDB调试java程序,图片则为自己的截图 我们提倡在Linux命令行下学习Java编程.学习时在Ubuntu Bash中 ...

  10. 第三记 Java面向对象

    相信很多人都有听到,见到这么一句话:Java是一门面向对象编程的语言,但是又是否对这句话有了自己的理解呢? 一.面向对象 面向对象是一种新兴的程序设计方法,也可以说是一种新的程序设计规范(paradi ...

随机推荐

  1. 借助FRP反向代理实现内网穿透

    一.frp 是什么? frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP.UDP.HTTP.HTTPS 等多种协议.可以将内网服务以安全.便捷的方式通过具有公网 IP 节点的中转暴露到公 ...

  2. Nginx Ingress on TKE 部署最佳实践

    概述 开源的 Ingress Controller 的实现使用量最大的莫过于 Nginx Ingress 了,功能强大且性能极高.Nginx Ingress 有多种部署方式,本文将介绍 Nginx I ...

  3. windows 下编译libcurl

    因为linux平台采用了libcurl,有一个程序移植到到windows平台,再linux采用libcurl.在windows下准备也采用该库.在网上搜索了几位同行写的,步骤上面有缺失. 本文将以详细 ...

  4. 由mv命令引发的对inode的思考

    一场机器迁移引起的思考 最近团队一台机器老化了,准备做全量迁移,一不小心,就把100多个G的/data目录放到了新机器的/data/data目录下,上愁了,怎么削减一层data目录呢?难倒像Windo ...

  5. .net core 返回业务错误(不抛异常)

    在开始之前你需要知道: 1.通过抛异常--全局捕获异常的方式返回业务错误信息性能是非常差的(不知道为什么的可以百度一下) 2.如何将错误信息绑定到mvc模型验证中 自定义返回内容 //返回内容接口 p ...

  6. P1073 最优贸易 分层图+最长路

    洛谷p1073 最优贸易 链接 首先易得暴n2的暴力,暴力枚举就行 显然1e5的数据是会炸的 我们再分析题意,发现一共分为两个个步骤,也可以说是状态,即在一个点买入,在另一个点卖出,我们可以构建一个三 ...

  7. 水仙花数的条件:1.是一个三位数,2.个百千位数字的3次方加起来的和等于当前的三位数。如果,想要完美一点可以在外部加while循环

    #!/usr/bin/env python# -*- coding: utf-8 -*-print("请输入三位数:")num = input()# 定义常量SumNum = 0# ...

  8. 发布jar包到服务器读取resource目录下文件

    * 解决:当项目打包成jar之后resources路径下面的证书文件访问不到* 思路:* 1.运行时先复制一个jar* 2.将复制的jar解压到jar文件目录* 3.删除复制的jar跟解压的非证书文件 ...

  9. Redis统计访问量方法

    1.统计客户忘问量 2.查询某位ID客户是否登录 一亿用户,统计数据10M左右,比较省空间 set usercount 0 设置一个变量,用于记录客户访问量setbit usercount 2 0   ...

  10. JWT伪造攻击

    JWT修改伪造攻击 什么是JWT? JSON Web Token(JSON Web令牌)是一种跨域验证身份的方案.JWT不加密传输的数据,但能够通过数字签名来验证数据未被篡改(但是做完下面的WebGo ...