接口,Comparable和Comparator
1.抽象類和接口的區別
抽象類
含有abstract修飾符的class 即為抽象類,abstract類不能創建實例對象,含有abstract的方法的類必須定義為abstract class ,abstract class 裏的方法不必是抽象的,抽
象類定義抽象方法必須放在具體子類中實現,所以,不能有抽象的構造方法或抽象的靜態方法,如果子類沒有實現抽象父類中的所有方法,那麽,子類也必須定義為抽象類。
接口(interface):
可以說成是抽象類的特例。接口中的所有方法都必須是抽象的,接口中的方法定義默認為public abstract 。接口中的變量是全局常量,即public static final修飾的。
在語法上的區別:
a. 抽象類裏可以有構造方法,而接口內不能有構造方法。
b. 抽象類中可以有普通成員變量,而接口中不能有普通成員變量。
c. 抽象類中可以包含非抽象的普通方法,而接口中所有的方法必須是抽象的,不能有非抽象的普通方法。
d. 抽象類中的抽象方法的訪問類型可以是public ,protected和默認類型,但接口中的抽象方法只能是public類型的,並且默認即為public abstract類型。
e. 抽象類中可以包含靜態方法,接口內不能包含靜態方法。
f. 抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static類型,並且默認為public static類型。
g. 一個類可以實現多個接口,但只能繼承一個抽象類。
設計思想上的區別:
抽象類:找到類和類之間的共性,慢慢向上提取,一種自底而上抽象出來的
對象-->類-->父類-->抽象類
接口:考慮不同類之間的通用功能的擴展,一種自頂向下的設計思想
創建一個飛的接口,超人飛,小鳥飛,飛機飛,都要實現這個接口
再補充點兩者在應用上的區別:
a. 接口更多的是在系統框架設計方法發揮作用,主要定義模塊之間的通信,而抽象類在代碼實現方面發揮作用,可以實現代碼的重用。
b. 在JDK1.8之後可以添加有實現的方法。
2.什麽是接口
Java接口是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。
接口是把隱式公共方法和屬性組合起來,以封裝特定功能的一個集合。一旦類實現了接口,類就可以支持接口所指定的所有屬性和成員。
3.使用接口的好處
a.彌補了java不能多繼承的缺點
b.
4.接口的使用步驟:
1.實現接口 implements
2.重寫方法
3.傳遞接口實現類 使用instantsOf
5.理解(轉)
這個問題這困擾了我很久,後來我才想明白,大家都說接口就是實現擴展功能用的,這句話其實是最誤導人的,因為接口本身並沒有實現方法,它只是一條路,是一個工具,千萬別想復雜,真正實現功能擴展的是實現方法的對象和調用接口的方法。下面舉個栗子。
狗這個類繼承了走獸類,它有跑,跳,啃,等方法。但是它不會飛,它的父類也沒有這個方法。但是你想讓狗有飛這個功能,怎麽辦呢?當然你可以直接在狗的類中給它添加一個飛的方法就行了。有可能你並不會寫這個方法,或者是這個方法需要幾千幾萬行代碼,硬寫嗎?那以後你還想要豬,牛,羊等等都可以飛呢?那又怎麽辦呢?這時候你發現你有一個類,這個類就叫飛行獸吧。它有一個方法就是飛行,這下好了,你決定讓狗繼承它,結果發現不能多繼承,你又想讓狗的父類繼承它,結果發現還有其他的走獸不能讓他們飛。這時候就需要接口出來了,這個接口我們叫它插翅膀吧,這個接口有一個方法就是插翅膀,但沒有實現,因為接口不管你怎麽給狗插翅膀。同時你還發現在飛行獸裏有一個帶參數的構造方法,而參數類型就是這個接口類型。但是狗的類型是狗而不是接口類型,沒法作為參數傳進去,這時你就可以讓狗實現這個接口,這個狗對象就成了插了翅膀的狗,接著通過多態的原理把插了翅膀的狗這個對象傳給飛行獸,這狗這就成了飛行獸,可以飛了。
ChiBang chibangdog=new Dog()
FlyShou flydog =new FlyShou(chibangdog)
可以飛的狗就出來了,以後要豬飛就讓豬實現插翅膀,要羊飛就讓羊實現插翅膀,要牛飛就......直接吹吧。不知道這樣說明白沒有。
1 //實現Comparable類 2 public class Student implements Comparable<Student> { 3 private String name; 4 private int age; 5 private int iD; 6 7 public Student(String name, int age, int iD) { 8 super(); 9 this.name = name; 10 this.age = age; 11 this.iD = iD; 12 } 13 14 @Override 15 public String toString() { 16 return "Student [name=" + name + ", age=" + age + ", iD=" + iD + "]"; 17 } 18 19 public String getName() { 20 return name; 21 } 22 23 public void setName(String name) { 24 this.name = name; 25 } 26 27 public int getAge() { 28 return age; 29 } 30 31 public void setAge(int age) { 32 this.age = age; 33 } 34 35 public int getiD() { 36 return iD; 37 } 38 39 public void setiD(int iD) { 40 this.iD = iD; 41 } 42 43 @Override 44 public int compareTo(Student o) { 45 46 return this.age - o.age; 47 } 48 49 } 50 51 public class School { 52 private Student[] students; 53 54 public Student[] getStudents() { 55 return students; 56 } 57 58 public void setStudents(Student[] students) { 59 this.students = students; 60 } 61 62 @Override 63 public String toString() { 64 return "School [students=" + Arrays.toString(students) + "]"; 65 } 66 67 } 68 69 public class SchoolTest { 70 public static void main(String[] args) { 71 School sc = new School(); 72 Student[] students = new Student[3]; 73 // Student stu = null; 74 75 students[0] = new Student("林青霞", 18, 1); 76 students[1] = new Student("楊坤", 12, 2); 77 students[2] = new Student("周傑倫", 20, 3); 78 sc.setStudents(students); 79 //Student沒有排序的方法,這個方法的底層是靠Comparable接口的CompareTo方法實現排序的, 80 // 如果要讓學生有比較功能,那就要實現這個比較接口,然後通過多態的方式把學生這個類的對象傳遞Object,這樣就可以比較了 81 Arrays.sort(students); 82 System.out.println(sc.toString()); 83 84 } 85 86 } 87 88 //sort內部使用學生類調用了compareTo 89 // Find end of run, and reverse range if descending 90 if (((Comparable) a[runHi++]).compareTo(a[lo]) < 0) { // Descending 91 while (runHi < hi && ((Comparable) a[runHi]).compareTo(a[runHi - 1]) < 0) 92 runHi++; 93 reverseRange(a, lo, runHi); 94 } else { // Ascending 95 while (runHi < hi && ((Comparable) a[runHi]).compareTo(a[runHi - 1]) >= 0) 96 runHi++; 97 } 98 99 return runHi - lo; 100 } 101 School [students=[Student [name=楊坤, age=12, iD=2], Student [name=林青霞, age=18, iD=1], Student [name=周傑倫, age=20, iD=3]]]
//自定義比較器,調用的是sort(T[] a, Comparator<? super T> c) // 根據指定比較器產生的順序對指定對象數組進行排序。 public class Student { private String name; private int age; private int iD; public Student(String name, int age, int iD) { super(); this.name = name; this.age = age; this.iD = iD; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", iD=" + iD + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getiD() { return iD; } public void setiD(int iD) { this.iD = iD; } } //比較器 public class StudentTest { public static void main(String[] args) { Student st1 = new Student("zs", 12, 1); Student st2 = new Student("ls", 10, 2); Student st3 = new Student("ww", 19, 3); Student[] students = { st1, st2, st3 }; Arrays.sort(students, new MynameascComparator()); System.out.println(Arrays.toString(students)); } } //測試類 public class MynameascComparator implements Comparator { @Override public int compare(Object o1, Object o2) { if (o1 instanceof Student && o2 instanceof Student) { Student one = (Student) o1; Student another = (Student) o2; return one.getName().compareTo(another.getName()); } return 0; } } 執行結果: [Student [name=ls, age=10, iD=2], Student [name=ww, age=19, iD=3], Student [name=zs, age=12, iD=1]]
//使用匿名內部類改寫Comparator public class Student { private String name; private int age; private int iD; public Student(String name, int age, int iD) { super(); this.name = name; this.age = age; this.iD = iD; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", iD=" + iD + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getiD() { return iD; } public void setiD(int iD) { this.iD = iD; } } import java.util.Arrays; import java.util.Comparator; public class StudentTest { public static void main(String[] args) { Student st1 = new Student("zs", 12, 1); Student st2 = new Student("ls", 10, 2); Student st3 = new Student("ww", 19, 3); Student[] students = { st1, st2, st3 }; Arrays.sort(students, new Comparator() { @Override public int compare(Object o1, Object o2) { if (o1 instanceof Student && o2 instanceof Student) { Student one = (Student) o1; Student another = (Student) o2; return one.getName().compareTo(another.getName()); } return 0; } }); System.out.println(Arrays.toString(students)); } } 執行結果 [Student [name=ls, age=10, iD=2], Student [name=ww, age=19, iD=3], Student [name=zs, age=12, iD=1]]
6.匿名內部類
接口,Comparable和Comparator