Java SE 面向对象编程的3个常用接口

 更新时间:2022年01月26日 15:31:55   作者:wwzzzzzzzzzzzzz   
这篇文章主要f Java SE 面向对象编程的3个常用接口,Comparable、Comparator 比较器、Cloneable,下面文章详细介绍,需要的小伙伴可以参考一下

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个常用接口的文章就介绍到这了,更多相关 Java SE 面向对象编程接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 4种Python基于字段的不使用元类的ORM实现方法总结

    4种Python基于字段的不使用元类的ORM实现方法总结

    在 Python 中,ORM(Object-Relational Mapping)是一种将对象和数据库之间的映射关系进行转换的技术,本文为大家整理了4种不使用元类的简单ORM实现方式,需要的可以参考下
    2023-12-12
  • 如何使用python把ppt转换成pdf

    如何使用python把ppt转换成pdf

    这篇文章主要介绍了如何使用python把ppt转换成pdf,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • Python读写zip压缩文件的方法

    Python读写zip压缩文件的方法

    Python自带模块zipfile可以完成zip压缩文件的读写,而且使用非常方便,下面我们就来演示一下Python读写zip文件的实例代码,需要的朋友参考下吧
    2018-08-08
  • python列表去重的5种常见方法实例

    python列表去重的5种常见方法实例

    在Python编程过程中经常会遇到列表去重的问题,下面这篇文章主要给大家介绍了python列表去重的5种常见方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • pytorch + visdom 处理简单分类问题的示例

    pytorch + visdom 处理简单分类问题的示例

    这篇文章主要介绍了pytorch + visdom 处理简单分类问题的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • python实现提取jira bug列表的方法示例

    python实现提取jira bug列表的方法示例

    公司要求内部每日整理jira bug发邮件,手动执行了一段时间,想着用自动化的方式实现,所以本文主要介绍了python实现提取jira bug列表,感兴趣的可以了解一下
    2021-05-05
  • 关于PySnooper 永远不要使用print进行调试的问题

    关于PySnooper 永远不要使用print进行调试的问题

    这篇文章主要介绍了关于PySnooper 永远不要使用print进行调试的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • python 字符串追加实例

    python 字符串追加实例

    今天小编就为大家分享一篇python 字符串追加实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python获取Pandas列名的几种方法

    python获取Pandas列名的几种方法

    这篇文章主要介绍了python获取Pandas列名的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • python实现AES加密与解密

    python实现AES加密与解密

    这篇文章主要为大家详细介绍了python实现AES加密与解密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03

最新评论