6-5 抽象類(abstract)與抽象方法(important)
一、什么叫抽象類:
有時候將一個父類設計的非常抽象,以至于它沒有具體的實例,這樣的類稱為抽象類
abstract關鍵字的使用:
? 1、abstract:抽象的
? 2、abstract 可以修飾的結構:類和方法
? 3、abstract 修飾類: 抽象類
? >此類不能實例化
? >類中仍然提供構造器,以便子類調用 (只要是類,一定會有構造器)
? >開發中,都會提供抽象類的子類,讓子類對象實例化,完成相關操作
包含抽象方法的類 一定是一個抽象類。反之,抽象類中可以沒有抽象方法
? 4、abstract 修飾方法:抽象方法
? >只有方法的聲明,沒有方法體
? >包含抽象方法的類 一定是一個抽象類。反之,抽象類中可以沒有抽象方法
? >若子類重寫了父類中的所有的抽象方法后,則此子類方可實例化;
? >若子類沒有重寫父類中所有的抽象方法,則此子類也是一個抽象類,需要使用 abstract 修飾
抽象類的格式 例如:
public abstract void eat();
abstract 的使用上的注意點:
1、不能用來修飾:屬性、構造器等結構
2、abstract 不能用來修飾私有方法、靜態方法、final 的方法、final 的類
抽象類的應用:模版方法的設計模式
6-6 接口(Interface):概述
接口的使用:
1、接口使用 interface 來定義
2、Java 中,接口和類是并列的兩個結構
3、如何定義接口:定義接口中的成員
? 3.1 JDK7 及以前:只能定義全局常量和抽象方法
? >全局常量:public static final 的 (但是在編寫代碼的時候可以省略不寫)
? >抽象方法:Public abstract 的
? 3.2 JDK8:除了定義全局常量和抽象方法之外,還可以定義靜態方法、默認方法(default)
? >接口中定義的靜態方法,只能通過接口去調用
? >通過實現類的對象,可以調用接口中的默認方法;如果實現類重寫了接口中的默認方法,調用時,調用重寫后的方法
? >如果子類(或實現類)繼承的父類和實現的接口中聲明了同名同參數的方法,那么子類在沒有重寫此方法的情況下,默認調用父類中的同名同參的方法–>類優先原則
? >如果實現類實現了多個接口,而這多個接口中定義了同名同參數的默認方法,那么在實現類沒有重寫此方法的情況下,報錯—>接口沖突
? >如何在子類(或實現類)的方法中調用父類、接口中被重寫的方法 主要利用 super
4、接口中不能定義構造器!!! 意味著接口不可以實例化
5、java 開發中,接口都通過讓類去實現(implement)的方式來使用
? 如果實現類覆蓋了 接口中的所有的抽象方法,則此實現類可以實例化
? 如果實現類沒覆蓋接口的所有的抽象方法,則此實現類仍為一個抽象類
6、Java 類可以實現多個接口 —>彌補了 Java 單繼承性的局限性
? 格式:class AA extends BB implements CC DD EE {}
7、接口之間 可以繼承,而且 可以多繼承
8、接口的具體使用,體現多態
9、接口實際上看作一種規范
面試題: 抽象類與接口 有哪些異同?
相同點
- 都不能被實例化
- 抽象類和接口都不能直接創建對象,必須通過子類(實現類)來實例化。
- 都可以包含抽象方法
- 抽象方法沒有方法體,子類或實現類必須重寫它們。
- 都用于定義類的行為規范
- 它們都用于約束子類,使子類遵循一定的設計規則。
不同點**
比較項 | 抽象類 | 接口 |
---|---|---|
關鍵字 | abstract class | interface |
成員 | 既可以有抽象方法,也可以有普通方法和成員變量 | 只能有抽象方法(Java 8+ 可有 default 方法和 static 方法) |
構造方法 | 可以有構造方法 | 不能有構造方法 |
變量 | 允許有普通成員變量 | 變量默認是 public static final (常量) |
訪問修飾符 | 方法可以是 public 、protected 、default ,甚至 private | 方法默認是 public ,不能有 private 或 protected |
多繼承 | 只能繼承一個抽象類(單繼承) | 可以實現多個接口(多繼承) |
使用場景 | 適用于具有“is-a”關系的類(比如“動物是一種生物”) | 適用于“能做什么”的功能規范(比如“可飛行的對象”) |
6-7 類的內部成員之五:內部類
1、在 Java 中,允許一個類的定義位于另一個類的內部,前者稱為內部類,后者稱為外部類
2、內部類的分類: 成員內部類 vs 局部內部類(方法內、代碼塊內、構造器內)
3、成員內部類:
? 一方面,作為外部類的成員:
? >調用外部類的結構
? >可以被static 修飾
? >可以被四種不同的權限修飾
? 另一方面,作為一個類:
? >類內可以定義屬性、方法、構造器等
? >可以被 final 修飾(言外之意:不被 final 修飾可以被繼承)
? >可以被 abstract 修飾
4、關注如下三個問題
? 一、如何實例化成員內部類的對象
? 二、如何在成員內部類中區分調用外部類的結構
著重看一下三者調用的格式
三、開發中,局部內部類的使用
總結
今日學習內容比較多,也有一定重疊,注意區分各部分的內容,重點主要在于接口和抽象類,內部類使用的頻次比較少。
今日箴言:
This society is not friendly to introverted people.Don’t let laziness and procrastination imprision your free soul.
(這個社會對內向的人并不友好,不要被懶惰和拖延禁錮你自由的靈魂)
ps:今日看了國足 u20 比賽,1-2 輸給了澳大利亞,機會也挺多,可惜沒把握住,兩個丟球都是自己的失誤被打反擊產生的,同時兩個丟球間隔不到兩分鐘,這就和生活一樣,挫折有時候總是接踵而至,可能一個打擊讓你還沒回過神,下一個又來了,所以遇到挫折的時候不要走神,正視挫折,并不斷去戰勝它,不然確實很容易被接二連三的挫折打垮!