天天看點

Java基礎(十三)——面向對象下 抽象類與方法、abstract不能與private、static、final同時使用!

抽象類與抽象方法

    • 一、定義
    • 二、abstract關鍵字
      • abstract修飾類
      • abstract修飾方法
      • abstract與這些是水火不容的:private、static、final修飾的方法、final修飾的類
        • private
        • static
        • final修飾的方法
        • final修飾的類

一、定義

随着繼承層次中子類變得越來越多,越來越具體,而父類越來越一般,越來越通用,類的設計應該保證子類與父類有一種共享的特征,是以就要将父類抽象化,抽象的類沒有具體執行個體。

二、abstract關鍵字

abstract修飾類

——抽象類,抽象類不能被執行個體化,那麼抽象類中可以有構造器嗎?(可以的)可以通過子類調用父類的構造器,是以開發中都會對抽象提供子類。

abstract修飾方法

——抽象方法,抽象方法沒有方法體,那麼如何執行這個方法?

一般情況,調用方法有這兩種方式:

1.建立一個類的對象執行個體,通過對象.方法來調用,但是抽象類無法建立對象,這也說明包含抽象方法的類一定是抽象類

2.子類中重寫父類中的所有抽象方法,通過建立子類的對象進而調用這個方法

注:子類中重寫父類中的所有抽象方法,該子類才可以使用,如果子類中沒有重寫父類中的所有抽象方法,則這個子類一定是一個抽象類。

abstract與這些是水火不容的:private、static、final修飾的方法、final修飾的類

private

private通路修飾符修飾的方法隻能在本類當中使用.是以,不能用private去修飾抽象方法.抽象方法一定是要被子類重寫的,如果private了就不能被通路到了

static

Java中用static修飾符修飾的方法為靜态方法,靜态方法不可以被重寫,如果父類中含有一個靜态方法,且在子類中也含有一個傳回類型、方法名、參數清單均與之相同的靜态方法,那麼該子類實際上隻是将父類中的該同名方法進行了隐藏,而非重寫。換句話說,父類和子類中含有的其實是兩個沒有關系的方法,它們的行為也并不具有多态性,是以,通過一個指向子類對象的父類引用變量來調用父子同名的靜态方法時,隻會調用父類的靜态方法。

舉例說明:

public class Father {
    // 定義一個靜态方法
    public static void eat(){
        System.out.println("Father----eat");
    }
}
           
public class Son extends Father{
    public static void eat(){
        System.out.println("Son----eat");
    }

    public static void main(String[] args) {
        Father fa = new Father();
        Son son = new Son();
        Father fa2 = new Son();
        fa.eat();    // 輸出Father----eat
        son.eat();   // 輸出Son----eat
        fa2.eat();   // 輸出Father----eat
    }
}
           

建立fa,調用的是父類中的靜态方法eat

建立son,調用的是子類中的靜态方法eat

父類引用指向子類對象,調用的是父類中的靜态方法eat

final修飾的方法

final修飾的方法是不能被重寫的,而抽象方法是要被重寫的,這就沖突了

final修飾的類

final修飾的類無法被繼承,而抽象類是要被繼承的