接口
java只支持單繼承,例如豬是食物,豬還是動(dòng)物,我要完成這個(gè)多繼承的關(guān)系, 只時(shí)候,我們需要用到接口
- 接口(interface)是抽象方法和常量值的定義的集合
- 從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有變量和方法的實(shí)現(xiàn).
- 接口定義舉例:
public interface Runner { public static final int id = 1; public void start() ; //接口中不用謝abstract,但是都是方法. public void run() ; public void stop(); }
//為什么要定義成public static final?C++中多繼承關(guān)系中存在多個(gè)父類對(duì)象中的相同的成員變量,容易出現(xiàn)問題,java中要去避免這種情況,放到static中.
接口特性
- 接口可以多重實(shí)現(xiàn)
- 接口中聲明的屬性默認(rèn)是public static final的,也只能是這三個(gè).
- 接口中只能定義抽象的方法,這些方法默認(rèn)是public的,也只能是public的.(為了避免C++中出現(xiàn)的問題)
- 接口可以繼承其他的接口,并添加新的屬性和抽象方法.
- 多個(gè)無關(guān)的類可以實(shí)現(xiàn)同一個(gè)接口
- 一個(gè)類可以實(shí)現(xiàn)多個(gè)無關(guān)的接口
- 與繼承關(guān)系類似,接口與實(shí)現(xiàn)類之間存在多態(tài)性.
- 定義Java類的語(yǔ)法格式
接口舉例
interface Singer { public void sing(); public void sleep(); } //定義一個(gè)能唱歌的東西,不同種類的不確定,所以用抽象 class Student implements Singer { //因?yàn)橐陨嫌玫氖莍nterface,不能extends private String name; Student(String name) { this.name = name ; } public void study() { System.out.println("studying"); } public String getName() (return name;) public void sing() { System.out.println("student is singing"); } public void sleep() { System.out.println("student is sleeping"); } }
//存在繼承關(guān)系,存在重寫,如果在存在父類對(duì)子類對(duì)象的應(yīng)用,則為多態(tài).
interface Singer { public void sing(); public void sleep(); } //定義一個(gè)能唱歌的東西,不同種類的不確定,所以用抽象 interface Painter { public void paint(); public void eat(); } class Student implements Singer { //因?yàn)橐陨嫌玫氖莍nterface,不能extends private String name; Student(String name) { this.name = name ;} public void study () {System.out.println("studying"):} public String getName() (return name;) public void sing() { System.out.println("student is singing"); } public void sleep() { System.out.println("student is sleeping"); }
class Teacher implements Singer,Painter{}
//所有的方法要全部實(shí)現(xiàn),重寫.
存在多態(tài)關(guān)系的時(shí)候,所有方法的重寫在code segment里,而字符串變量和靜態(tài)變量?jī)?chǔ)存在data segment里面.實(shí)現(xiàn)動(dòng)態(tài)引用(為一個(gè)函數(shù)指針C++);
這個(gè)部分可以看作多態(tài)的延伸.
每個(gè)接口對(duì)應(yīng)的是部分的方法.
f(singer s) {
s.sing();
} //注意這個(gè)時(shí)候這個(gè)方法,無論是調(diào)用student 還是tercher,都可以.但是要重寫這個(gè)方法.多態(tài)的實(shí)現(xiàn).所以接口是那個(gè)抽象的類,多重繼承,也沒有C++的毛病.
使用接口我們實(shí)現(xiàn)了多繼承性,實(shí)現(xiàn)多繼承性,打好多態(tài)的基礎(chǔ).無論屬性再多,永遠(yuǎn)要記得,繼承性.重寫,按部就班.
Interface Comparable
compareto 比較對(duì)象的大小.輸出一個(gè)返回值.
我先定義一個(gè)方法,實(shí)現(xiàn)這個(gè)接口之后比較所有的大小,無視類型,排序,擴(kuò)展性.