Java 接口(interface)
實現格式:class 類名 implements 接口名,…{}
特點
接口不能被實例化
一個類如果實現了接口,要麼是抽象類,要麼實現接口中所有的抽象方法。
接口成員的特點
接口中成員修飾符是固定的
public static final ,接口中定義變量是成員變量,而且修飾符只能是這三個關鍵字,都可以省略,編譯時會自動添加,常量名要大寫。
public abstract,接口中定義的方法都是抽象的,兩個關鍵字都可以省略,編譯時會自動添加。
建議手動給出修飾符
繼承與實現的區別
類與類之間稱爲繼承關係,因爲該類無論是抽象的還是非抽象的,它的內部都可以定義非抽象方法,這個方法可以直接被子類使用,子類繼承即可。只能單繼承,可以多層繼承。
類與接口之間是實現關係,因爲接口中的方法都是抽象方法,必須由子類實現纔可以實例化。可以單實現,也可以多實現。還可以在繼承一個類的同時實現多個接口
接口與接口之間是繼承關係,一個可以繼承另一個接口,並添加新的屬性和抽象方法,並且可以多繼承。
抽象類和接口的區別
- 成員變量
- 抽象類可以有變量也可以有常量
- 接口只能有常量
- 成員方法
- 抽象類可以有抽象方法,也可以有非抽象方法
- 接口只能有抽象方法
- 構造方法
- 抽象類有構造方法
- 接口沒有構造方法
- 成員變量
接口的思想特點
- 接口是對外暴露的規則
- 接口是程序的功能擴展
- 接口的出現降低了耦合性(實現了模塊化開發,定義好規則,每個人實現自己的模塊,大大提高了開發效率)
- 接口可以用來多實現
- 多個無關的類可以實現同一個接口
- 一個類可以實現多個相互沒有關係的接口
- 與繼承關係相似,接口與實現類存在多態性
示例
class Demo2 { public static void main(String[] args) { //籃球運動員 BasketballPlayer bp = new BasketballPlayer(); bp.setName("郭艾倫"); bp.setAge(33); bp.eat(); bp.sleep(); bp.study(); bp.speak(); bp.aboard(); //籃球教練 System.out.println("---------------------------------"); BasketballCoach bc = new BasketballCoach(); bc.setName("波波維奇"); bc.setAge(65); bc.eat(); bc.sleep(); bc.speak(); bc.teach(); bc.aboard(); //多態 System.out.println("---------------------------------"); Person p = new BasketballPlayer(); p.setName("Kobe Bryant"); p.setAge(33); p.eat(); p.sleep(); System.out.println("---------------------------------"); BasketballPlayer bp2 = (BasketballPlayer)p; bp2.study(); bp2.speak(); bp2.aboard(); } } interface SpeakEnglish { public abstract void speak(); } interface GoAboard { public abstract void aboard(); } abstract class Person { private String name; private int age; public Person(){} public Person(String name, int age) { this.name = name; this.age = age; } public void setName(String name) { this.name = name; } public String getName() { return this.name; } public void setAge(int age) { this.age = age; } public int getAge() { return this.age; } public abstract void eat(); public void sleep() { System.out.println("Zzz"); } } abstract class Player extends Person { public abstract void study(); } abstract class Coach extends Person { public abstract void teach(); } //籃球運動員 class BasketballPlayer extends Player implements SpeakEnglish, GoAboard { public void eat() { System.out.println(getAge() + "歲的" + getName() + "喫雞腿"); } public void study() { System.out.println(getAge() + "歲的" + getName() + "學扣籃"); } public void speak() { System.out.println(getAge() + "歲的" + getName() + "HelloWorld"); } public void aboard() { System.out.println(getAge() + "歲的" + getName() + "GoAboard"); } } //乒乓球運動員 class PingPangPlayer extends Player { public void eat() { System.out.println(getAge() + "歲的" + getName() + "喫雞蛋"); } public void study() { System.out.println(getAge() + "歲的" + getName() + "學扣球"); } } //籃球教練 class BasketballCoach extends Coach implements SpeakEnglish, GoAboard { public void eat() { System.out.println(getAge() + "歲的" + getName() + "啃雞爪"); } public void teach() { System.out.println(getAge() + "歲的" + getName() + "教扣籃"); } public void speak() { System.out.println("Say Hello Java"); } public void aboard() { System.out.println(getAge() + "歲的" + getName() + "GoAboard"); } } //乒乓球教練 class PingPangCoach extends Coach { public void eat() { System.out.println(getAge() + "歲的" + getName() + "喫雞蛋皮"); } public void teach() { System.out.println(getAge() + "歲的" + getName() + "教扣球"); } }