[JavaSE] 接口继承、对象排序
目录
往期回顾,专栏一览
🔴 接口使用实例
🔵 给对象数组排序
🔴 接口间的继承
往期回顾,专栏一览
🍉 JavaSE 🍋 AWT 🍑 数据结构 🍅 C1进阶之路 🍒 每日一练 🌽 代码报错 🍈 活动
🍹欢迎各路大佬来到 Nick 主页指点
☀️本期文章将学习 [JavaSE] 接口、comparable、comparator、接口继承,我是博主Nick。✨
✨我的博客主页:Nick_Bears 🌹꧔ꦿ
🌹꧔ꦿ博文内容如对您有所帮助,还请给个点赞 + 关注 + 收藏✨
🔴 接口使用实例
🔵 给对象数组排序
🍌 给定一个学生类
class Student { private String name; private int score; public Student(String name, int score) { this.name = name; this.score = score; } @Override public String toString() { return "[" + this.name + ":" + this.score + "]"; }}
🍌 再给定一个学生对象数组, 对这个对象数组中的元素进行排序(按分数降序)
Student[] students = new Student[] { new Student("张三", 95), new Student("李四", 96), new Student("王五", 97), new Student("赵六", 92), };
🍌 按照我们之前的理解, 数组我们有一个现成的 sort 方法, 能否直接使用这个方法呢?
Arrays.sort(students); System.out.println(Arrays.toString(students)); // 运行出错, 抛出异常. Exception in thread "main" java.lang.ClassCastException: Student cannot be cast to java.lang.Comparable
🍌 仔细思考, 不难发现, 和普通的整数不一样, 两个整数是可以直接比较的, 大小关系明确. 而两个学生对象的大小关系怎 么确定?
🍌 需要我们额外指定. 让我们的 Student 类实现 Comparable 接口, 并实现其中的 compareTo 方法
class Student implements Comparable { private String name; private int score; public Student(String name, int score) { this.name = name; this.score = score; } @Override public String toString() { return "[" + this.name + ":" + this.score + "]"; } @Override public int compareTo(Object o) { Student s = (Student)o; if (this.score > s.score) { return -1; } else if (this.score < s.score) { return 1; } else { return 0; } }}
🍌 在 sort 方法中会自动调用 compareTo 方法. compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象. 然后比较当前对象和参数对象的大小关系(按分数来算)
- 如果当前对象应排在参数对象之前, 返回小于 0 的数字;
- 如果当前对象应排在参数对象之后, 返回大于 0 的数字;
- 如果当前对象和参数对象不分先后, 返回 0;
🍌 再次执行程序, 结果就符合预期了
// 执行结果[[王五:97], [李四:96], [张三:95], [赵六:92]]
📝 联系案例 comparable:
import java.util.Arrays;class Student implements Comparable{ private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } @Override public int compareTo(Student student) {//简化:正为1 负为-1 0为0 return this.age-student.age;//给名字排序// return this.name.compareTo(student.name); } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; }}public class Demo { public static void main(String[] args) { Student[] student={ new Student("a",20), new Student("b",19), new Student("d",10), new Student("c",5) }; Arrays.sort(student); //默认从小到大 System.out.println(Arrays.toString(student)); }}
📝 联系案例 comparator:
import java.util.Arrays;import java.util.Comparator;class Student{ private String name; private int age; private Double source; public Student() { } public Student(String name, int age, Double source) { this.name = name; this.age = age; this.source = source; } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Double getSource() { return source; } public void setSource(Double source) { this.source = source; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + ", source=" + source + '}'; }}class AgeComparator implements Comparator { @Override public int compare(Student o1, Student o2) { return o1.getAge()-o2.getAge(); }}class NameComparator implements Comparator { @Override public int compare(Student o1, Student o2) { return o1.getName().compareTo(o2.getName()); }}class SourceComparator implements Comparator { @Override public int compare(Student o1, Student o2) { return (int)(o1.getSource()-o2.getSource()); }}public class Demo { public static void main(String[] args) { Student[] student={ new Student("a",20,120.4), new Student("b",19,23.5), new Student("d",10,89.3), new Student("c",5,29.7) };//三种排序 //Arrays.sort(student,new AgeComparator()); //Arrays.sort(student,new NameComparator()); //Arrays.sort(student,new SourceComparator()); System.out.println(Arrays.toString(student)); }}
🔻输入内容
🔶 对于 sort 方法来说, 需要传入的数组的每个对象都是 "可比较" 的, 需要具备 compareTo 这样的能力. 通过 重写 compareTo 方法的方式, 就可以定义比较规则
🔶 为了进一步加深对接口的理解, 我们可以尝试自己实现一个 sort 方法来完成刚才的排序过程(使用冒泡排序)
public static void sort(Comparable[] array) { for (int bound = 0; bound bound; cur--) { if (array[cur - 1].compareTo(array[cur]) > 0) { // 说明顺序不符合要求, 交换两个变量的位置 Comparable tmp = array[cur - 1]; array[cur - 1] = array[cur]; array[cur] = tmp; } } } }
🔵 接口间的继承
🔶 接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字
interface IRunning { void run();}interface ISwimming { void swim();}// 两栖的动物, 既能跑, 也能游interface IAmphibious extends IRunning, ISwimming {}class Frog implements IAmphibious { ...}
🔶 通过接口继承创建一个新的接口 IAmphibious 表示 "两栖的". 此时实现接口创建的 Frog 类, 就继续要实现 run 方法, 也需要实现 swim 方法
📝 例子
interface A{ void show1();}interface B extends A{ void show2();}interface C extends B{ void show3();}public class Demo implements C{ @Override public void show1() { } @Override public void show2() { } @Override public void show3() { }}
🔶 接口间的继承相当于把多个接口合并在一起