> 文档中心 > [JavaSE] 接口继承、对象排序

[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() {    }}

  

🔶 接口间的继承相当于把多个接口合并在一起