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

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

2、然后是实现类EmpsComparator

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

3、测试

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

4、输出

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

(2)Comparable接口

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

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

    http://www.wocaoseo.com/thread-98-1-1.html        随着b2c的崛起,越来越多的企业已经放弃挂在第三方面台销售,而是选择去建独立的商场,拥有一个属于自已 ...

  2. python小白入门基础(四:浮点型和布尔型)

    # Number (int float bool complex)# (1) float 浮点型 也就是小数# 表达方式一floatvar = 0.98print(floatvar)print(typ ...

  3. ACwing 你能回答这些问题吗(线段树求最大连续字段和)

    给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤ymaxx≤l≤r≤y{∑ri=lA[i]∑i=l ...

  4. ASP调用WEBSERVICE并对返回结果进行解析时遇到的问题

    项目上用动易平台做新闻发布网站,动易平台是用ASP做的,期间需要根据当前登录的用户,取其他系统比如OA的待办事项进行列表展示,OA组的同事给了我一个WSDL接口,百度了很多ASP调用webservic ...

  5. 初识ABP vNext(9):ABP模块化开发-文件管理

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 创建模块 模块开发 应用服务 运行模块 单元测试 模块使用 最后 前言 在之前的章节中介绍过ABP扩展实体,当时在用户 ...

  6. xss原理解析

    xss->跨站脚本攻击 xss是指攻击者在网页中嵌入客户端脚本.通常是指javascript编写的一个危险代码,当用户使用浏览器浏览网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的. ...

  7. .net MVC4.0项目发布到阿里云虚拟主机中遇到的问题。

    正所谓学以致用,今天本来想做个bootstrap的demo发到服务器上看一下效果,结果服务器搞了半天,最终太晚了没能学到什么东西. 首先写好页面之后我做了一个MVC4.0的网站项目,然后把Bootst ...

  8. js中数组Array对象的方法sort()的应用

    一. sort()方法的介绍 //给一组数据排序 var arrNum = [12,1,9,23,56,100,88,66]; console.log("排序前的数组:"+arrN ...

  9. Spring Boot 所有相关的配置信息

    加载顺序 如上图所示,图片是从官网上截取的,这些配置信息都会加载,只不过顺序在前的会覆盖掉后面的 上图的所有配置信息都会以(key,value)的形式加载到Spring中的Environment中,也 ...

  10. native到CPU

    Native 所谓的native准确的说是借由虚拟机实现的JNI接口调用的操作系统提供的API JNI使得class中的ACC_NATIVE标至的方法能借由JNI类的实例转换为JNI规范(如全限定名) ...