Java學習——抽象類
進行專案開發的過程中,儘可能不要直接繼承直接實現好的類,而繼承抽象類或介面。
物件多型性的核心本質:方法的重寫
如果子類沒有進行指定方法的覆寫,也就不存在物件多型性了。
所以如果要對子類的方法做一些強制性的要求,就會用到抽象類。
抽象類實現了面向物件設計的一個核心原則:OCP(Open-Closed Principle)開閉原則(一個軟體實體如類,模組和函式應該對擴充套件開放,對修改關閉。)
一、抽象類
定義:抽象類只是在普通類的基礎上擴充了一些抽象方法的類
抽象方法:指的是隻宣告而未實現的方法(即沒有方法體)
所有抽象方法要求使用abstract關鍵字來定義,並且抽象方法所在的類也一定要使用abstract關鍵字來定義,表示抽象類。
注意:在Java中只宣告沒實現的不都是抽象方法,本地方法(用來呼叫c/c++的同名函式)也是隻宣告沒實現。
抽象類中包含有抽象方法,而抽象方法不包含方法體,即沒有具體實現。因此抽象類不能直接產生例項化物件。
abstract class Person{ private String name; public String getName(){ return name; } public abstract void test(); } class Student extends Person{ public void test(){ System.out.println("重寫的方法"); } } class Test{ public static void main(String[] args) { Person per1 = new Student(); per1.test(); } }
1.抽象類的使用原則
a。所有的抽象類必須有子類(final與abstract不能同時出現)
b。抽象類的子類必須重寫抽象類的所有抽象方法(private與abstract也不能同時出現)
c。抽象類無法直接建立例項化物件,需要通過子類向上轉型為其例項化
2.抽象類的相關約定
a。抽象類一定存在構造方法,子類也一定遵循物件例項化流程。先呼叫父類構造再呼叫子類構造。
abstract class Person{ private String name; public Person(){ System.out.println("抽象類的構造方法"); } public String getName(){ return name; } public abstract void test(); } class Student extends Person{ public void test(){ System.out.println("重寫的方法"); } } class Test{ public static void main(String[] args) { Person per1 = new Student(); per1.test(); } } /** * 輸出 * 抽象類的構造方法 * 重寫的方法 */
注:如果父類沒有無參構造,那麼子類構造必須使用super明確指出使用父類哪個構造方法。
b。抽象類可以沒有任何抽象方法,但此時仍然不能直接建立例項化物件。
c。final與abstract不能同時出現;private與abstract也不能同時出現。
d。抽象類也分為內部抽象類和外部抽象類。對於內部抽象類,可以用static宣告,子類只需要重寫外部抽象類中的直接抽象方法即可,內部抽象類的抽象方法可以不重寫。
額外話題:關於物件例項化
物件的例項化操作實際上需要以下幾個核心步驟:
- 進行類載入
- 進行類物件的空間開闢
- 進行類物件中的屬性初始化(構造方法)