1. 程式人生 > >Java學習——抽象類

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宣告,子類只需要重寫外部抽象類中的直接抽象方法即可,內部抽象類的抽象方法可以不重寫。

額外話題:關於物件例項化
物件的例項化操作實際上需要以下幾個核心步驟:

  • 進行類載入
  • 進行類物件的空間開闢
  • 進行類物件中的屬性初始化(構造方法)