天天看點

abstract,final,staticabstractfinalstatic

abstract

1、abstract修飾方法

abstract修飾方法,使這個方法變成抽象方法,即隻有聲明(定義)而沒有實作,實作部分以";"代替。需要子類繼承實作。

abstract void xxx();
           

2、abstract修飾類

abstract修飾類,使這個類成為一個抽象類,類将不能生成對象執行個體,但可以做為對象變量聲明的類型,也就是編譯時類型,抽象類就像當于一類的半成品,需要子類繼承并覆寫其中的抽象方法。

這時子類才有建立執行個體的能力,如果子類沒有實作父類的抽象方法那麼子類也要為抽象類 。

有抽象方法的類一定是抽象類。但是抽象類中不一定都是抽象方法,也可以全是具體方法。

抽象類中可以有構造方法,是子類在構造子類對象時需要調用的父類(抽象類)的構造方法

abstract不可與private、static、final、native、synchronized放在一起使用。

ps:抽象類和接口的差別:

       抽象類可以有構造方法,接口中不能有構造方法。

  抽象類可以有普通成員變量,接口中沒有。

  抽象類中包含非抽象的方法,接口中的所有方法必須是抽象的。

  抽象類的抽象方法通路的類型可以是public,protected和預設類型(最好不要),接口接口方法隻能是public類型的,,并且預設為public abstract類型。

  一個類隻能繼承一個抽象類,但可以實作多個接口。

pps:

      抽象類實作接口可以不實作接口所有的方法

     非抽象類實作接口必須實作所有方法。

     抽象類實作接口後,非抽象類繼承抽象類。 此時抽象類和非抽象類共同實作接口所有方法即可。

     如:接口中有方法 1、2、3

     抽象類中實作了方法1。繼承的非抽象類實作接口方法2、3即可

final

1、final修飾變量

變量被final修飾,就會變成常量(常量應大寫),一旦指派不能改變(可以在初始化時直接指派,也可以在構造方法裡也可以指派,隻能在這兩種方法裡二選一,必須為常量指派);

對于一個基本類型的變量,一旦在初始化了之後就不能再改變。如果是引用類型的變量,在初始化之後便不能改變其引用,但是它指向的對象的内容是可變的;

final的常量不會有預設初始值,對于直接在初始化是指派時final修飾符常和static修飾符一起使用。

2、final修飾方法

被final修飾的方法将不能被其子類覆寫(該方法在子類中将無法重寫,隻能繼承),final不能用來修飾構造器;

3、final修飾類

這個類不會被繼承,final類中的所有成員方法都會被隐式地指定為final方法;

static

1、static修飾屬性

static修飾的屬性是類級别的,類變量,為該類全體執行個體對象所公有。使用類名.屬性來通路:Math.PI;

ps:

類中的執行個體變量是在建立對象時被初始化的,被static修飾的屬性(類變量),是在類加載時被建立并進行初始化;

類加載的過程是進行一次。也就是類變量隻會被建立一次。

2、static修飾方法

static修飾的方法是類級别的,靜态方法,為該類所公有。使用類名.方法來通路(無需建立類的執行個體對象);

ps:

static修飾的方法,不能通路本類中的非靜态成員(包括方法和屬性),本類的非靜态方法可以通路本類的靜态成員;靜态方法中不能出現this關鍵字;

父類中的靜态方法子類不能覆寫為非靜态的方法,在符合覆寫的條件下父類的靜态方法可以被子類所覆寫但是沒有多态;

父子類中,靜态方法隻能被靜态方法覆寫,父子類中,非靜态方法隻能被非靜态方法覆寫。

 例:java中的main方法必須寫成static的,因為在類加載時無法建立對象,靜态方法可以不通過對象調用是以在類的main方法所在在類加載時就可以通過main方法入口來運作程式。

3、static修飾代碼塊

這個代碼隻有類加載時被執行一次。可以使用靜态代碼塊初始一個類。

static塊可以置于類中的任何地方,類中可以有多個static塊。在類初次被加載的時候,會按照static塊的順序來執行每個static塊,并且隻會執行一次。

參考:https://blog.csdn.net/anbaojian/article/details/81319344