什麼時候使用繼承呢?
當類與類之間存在着所屬關係時,才具備了繼承的前提。a是b中的一種。a繼承b。比如說:狼是犬科中的一種。英文書中,所屬關係時:”is a“。
注意:不要僅僅爲了獲取其他類中的已有成員進行集成。
所以判斷所屬關係,可以簡單看,如果繼承後,被繼承的類中的功能,都可以被該子類所具備,那麼繼承成立。如果不是,不可以繼承。
細節二:
在方法覆蓋是,注意兩點:
1:子類覆蓋父類時,必須要保證,子類方法的權限必須大於等於父類方法權限纔可以實現繼承。否則,編譯失敗。
2:覆蓋時,要麼都是靜態,要麼都不靜態。靜態只能覆蓋靜態,或者被靜態覆蓋。
繼承的一個弊端:打破了封裝性。對於一些類,或者類中功能,是需要被繼承或者複寫的。這時如何解決問題呢?介紹一個關鍵字:final:最終。
final特點:
1:這個關鍵字是一個修飾符,可以修飾類,方法,變量。
2::被fianl修飾的類是一個最終類,不可以被繼承。
3:被final修飾的方法是一個最終方法,不可以被覆蓋。
4:被final自ushi的變量是一個常量,只能賦值一次。
其實這樣的原因就是給一些固定的數據起個閱讀性較強的名稱。
不加final修飾不是也可以使用嗎?那麼這個值是一個變量,是可以更改的。加了fianl,程序更爲嚴謹。常量名稱定義時,有規範,所有字母都大寫。如果由多個單詞組成,中間用_連接。
抽象類:abstract
抽象:不具體,看不明白。抽象類表象體現。
在不斷抽取過程中,將共性內容中的方法聲明抽取,但是方法不一樣,沒有抽取,這時抽取到的方法,並不具體,需要被指定關鍵字abstract所標示,聲明爲抽象方法。
抽象方法所在類一定要標示爲抽象類,也就是說該類需要被abstract關鍵字所修飾。
抽象類的特點:
1:抽象方法只能定義在抽象類中,抽象類和抽象方法必須由abstract關鍵字修飾(可以表述類和方法,不可以描述變量)。
2:抽象方法只定義方法聲明,並不定義方法實現。(即沒有大括號)
3:抽象類不可以被創建對象(實例化)。
4:只有通過子類繼承抽象類並覆蓋了抽象類中的所有抽象方法後,該子類纔可以實例化。否則,該子類還是一個抽象類。
抽象類的細節:
1:抽象類中是否有構造函數?有,用於給子類對象進行初始化。
2:抽象類中是否可以定義非抽象方法?
可以。其實,抽象類和一般類沒有太大的區別,都是在描述事物,只不過抽象類在描述事物時,有些功能不具體。所以抽象類和一般類在定義上,都是需要定義屬性和行爲的。只不過,比一般類多了一個抽象函數,而且比一般類少了一個創建對象的部分。
3:抽象關鍵字abstract和哪些不可以共存?final,private,static
4:抽象類中可不可以不定義抽象方法?可以,抽象方法目的僅僅爲了不讓該類創建對象。
模板方法設計模式:
解決的問題:當功能內部一部分實現時確定,一部分實現是不確定的。這時可以把不確定的部分暴露出去,讓子類去實現。 abstract class GetTime{
public final void getTime(){ //此功能如果不需要複寫,可加final限定
long start = System.currentTimeMillis();
code(); //不確定的功能部分,提取出來,通過抽象方法實現
long end = System.currentTimeMillis();
System.out.println("毫秒是:"+(end-start)); }
public abstract void code(); //抽象不確定的功能,讓子類複寫實現 }
class SubDemo extends GetTime{
public void code(){ //子類複寫功能方法
for(int y=0; y<1000; y++){
System.out.println("y");
}
} }