回顧總結9
抽象類
-
當父類的某些方法,需要宣告,但是又不確定如何實現時,可以將其宣告為抽象方法,這個類就成了抽象類。
-
抽象類的價值更多作用是在於設計,設計者設計好之後,讓子類繼承並實現抽象類。
-
框架和設計模式使用較多。
details
-
抽象類不能被例項化
-
抽象類不一定包含抽象方法
-
一旦類包含了抽象方法,則類必須宣告為抽象類
-
abstract只能修飾類和方法,不能修飾屬性和其他
-
抽象類的本質還是類,只是不能new物件
-
抽象類不能有方法體
-
如果一個類繼承了抽象類,則它必須實現抽象類的所有抽象方法,或者自己也宣告為抽象類
-
抽象方法不能用private、final、static來修飾,因為這三個關鍵字都是和重寫違背的。
我們首先要明知,抽象類設計出來是為了繼承使用的。
- private:如果把父類的抽象方法設計成私有的,那麼子類是不能訪問和重寫的。(繼承是能繼承過來的)
- final:如果方法被設計成final,那麼是不能夠改變的,也破壞了子類的重寫。如果類被設計成final,那麼是不能被繼承的,違背了抽象類的本質。
- static:靜態方法是在類載入的時候載入,並且只加載一次的,不可修改,可隨類直接使用,但是抽象方法是沒有方法體的,在沒有重寫之前不能被呼叫
模板設計模式
例項
統計執行程式碼時間
在程式碼執行前獲取時間,在程式碼執行後獲取時間,時間相減。
這一部分是通用的,中間是程式碼各不相同。
每次都要重複這些步驟,只是三行程式碼不算困難,但是重複步驟變多了,會很麻煩。
解決方法。我們把這重複的程式碼,封裝到一個模板類裡面做成一個方法,中間各不相同的程式碼封裝到一個方法裡面,再把這個方法巢狀在前面模板方法的中間位置。
//Template類
public abstract class Template{
public abstract void job();
public void calculateTime(){//模板方法
//模板前部分程式碼
//中間變換程式碼job()
//模板後部分程式碼
}
}
把模板類做成抽象類,然後寫子類(重寫job方法)去繼承這個模板類
介面
-
-
介面不能被例項化(所有方法預設都是抽象方法)
-
抽象類也不能被例項化
原因:存在沒有方法體的抽象方法
-
-
-
介面中的所有方法預設都是public,介面中所有方法預設都是abstract,可以省略。
-
抽象類抽象方法不能為private,這會破壞子類的繼承實現
原因:抽象類屬於類,類有的屬性他也能有,可以有方法和屬性
-
-
-
介面可以繼承介面
-
類可以繼承類,實現介面
原因:類和介面不是一個概念,只提供了類實現介面。
-
Java8,介面的靜態方法,關鍵字default
作用
介面(like a):設計,設計好各種規範(方法),讓其他類去實現這些方法,更加的靈活
繼承(is a):解決程式碼的複用性和維護性
多型
同繼承的多型
可以讓介面指向實現了介面的類
內部類
分類
- 外部類區域性位置(如方法內)
- 區域性內部類(有類名)
- 匿名內部類(沒有類名,重點)
- 外部類成員位置
- 成員內部類(普通)
- 靜態內部類(靜態)
details
-
可以直接訪問外部類的所有成員,包括私有的
-
不能新增訪問修飾符(區域性變數的屬性),可以用final修飾,可以防止別的類繼承
-
作用域:只在方法或程式碼塊中生效
-
外部類訪問內部類成員,需要new一個內部類的物件,通過物件呼叫內部類成員
-
外部其他類不能訪問區域性內部類(因為區域性內部類是一個區域性變數)
-
外部類和區域性內部類成員重名時,遵循就近原則。如果想訪問外部類的成員,則可以使用(物件呼叫,外部類.this返回呼叫的具體物件)外部類.this.成員,當外部類成員為靜態時成員,可以直接(類呼叫)外部類.成員呼叫
-
內部類是依附於外部類存在的,如果要建立內部類的物件,首先要存在一個外部類的物件,通過外部類的物件例項,去new內部類物件。(靜態內部類不依附於外類,可直接類呼叫)
-
區域性內部類不能訪問普通的區域性變數,這是因為區域性變數會隨著方法的結束而銷燬,但是區域性內部類的物件