iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
自我挑戰組

Java SE系列 第 9

Day09:四驅車的殼

  • 分享至 

  • xImage
  •  

還記得在中壢上課時,吳老師常說:Java因介面而偉大。
初學物件導向程式概念,還真的不太能體悟為什麼,最接近的只有在JDBC吧,知道說我們的Java code可以不用改,就可以接上各廠牌的資料庫管理系統,只要那家廠牌有提供JDBC的.jar檔就搞定了。
現在雖然也還是挺菜的,軟體工程師還當不滿一年,不過在實務上就很深刻體悟到介面(interface)與多型(polymorphism)是多麼棒的概念了。
目前最常用到的地方就是在Controller的接口上了,比如整個系統中有ABCDE五種交易,雖然是不同種類的交易,但是又都有相似的地方,如果類似的驗證為了要讓接口能夠傳進資料而寫了5種接口,不就相當累人,而且往後若要維護也很麻煩,可能相同的東西要改5遍; 但只要定義出這5種交易都可以裝進去的一個類別,那接口就只要用這個最上層的類別利用多型接進來; 那如果接進來後我又需要進行各自交易種類的處理怎麼辦? 那還可以運用特別的屬性映射(reflection)射出各自的類別服務進來,真是太棒了。

接下來要談談一些潛規則了。

public interface Eat{
    int S = 1;
    int M = 2;
    int L = 3;
    
    void eat();
}
class Man implements Eat{
    String name;
    
    void eat(){
        System.out.println("Eat!");
    }
}

以上程式最後會印出什麼在console呢?
答案是在Man類別覆寫eat()方法時就會編譯錯誤了,因為介面所有成員都有隱藏預設的修飾子:public。
屬性(field)會是public static final,方法(method)會是publci abstract。
所以當修飾子為default的Man類別實作Eat介面,並覆寫eat()方法時,就不能用default修飾子來覆寫eat()方法,因為繼承下來的方法不能讓可見範圍變小,只能相等或更大。

既然提到了abstract,那也順勢來說一點吧。
abstract的用意就是為了定義一些要強制讓子類別覆寫的方法,可能我們還不確定方法裡面實作的方式,但是又很肯定絕對需要有這個方法,那就會把它宣告為抽象(abstract); 而當一個類別中有任何一個抽象方法時,那這個類別也必須被宣告為抽象類別了!而只要類別被宣告為抽象類別,那就無法被直接創建出實例,一個牽一髮動全身。

那介面和抽象類別有什麼差別? 感覺很像欸。
確實有點像,他們的特色都是先定義出一個方程式的表殼,我們會知道input及output是什麼,但裡頭怎麼辦到是空的; 不過兩者最大的差異就是抽象類別只能被繼承(extends),而我們知道一個類別就只能繼承一個類別,不能繼承兩個,但是介面的繼承(應該說實作,但實際也像是在繼承),就不限了,一個類別可以實作多個介面!那當可以多重實作介面後,再配上多型的概念,整個程式就有很多種面貌了。


上一篇
Day08:別為了錢而放棄權力
下一篇
Day10:蛋糕上的櫻桃
系列文
Java SE30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言