高防服务器

 Java SE面向对象编程的3个常用接口分别是什么


 Java SE面向对象编程的3个常用接口分别是什么

发布时间:2022-01-17 19:37:52 来源:高防服务器网 阅读:63 作者:柒染 栏目:开发技术

这篇文章主要为大家分析了 Java SE面向对象编程的3个常用接口分别是什么的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“ 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;      }         @Override      public 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));      }  }

此代码运行报错:

原因: 没有告诉要如何进行排序,是年龄还是姓名还是分数.没有告诉比较的规则

解决方式:

如果自定义的数据类型 进行大小比较 一定要实现可以比较的接口

import java.util.Arrays;     class Student implements Comparable<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;      }         @Override      public String toString() {          return "Student{" +                  "age=" + age +                  ", name='" + name + ''' +                  ", score=" + score +                  '}';      }         //谁调用这个方法 谁就是this      @Override      public 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      @Override      public 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;      }         @Override      public String toString() {          return "Student{" +                  "age=" + age +                  ", name='" + name + ''' +                  ", score=" + score +                  '}';      }  }     class AgeComparator implements Comparator<Student1>{      @Override      public int compare(Student1 o1, Student1 o2) {          return o1.age - o2.age;      }  }     class ScoreComparator implements Comparator<Student1>{      @Override      public int compare(Student1 o1, Student1 o2) {          return (int) (o1.score - o2.score);      }  }     class NameComparator implements Comparator<Student1>{      @Override      public 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("吃!");      }         @Override      public String toString() {          return "Person{" +                  "age=" + age +                  '}';      }         @Override      protected 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.必须重写克隆方法,并且声明异常.

关于“ Java SE面向对象编程的3个常用接口分别是什么”就介绍到这了,更多相关内容可以搜索高防服务器网以前的文章,希望能够帮助大家答疑解惑,请多多支持高防服务器网网站!

[微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

[图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
[