千家信息网

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

发表于:2024-10-09 作者:千家信息网编辑
千家信息网最后更新 2024年10月09日,这篇文章主要为大家分析了 Java SE面向对象编程的3个常用接口分别是什么的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入
千家信息网最后更新 2024年10月09日Java SE面向对象编程的3个常用接口分别是什么

这篇文章主要为大家分析了 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{    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{    @Override    public int compare(Student1 o1, Student1 o2) {        return o1.age - o2.age;    }} class ScoreComparator implements Comparator{    @Override    public int compare(Student1 o1, Student1 o2) {        return (int) (o1.score - o2.score);    }} class NameComparator implements Comparator{    @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个常用接口分别是什么"就介绍到这了,更多相关内容可以搜索以前的文章,希望能够帮助大家答疑解惑,请多多支持网站!

0