介面_演練

xkfx發表於2024-11-25

參考:介面-java教程-廖雪峰的官方網站

介面引入

public abstract class Person {
    private String name; // String是基本型別嗎?如果不是,那是什麼型別
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public abstract void eat(); // 抽象方法的訪問許可權只能是public嗎?

    public abstract void sleep();

    @Override
    public String toString() {
        return "姓名:" + name + ", 年齡:" + age;
    }
}

用interface關鍵字宣告介面

如果一個抽象類沒有(例項)欄位;

所有方法都是抽象方法

public abstract class Person {
    public abstract void eat(); // 抽象方法的訪問許可權只能是public嗎?

    public abstract void sleep();
}

就可以把該抽象類改寫為介面,介面可以理解為一種特殊的抽象類

在Java中用interface關鍵字來宣告介面。

public interface Person {
    public abstract void eat(); 

    public abstract void sleep();
}

因為介面定義的所有方法預設都是public abstract的,所以這兩個修飾符不需要寫出來(寫不寫效果都一樣)

public interface Person {
    void eat(); 

    void sleep();
}

implements關鍵字

一旦某個普通類繼承了抽象類,就意味著必須要實現它定義的抽象方法

在介面的語境下,不再叫作繼承,而叫做實現

一旦某個普通類實現了一個介面,即意味著它必須定義介面中的所有方法。我們把這個類叫作介面實現類

要宣告一個類實現某個介面,需要使用關鍵字implements(不再是extends!!!)

public class Student implements Person {

    // 實現一個介面, 必須對介面中的所有方法提供定義,否則編譯不透過!!!
}

簡單說,就是需要實現介面中的所有方法(即:需對照著介面中的方法列表,在介面實現類中定義相應的方法!)

public class Student implements Person {

    public void eat() {

    }

    public void sleep() {
        // 需要把隱藏的public寫出來
    }
}

最終效果也是和抽象類一致的,也是定義了一種規範,凡是實現了xx介面就必須定義xx方法。例如上面Student類實現了Person介面就必須定義eat和sleep方法。

小結

介面可理解為一種特殊的抽象類

interface關鍵字宣告介面,用implements關鍵字實現介面

與抽象類類似,不能例項化,只能被繼承實現,強迫實現類定義介面中的所有(抽象)方法,否則編譯報錯

實際也是定義了某種規範,凡是實現了xx介面就必須定義xx方法。

介面與抽象類

既然介面與抽象類如此相似,為什麼Java語言的設計者還要大費周折地引入介面呢?

這是因為使用抽象類存在一個嚴重的問題,在Java中每個類只能繼承一個類,也就是extends後面只能由一個類

但每個類卻可以實現多個介面。

例如一個人往往有多重身份或者功能,例如一個人可以既是一個工人、也是一個爸爸。這樣原有的繼承機制就無法表達。

那為什麼不乾脆提供多重繼承的機制?

這是因為Java語言設計者認為多重繼承會讓語言變得非常複雜,或者效率降低。

實際上,介面可以提供多重繼承的大多數好處,還能避免多重繼承的複雜性和低效性。

介面特性(試一試)

★不能建立介面物件,但可以宣告介面變數

★介面變數只能引用實現了該介面的類的物件

與類的結構層次一樣,也可以擴充套件介面

介面中不能有例項欄位,但可以包含常量(可透過介面名訪問)

★每個類只能有一個超類,但可以實現多個介面

練習

練習1

1定義一個介面Moveable(可移動的),在介面中實現一個抽象方法:

void move();

2建立多個類實現介面:

  • Car類在move()方法中,列印輸出“汽車在公路上行駛”
  • Ship類在move()方法中,列印輸出“輪船在水面上航行”
  • Aircraft類在move()方法中,列印輸出“飛機在天空中飛行”

3編寫主類,在main方法中:

建立3個Moveable型別的介面變數,分別引用Car、Ship、Aircraft類的物件。呼叫每個物件的move() 方法,觀察輸出結果

練習2(★★★★★)

介面練習_動物王國

相關文章