什麼叫抽象類
在java中,因為繼承,使得類越來越具體化,類的設計使得父類越來越通用,在類的設計裡應該保證父類和子類能夠共享特徵,有時候就把父類設計的非常抽象,讓它沒有具體的實例。這樣的類就叫抽象類,例如人可以說話,但是不同的人可能說的話不一樣,所以讓說話的內容由子類自己決定。
1.抽象類不可以被實例化,實例化應該是它的子類來完成
.
從上述代碼可以看出,如果Person類沒有被abstract修飾,在main方法裡是可以被實例化的,如果我們加上了abstract關鍵字修飾,那麼Person person = new Person();就會被報錯。
2.抽象類是類的一種,也有構造器
很神奇的是,抽象類不能被實例化,但是卻可以存在構造器,
.
3.抽象方法所在的類一定是抽象類
.
abstract修飾方法
abstract修飾的方法也叫抽象方法,關於抽象方法需要說明以下幾點:1.抽象方法的格式,沒有方法體,就是不包括{},例如public abstract void eat();2.抽象方法值保留方法的功能,具體的實現過程由繼承他的子類來實現,3.如果子類繼承了抽象類沒有全部實現父類抽象方法,則表明子類還是一個抽象類,也必須用abstract修飾類,4.如果子類繼承了抽象類,並且全部重寫了父類抽象方法,則該子類就可以被實例化。
4.抽象類中可以沒有抽象方法
.
5.抽象方法必須由子類來重寫
.
從上述代碼也能得出,子類繼承一個抽象類,要麼全部實現父類的抽象方法,要麼本身還是一個抽象類。
6.子類中的抽象方法不能和父類的抽象方法同名
7.abstract不能與final修飾同一個類,原因很簡單,final修飾的類不能被繼承,
8.abstract不能與private,static,final,native並列修飾同一個方法
這三點大家都可以試試,道理也很簡單。下面一個例子說明抽象類的相關知識;
.
結果為:
.
模板方法設計模式
抽象類體現的就是一種模板設計模式,抽象類作為多個子類通用的模板,子類在抽象類的基礎上進行擴展,這種模式解決的就是一部分功能不確定,就把不確定的功能部分暴露出去,讓子類自己去實現。
案例
.
.
接口
接口是一種比抽象類還抽象的東西,它不是類,不能被實例化,只能實例化他的子類。使用關鍵字interface,實現接口的類就必須實現接口中的所有方法,這個在javaee中的三層架構中會經常使用。在使用接口的過程中需要注意一下幾點:1.一個類可以實現多個接口,也可以繼承其他接口。2.接口中只能有常量和抽象方法。3.接口的權限只能是public,你可以手動聲明為其他,編譯就會報錯。4.接口中定義的「成員變量」,也加不可變的常量,因為會自動加上public static final,可以通過接口名.常量名進行訪問。5.接口主要用於定義規範,接觸耦合關係
.
這就是一個接口,只是說接口沒有太多說的,主要是接口有什麼用,java為什麼會提供這麼一個東西,接口在JAVAEE中使用很多,例如Mybatis基於接口的mapper開發。JavaEE三層模式開發都會大量使用接口。下面主要學習接口的應用。
接口的多態性
.
.
繼承的多態是子類重寫父類方法,父類引用指向不同的子類實例,就會調用對應子類的方法,從而執行不同的響應,接口的多態是實現類實現多個接口,方法參數列表裡可以帶接口的引用參數,方法的具體可以通過接口引用調用接口裡的抽象方法,調用該方法時傳入接口實現類,實際執行的是實現類中的方法。這是相同的實例,不同的接口體現的多態性。
接口應用-工廠方法的設計模式
定義一個用於創建對象的接口,讓子類決定實例化哪一個類。簡單來講就是暴露接口給用戶,根據用戶傳入的參數返回特定的實例對象的一種模式。例如:一個生產汽車的工廠,有很多分廠,生產火車的,生產轎車的,生產貨車的,用戶不知道有這些分廠,用戶只知道有一個工廠可以生產車,這個工廠是虛擬的,用戶在接口傳入編號,由工廠返回用戶指定的車實例。案例如下:
.
.
抽象類和接口的區別
總的來說:抽象類和接口都不能被實例化,但是都可以定義抽象類和接口的引用。1.抽象類可以有抽象方法,也可以有方法的具體實現,接口中不能。2.抽象類中的成員修飾可以為private,默認,protected,public但是接口中只能為public。3.抽象類可以定義成員變量,但是接口中其實都是不可變的常量。抽象類如下:
.
接口如下:
.
總結:
程序設計中,什麼時候使用接口,什麼時候使用抽象類,這是一個架構的難點,只有對問題充分了解才能選擇合適的設計方法,抽象類在java中表示的是一種繼承關係,一個子類只存在一個父類,但是卻可以實現多個接口。