Java|Java SE 面向对象编程的3个常用接口
1.Comparable
前言,想要排序Student.有代码:
import java.util.Arrays; class Student {public int age; public String name; public double score; public Student(int age, String name, double score) {this.age = age; this.name = name; this.score = score; } @Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +", score=" + score +'}'; }} public class TestDemo {public static void main(String[] args) {Student[] students = new Student[3]; students[0] = new Student(12,"niubi",99.9); students[1] = new Student(20,"liuren",18.9); students[2] = new Student(80,"laoren",50.9); System.out.println(Arrays.toString(students)); Arrays.sort(students); System.out.println(Arrays.toString(students)); }}
此代码运行报错:
文章图片
原因: 没有告诉要如何进行排序,是年龄还是姓名还是分数.没有告诉比较的规则解决方式:
【Java|Java SE 面向对象编程的3个常用接口】如果自定义的数据类型 进行大小比较 一定要实现可以比较的接口
import java.util.Arrays; class Student implements Comparable{public int age; public String name; public double score; public Student(int age, String name, double score) {this.age = age; this.name = name; this.score = score; } @Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +", score=" + score +'}'; } //谁调用这个方法 谁就是this@Overridepublic int compareTo(Student o) {//return this.age - o.age; //从小到大return o.age - this.age; //从大到小} } public class TestDemo { public static void main(String[] args) {Student[] students = new Student[3]; students[0] = new Student(12,"niubi",99.9); students[1] = new Student(6,"liuren",18.9); students[2] = new Student(80,"laoren",50.9); System.out.println("比较前 "+Arrays.toString(students)); Arrays.sort(students); //默认从小到大排序 System.out.println("比较后 "+Arrays.toString(students)); }}
如果要 分数比较 和 姓名比较
//谁调用这个方法 谁就是this@Overridepublic int compareTo(Student o) {//return this.age - o.age; //从小到大//return o.age - this.age; //从大到小return (int) (this.score - o.score); //分数排序return this.name.compareTo(o.name); //姓名排序}
缺点: 这个接口对类的侵入性非常强.一旦写好了,不敢轻易改动.
如何降低对类的侵入性呢?使用
Comparator
2.Comparator 比较器
import java.util.Arrays; import java.util.Comparator; class Student1 {public int age; public String name; public double score; public Student1(int age, String name, double score) {this.age = age; this.name = name; this.score = score; } @Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +", score=" + score +'}'; }} class AgeComparator implements Comparator{@Overridepublic int compare(Student1 o1, Student1 o2) {return o1.age - o2.age; }} class ScoreComparator implements Comparator{@Overridepublic int compare(Student1 o1, Student1 o2) {return (int) (o1.score - o2.score); }} class NameComparator implements Comparator{@Overridepublic int compare(Student1 o1, Student1 o2) {return o1.name.compareTo(o2.name); }} public class TestDemo1 { public static void main(String[] args) {Student1[] students1 = new Student1[3]; students1[0] = new Student1(12,"niubi",99.9); students1[1] = new Student1(6,"liuren",18.9); students1[2] = new Student1(80,"laoren",50.9); System.out.println("比较前 "+Arrays.toString(students1)); AgeComparator ageComparator = new AgeComparator(); Arrays.sort(students1,ageComparator); System.out.println("比较后(按年龄) "+Arrays.toString(students1)); ScoreComparator scoreComparator = new ScoreComparator(); Arrays.sort(students1,scoreComparator); System.out.println("比较后(按姓名) "+Arrays.toString(students1)); NameComparator nameComparator = new NameComparator(); Arrays.sort(students1,nameComparator); System.out.println("比较后(按分数) "+Arrays.toString(students1)); }}
运行结果:
文章图片
优点:对类的侵入性非常弱.
3.Cloneable 面试问题:
你知道Cloneable接口吗?为啥这个接口是一个空接口?有啥作用?
空接口 -> 标志接口 -> 代表当前这个类是可以被克隆的.
class Person implements Cloneable{public int age ; public void eat(){System.out.println("吃!"); } @Overridepublic String toString() {return "Person{" +"age=" + age +'}'; } @Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); }}public class TestDemo2 {public static void main(String[] args) throws CloneNotSupportedException {Person person = new Person(); person.age = 99; Person person2 = (Person) person.clone(); System.out.println(person.age); System.out.println(person2.age); System.out.println("=========="); person2.age = 199; System.out.println(person.age); System.out.println(person2.age); }}
运行结果:
文章图片
注意事项:
- 1.引用的对象要想被克隆,必须实现Cloneable接口.
- 2.必须重写克隆方法,并且声明异常.
推荐阅读
- JavaScript 常见错误介绍和代码示例
- Java中的异常类型与示例
- JavaScript Math min()方法用法介绍
- python3对象和类 – Python3教程
- python3面向对象编程 – Python3教程
- java|程序员加班实用贴 | 每日趣闻
- java|复旦博士写了130行代码,2分钟解决繁琐核酸报告核查
- 如何使用JavaScript切换布尔值()
- 使用Java中的正则表达式获取字符串中每个单词的首字母
- JavaScript 严格模式解析和使用示例