?Java?SE?面向?qū)ο缶幊痰?個(gè)常用接口
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));
? ? }
}此代碼運(yùn)行報(bào)錯(cuò):

原因: 沒有告訴要如何進(jìn)行排序,是年齡還是姓名還是分?jǐn)?shù).沒有告訴比較的規(guī)則
解決方式:
如果自定義的數(shù)據(jù)類型 進(jìn)行大小比較 一定要實(shí)現(xiàn)可以比較的接口
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 +
? ? ? ? ? ? ? ? '}';
? ? }
?
? ? //誰(shuí)調(diào)用這個(gè)方法 誰(shuí)就是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);//默認(rèn)從小到大排序
?
? ? ? ? System.out.println("比較后 "+Arrays.toString(students));
? ? }
}如果要 分?jǐn)?shù)比較 和 姓名比較
? //誰(shuí)調(diào)用這個(gè)方法 誰(shuí)就是this
? ? @Override
? ? public int compareTo(Student o) {
? ? ? ? //return this.age - o.age;//從小到大
? ? ? ? //return o.age - this.age;//從大到小
? ? ? ? return (int) (this.score - o.score);//分?jǐn)?shù)排序
? ? ? ? return this.name.compareTo(o.name);//姓名排序
? ? }缺點(diǎn): 這個(gè)接口對(duì)類的侵入性非常強(qiáng).一旦寫好了,不敢輕易改動(dòng).
如何降低對(duì)類的侵入性呢?
使用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("比較后(按分?jǐn)?shù)) "+Arrays.toString(students1));
? ? }
}運(yùn)行結(jié)果:

優(yōu)點(diǎn):對(duì)類的侵入性非常弱.
3.Cloneable
面試問(wèn)題:
你知道Cloneable接口嗎?為啥這個(gè)接口是一個(gè)空接口?有啥作用?
空接口 -> 標(biāo)志接口 -> 代表當(dāng)前這個(gè)類是可以被克隆的.
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);
? ? }
}運(yùn)行結(jié)果:

注意事項(xiàng):
- 1.引用的對(duì)象要想被克隆,必須實(shí)現(xiàn)Cloneable接口.
- 2.必須重寫克隆方法,并且聲明異常.
到此這篇關(guān)于 Java SE 面向?qū)ο缶幊痰?個(gè)常用接口的文章就介紹到這了,更多相關(guān) Java SE 面向?qū)ο缶幊探涌趦?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)圖像去霧效果的示例代碼
本文將利用《bringing old photos back to life》 的開源代碼,并在此基礎(chǔ)上進(jìn)行修改,從而實(shí)現(xiàn)圖像去霧的效果,感興趣的小伙伴可以學(xué)習(xí)一下2022-02-02
Python遠(yuǎn)程桌面協(xié)議RDPY安裝使用介紹
這篇文章主要介紹了Python遠(yuǎn)程桌面協(xié)議RDPY安裝使用介紹,本文講解了RDPY的安裝、RDPY的簡(jiǎn)單使用兩部份內(nèi)容,需要的朋友可以參考下2015-04-04
用python實(shí)現(xiàn)域名資產(chǎn)監(jiān)控的詳細(xì)步驟
域名資產(chǎn)監(jiān)控,通過(guò)輸入一個(gè)主域名,找到該域名對(duì)應(yīng)的ip地址所在的服務(wù)器的端口開閉情況,本文重點(diǎn)給大家介紹用python實(shí)現(xiàn)域名資產(chǎn)監(jiān)控的問(wèn)題,需要的朋友可以參考下2021-11-11
python3中apply函數(shù)和lambda函數(shù)的使用詳解
本文主要介紹了python3中apply函數(shù)和lambda函數(shù)的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Python中os.path模塊的8個(gè)神奇函數(shù)分享
在Python編程中,os.path模塊是一個(gè)非常重要的模塊,它提供了用于處理文件路徑和目錄的函數(shù),本文將介紹os.path模塊中最常用的8個(gè)內(nèi)置函數(shù),需要的可以參考下2023-11-11
基于PyQt5制作一個(gè)gif動(dòng)態(tài)圖片生成器
這篇文章主要介紹了基于PyQt5實(shí)現(xiàn)的gif動(dòng)態(tài)圖片生成器,這個(gè)小工具制作的目的是為了將多張圖片組合后生成一張動(dòng)態(tài)的GIF圖片。需要的可以參考一下2022-01-01
實(shí)例講解Python中浮點(diǎn)型的基本內(nèi)容
在本文里小編給大家整理了關(guān)于Python中浮點(diǎn)型的基本知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2019-02-02
Python實(shí)現(xiàn)為圖片添加水印的示例詳解
這篇文章主要介紹了如何通過(guò)Python3實(shí)現(xiàn)添加水印,這樣發(fā)朋友圈,圖片再也不怕被盜了?。?!文中的示例代碼簡(jiǎn)潔易懂,需要的可以參考一下2022-02-02

