第三周:java面向对象部分总结(2)
<!--此处接上周-->
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)的更多相关文章
- 实验三《Java面向对象程序设计》实验报告
20162308 实验三<Java面向对象程序设计>实验报告 实验内容 XP基础 XP核心实践 IDEA工具学习 密码学算法基础 实验步骤 (一)Refactor/Reformat使用 p ...
- 2017-2018-2 20165236 实验三《Java面向对象程序设计》实验报告
2017-2018-2 20165236 实验三<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652 姓名:郭金涛 ...
- 2017-2018-2 20165318 实验三《Java面向对象程序设计》实验报告
2017-2018-2 20165318 实验三<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:孙晓暄 ...
- 20155201 实验三《Java面向对象程序设计》实验报告
20155201 实验三<Java面向对象程序设计>实验报告 一.实验内容 XP基础 XP核心实践 相关工具 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门 ...
- 20155218 《Java程序设计》实验三(Java面向对象程序设计)实验报告
20155218 <Java程序设计>实验三(Java面向对象程序设计)实验报告 一.实验内容及步骤 (一)编码标准 在IDEA中使用工具(Code->Reformate Code) ...
- 20165301陈潭飞2017-2018-2 20165301 实验三《Java面向对象程序设计》实验报告
2017-2018-2 20165301 实验三<Java面向对象程序设计>实验报告 一.敏捷开发与XP实践-1 实验要求: 在IDEA中使用工具(Code->Reformate C ...
- 第三周java学习总结
学号 20175206 <Java程序设计>第三周学习总结 教材学习内容总结 本周为第四章的学习,分为以下几个方面: 1.包与代码组织 2.String类 3.对象创建 4.包装类 经过代 ...
- 三、java面向对象编程_1
目录 一.对象和类的概念 二.对象和引用 1.对象 2.成员变量 3.引用 三.java类的定义 四.构造函数(构造方法) 五.内存分析 一.对象和类的概念 1.对象 对象用计算机语言对应问题域中事物 ...
- 20175215 2018-2019-2 第三周java课程学习总结
第三周 一.使用JDB调试java代码(主要内容为断点) 以下文字内容转自使用JDB调试java程序,图片则为自己的截图 我们提倡在Linux命令行下学习Java编程.学习时在Ubuntu Bash中 ...
- 第三记 Java面向对象
相信很多人都有听到,见到这么一句话:Java是一门面向对象编程的语言,但是又是否对这句话有了自己的理解呢? 一.面向对象 面向对象是一种新兴的程序设计方法,也可以说是一种新的程序设计规范(paradi ...
随机推荐
- 借助FRP反向代理实现内网穿透
一.frp 是什么? frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP.UDP.HTTP.HTTPS 等多种协议.可以将内网服务以安全.便捷的方式通过具有公网 IP 节点的中转暴露到公 ...
- Nginx Ingress on TKE 部署最佳实践
概述 开源的 Ingress Controller 的实现使用量最大的莫过于 Nginx Ingress 了,功能强大且性能极高.Nginx Ingress 有多种部署方式,本文将介绍 Nginx I ...
- windows 下编译libcurl
因为linux平台采用了libcurl,有一个程序移植到到windows平台,再linux采用libcurl.在windows下准备也采用该库.在网上搜索了几位同行写的,步骤上面有缺失. 本文将以详细 ...
- 由mv命令引发的对inode的思考
一场机器迁移引起的思考 最近团队一台机器老化了,准备做全量迁移,一不小心,就把100多个G的/data目录放到了新机器的/data/data目录下,上愁了,怎么削减一层data目录呢?难倒像Windo ...
- .net core 返回业务错误(不抛异常)
在开始之前你需要知道: 1.通过抛异常--全局捕获异常的方式返回业务错误信息性能是非常差的(不知道为什么的可以百度一下) 2.如何将错误信息绑定到mvc模型验证中 自定义返回内容 //返回内容接口 p ...
- P1073 最优贸易 分层图+最长路
洛谷p1073 最优贸易 链接 首先易得暴n2的暴力,暴力枚举就行 显然1e5的数据是会炸的 我们再分析题意,发现一共分为两个个步骤,也可以说是状态,即在一个点买入,在另一个点卖出,我们可以构建一个三 ...
- 水仙花数的条件:1.是一个三位数,2.个百千位数字的3次方加起来的和等于当前的三位数。如果,想要完美一点可以在外部加while循环
#!/usr/bin/env python# -*- coding: utf-8 -*-print("请输入三位数:")num = input()# 定义常量SumNum = 0# ...
- 发布jar包到服务器读取resource目录下文件
* 解决:当项目打包成jar之后resources路径下面的证书文件访问不到* 思路:* 1.运行时先复制一个jar* 2.将复制的jar解压到jar文件目录* 3.删除复制的jar跟解压的非证书文件 ...
- Redis统计访问量方法
1.统计客户忘问量 2.查询某位ID客户是否登录 一亿用户,统计数据10M左右,比较省空间 set usercount 0 设置一个变量,用于记录客户访问量setbit usercount 2 0 ...
- JWT伪造攻击
JWT修改伪造攻击 什么是JWT? JSON Web Token(JSON Web令牌)是一种跨域验证身份的方案.JWT不加密传输的数据,但能够通过数字签名来验证数据未被篡改(但是做完下面的WebGo ...