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

网友投稿 204 2022-11-08

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

1.Comparable

前言,想要排序Student.有代码:

import java.util.Arrays;

class Student {

public int age;

public String name;

public double score;

public StuUSWfMJcTNNdent(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 "Studenthttp://{" +

"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.必须重写克隆方法,并且声明异常.

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:华为EI上线新服务,让企业快速引入搜索服务
下一篇:卡诺Windows 10 PC二代:提升处理器速度,增加了usb-c接口
相关文章

 发表评论

暂时没有评论,来抢沙发吧~