Java基礎:關鍵字 abstract

1、概述 

  1. 只給出方法定義而不具體實現的方法被稱爲抽象方法,抽象方法是沒有方法體的,在代碼的表達上就是沒有“{}”。使用 abstract 修飾符來表示抽象方法和抽象類。 
  2. abstract修飾符表示所修飾的類沒有完全實現,還不能實例化。如果在類的方法聲明中使用abstract修飾符,表明該方法是一個抽象方法,它需要在子類實現。如果一個類包含抽象方法,則這個類也是抽象類,必須使用abstract修飾符,並且不能實例化。 
  3. 注意,抽象類除了包含抽象方法外,還可以包含具體的變量和具體的方法。類即使不包含抽象方法,也可以被聲明爲抽象類,防止被實例化。

2、抽象類特點 

  1. 抽象類不能實例化,即不能對其用new運算符; 
  2. 類中如果有一個或多個abstract方法,則該類必須聲明爲abstract; 
  3. 抽象類中的方法不一定都是abstract方法,它還可以包含一個或者多個具體的方法; 
  4. 即使一個類中不含抽象方法,它也可以聲明爲抽象類; 
  5. 抽象類中的抽象方法要被使用,必須由子類複寫起所有的抽象方法後,建立子類對象調用。 
  6. 如果子類只覆蓋了部分抽象方法,那麼該子類還是一個抽象類。

3、什麼情況下,使用抽象類 

  1. 類中包含一個明確聲明的抽象方法; 
  2. 類的任何一個父類包含一個沒有實現的抽象方法; 
  3. 類的直接父接口聲明或者繼承了一個抽象方法,並且該類沒有聲明或者實現該抽象方法。

4、關於抽象類的幾點說明 

  1. 抽象類不能直接使用,必須用子類去實現抽象類,然後使用其子類的實例。然而可以創建一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例,也就是可以使用抽象類來充當形參,實際實現類作爲實參,也就是多態的應用。 
  2. 構造函數和靜態函數以及final修飾的函數不能使用abstract修飾符。 
  3. 如果試圖創建一個抽象類的實例就會產生編譯錯誤。 
  4. 如果一個類是非抽象類卻包含一個抽象方法,就會產生編譯錯誤。 
  5. 抽象類中有構造函數。如果抽象類是父類,需要給子類提供實例的初始化。

5、abstract 關鍵字和哪些關鍵字不能共存? 

  1. final:被final修飾的類不能有子類。而被abstract修飾的類一定是一個父類。 
  2. private: 抽象類中的私有的抽象方法,不被子類所知,就無法被複寫。而抽象方法出現的就是需要被複寫。 
  3. static:如果static可以修飾抽象方法,那麼連對象都省了,直接類名調用就可以了。可是抽象方法運行沒意義。

abstract和interface的區別

1.相同點

  1. 兩者都是抽象類,都不能實例化。
  2. interface實現類及abstrctclass的子類都必須要實現已經聲明的抽象方法。

2. 不同點

  1. interface需要實現,要用implements,而abstract class需要繼承,要用extends。
  2. 一個類可以實現多個interface,但一個類只能繼承一個abstract class。
  3. interface強調特定功能的實現,而abstractclass強調所屬關係。
  4. 儘管interface實現類及abstrct class的子類都必須要實現相應的抽象方法,但實現的形式不同。interface中的每一個方法都是抽象方法,都只是聲明的(declaration,沒有方法體),實現類必須要實現。而abstractclass的子類可以有選擇地實現。

這個選擇有兩點含義: 
    一是Abastract class中並非所有的方法都是抽象的,只有那些冠有abstract的方法纔是抽象的,子類必須實現。那些沒有abstract的方法,在Abstrct class中必須定義方法體。 
    二是abstract class的子類在繼承它時,對非抽象方法既可以直接繼承,也可以覆蓋;而對抽象方法,可以選擇實現,也可以通過再次聲明其方法爲抽象的方式,無需實現,留給其子類來實現,但此類必須也聲明爲抽象類。既是抽象類,當然也不能實例化。 

    5.abstract class是interface與Class的中介。 

interface是完全抽象的,只能聲明方法,而且只能聲明pulic的方法,不能聲明private及protected的方法,不能定義方法體,也不能聲明實例變量。然而,interface卻可以聲明常量變量,並且在JDK中不難找出這種例子。但將常量變量放在interface中違背了其作爲接口的作用而存在的宗旨,也混淆了interface與類的不同價值。如果的確需要,可以將其放在相應的abstractclass或Class中。 

abstract class在interface及Class中起到了承上啓下的作用。一方面,abstract class是抽象的,可以聲明抽象方法,以規範子類必須實現的功能;另一方面,它又可以定義缺省的方法體,供子類直接使用或覆蓋。另外,它還可以定義自己的實例變量,以供子類通過繼承來使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章