標籤:
學習內容:繼承的概述;繼承出現後子父類中成員的特點;final關鍵字;抽象類別;介面;模板方法設計模式
一、繼承的概述1,繼承的好處 1),提高了代碼的複用性 2),繼承的出現,讓類與類之間產生了關係。有了這個關係,才有了物件導向的多態的這個特性。特別要說明一點:千萬不要為了獲得其他類的功能簡化代碼而繼承,必須是類與類之間有所屬關係才可以繼承。即不要有奶就是娘。2,java中繼承的特點 java語言中,java只支援單繼承,支援多層繼承,但不支援多繼承。因為多繼承容易帶來安全隱患,當功能名稱相同而內容不同時,子類對象不確定運行哪一個。java為瞭解決java對多繼承不支援的問題,挺了另外一種方式來完成---多實現。 二、繼承出現後子父類中成員的特點1,成員變數如果子父類中出現非私人的同名變數時,子類要訪問本類中的變數,用this關鍵字,子類要訪問父類中的變數,要用super關鍵字。super的使用基本上和this的使用幾乎一致,this代表的是本類對象的引用,super代表的是父類對象的引用。 2,函數 1)當子類出現與父類一模一樣的函數時,子類對象調用該函數,會運行子類函數的內容,如同父類的函數被覆蓋一樣。這種情況是函數的另外一個特性的體現-----覆蓋(override)。 當子類繼承父類,沿襲了父類的功能到子類中,但子類雖然具備了該功能,但是功能的內容卻和父類不一致,這時,沒有必要定義新功能,而是使用覆蓋特性保留父類的功能定義,並重寫功能內容。 2)覆蓋(override)的特點 A,子類覆蓋父類,必須保證子類許可權大於等於父類許可權,才可以覆蓋,否則編譯失敗。 B,覆蓋發生在繼承中,子類覆蓋父類的方法,他們的方法定義是一模一樣包括傳回值類型。 C,靜態方法只能覆蓋靜態方法。 三、建構函式----子類執行個體化過程1,子父類中的建構函式 在對子類對象進行初始化時,父類建構函式也會運行,那是因為子類的建構函式預設第一行有一條隱式的語句super(),super()會訪問父類中的空參數的建構函式,而且子類中所有建構函式預設第一行都是super()。 2,為什麼子類一定要訪問父類中的建構函式? 因為父類中的資料,子類可以直接擷取,所以子類對象在建立時,要查看父類是如何對這些資料進行初始化的,所以子類對象在初始化時,要先訪問一下父類中的建構函式,如果要訪問父類中指定的建構函式,可以通過手動定義super語句的方式實現。 3,子類的執行個體化過程 子類中的所有的建構函式,預設都會訪問父類中空參數的建構函式,因為子類每一個建構函式的第一行都有一句隱式super()語句。 當父類中沒有空參數的建構函式時,子類必須手動通過super形式來指定要訪問的建構函式 當然,子類的建構函式第一行也可以手動指定this語句來訪問本類中的建構函式。子類中至少會有一個建構函式會訪問父類中的建構函式。 三、final關鍵字 final的中文意思是最終的意思,她是一個修飾符。1,可以修飾類,函數,變數(包括局部變數和成員變數)2,被final修飾的類不可以被繼承,那麼也就不存在函數的複寫特性了。3,被final修飾的函數不可以被覆寫。4,被final修飾的變數是一個常量,只能被賦值一次。5,內部類定義在類中的局部位置時,只能訪問該局部被final修飾的局部變數。 四、抽象類別1,抽象類別的特點1)抽象方法一定在抽象類別中2)抽象方法和抽象類別必須被abstract關鍵字修飾3)抽象類別不可以用new建立對象,因為調用抽象方法沒有意義4)抽象類別中的方法要被使用,必須由子類覆寫其所有的抽象方法後,建立子類對象調用,如果子類只覆蓋了部分抽象方法,那麼該子類還是一個抽象類別。另外還有一點:一個抽象類別中的可以出現這樣一個極端,裡面的方法可以全部不是抽象方法,這樣做的目的是強制讓子類繼承。 2,一般類和抽象類別的區別1)抽象類別比一般類多了抽象方法。2)抽象類別不可以被執行個體化3)抽象類別中可以不定義抽象方法,這樣做,就是不讓該類建立對象。 五、介面1,介面的初期理解,可以認為是一個特殊的抽象類別。當抽象類別中的方法都是抽象的,那麼該類可以通過介面的形式來表示。介面使用interface定義。2,介面的特點1)介面中常見的定義是:常量,抽象方法2)介面中的成員都有固定修飾符 常量:public static final 方法:public abstract3,介面的注意事項1)介面是不可以建立對象的,因為有抽象方法需要被子類實現,子類對介面中的抽象方法全部都覆蓋後,子類才可以執行個體化,否則子類是一個抽象類別。2)類與介面的關係是實現(implements),一個類在繼承另外一個類的同時,還可以實現多個介面3)介面與介面之間的關係是繼承(extends),一個介面可以同時繼承多個介面。 六、模板方法設計模式1,在定義功能時,一部分是確定的,但是有一部分是不確定的,而確定的部分在使用不確定的部分,那麼這時候就將不確定的部分暴露出去,有該類的子類來完成。2,一個範例程式碼 需求:擷取一段程式啟動並執行時間。原理:擷取程式開始和結束的時間並相減即可。 擷取時間:System.currentTimeMillis();abstract class GetTime{public final void getTime(){long start = System.currentTimeMillis(); runcode(); long end = System.currentTimeMillis(); System.out.println("毫秒:"+(end-start));}public abstract void runcode(); } class SubTime extends GetTime{ public void runcode(){for(int x=0; x<4000; x++){System.out.print(x);}}} class TemplateDemo{public static void main(String[] args) {//GetTime gt = new GetTime();SubTime gt = new SubTime();gt.getTime();}}
Java學習日記num6