1. 程式人生 > 其它 >回顧總結9

回顧總結9

抽象類

  • 當父類的某些方法,需要宣告,但是又不確定如何實現時,可以將其宣告為抽象方法,這個類就成了抽象類。

  • 抽象類的價值更多作用是在於設計,設計者設計好之後,讓子類繼承並實現抽象類。

  • 框架和設計模式使用較多。

details

  1. 抽象類不能被例項化

  2. 抽象類不一定包含抽象方法

  3. 一旦類包含了抽象方法,則類必須宣告為抽象類

  4. abstract只能修飾類和方法,不能修飾屬性和其他

  5. 抽象類的本質還是類,只是不能new物件

  6. 抽象類不能有方法體

  7. 如果一個類繼承了抽象類,則它必須實現抽象類的所有抽象方法,或者自己也宣告為抽象類

  8. 抽象方法不能用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):解決程式碼的複用性和維護性

多型

同繼承的多型

可以讓介面指向實現了介面的類

內部類

分類

  • 外部類區域性位置(如方法內)
    1. 區域性內部類(有類名)
    2. 匿名內部類(沒有類名,重點)
  • 外部類成員位置
    1. 成員內部類(普通)
    2. 靜態內部類(靜態)

details

  1. 可以直接訪問外部類的所有成員,包括私有的

  2. 不能新增訪問修飾符(區域性變數的屬性),可以用final修飾,可以防止別的類繼承

  3. 作用域:只在方法或程式碼塊中生效

  4. 外部類訪問內部類成員,需要new一個內部類的物件,通過物件呼叫內部類成員

  5. 外部其他類不能訪問區域性內部類(因為區域性內部類是一個區域性變數)

  6. 外部類和區域性內部類成員重名時,遵循就近原則。如果想訪問外部類的成員,則可以使用(物件呼叫,外部類.this返回呼叫的具體物件)外部類.this.成員,當外部類成員為靜態時成員,可以直接(類呼叫)外部類.成員呼叫

  7. 內部類是依附於外部類存在的,如果要建立內部類的物件,首先要存在一個外部類的物件,通過外部類的物件例項,去new內部類物件。(靜態內部類不依附於外類,可直接類呼叫)

  8. 區域性內部類不能訪問普通的區域性變數,這是因為區域性變數會隨著方法的結束而銷燬,但是區域性內部類的物件