面向對象編程OOP(3)之抽象類、接口和內部類

1、抽象類

包含抽象方法的類,必須設計成抽象類!

1.1 抽象方法

只聲明瞭方法,同時使用了abstract修飾,沒有方法體!必須要子類來重寫!

1.2 抽象類的使用要點

    1.    通過抽象類,可以避免子類設計的隨意性。

    2.    有抽象方法的類只能定義能抽象類

    3.    抽象類不能實例化,及不能用new來實例化抽象類。

    4.    抽象類可以包含屬性、方法、構造方法。但是構造方法不能用來new實例,只能用來被子類調用。

    5.    抽象類只能用來繼承。

    6.    抽象方法必須被子類實現。

普通類:只有具體實現!

 抽象類:具體實現和規範(抽象方法都有!

 接口:只有規範!

2、接口

2.1 爲什麼需要接口?接口和抽象類的區別?

       接口就是比抽象類抽象抽象類,可以更加規範的對子類進行約束。全面地專業地實現了:規範和具體實現的分離。

       抽象類還提供某些具體實現,接口不提供任何實現,接口中所有方法都是抽象方法。接口是完全面向規範的,規定了一批類具有的公共方法規範。

       從接口的實現者角度看,接口定義了可以向外部提供的服務。

       從接口的調用者角度看,接口定義了實現者能提供那些服務。

       接口是兩個模塊之間通信的標準,通信的規範。如果能把你要設計的系統之間模塊之間的接口定義好,就相當於完成了系統的設計大綱,剩下的就是添磚加瓦的具體實現了。大家在工作以後,做系統時往往就是使用面向接口的思想來設計系統。

2.2 接口的定義

2.2.1 格式

[訪問修飾符]  interface 接口名   [extends  父接口1,父接口2…]  {

常量定義

方法定義

}

2.2.2 接口的特性

訪問修飾符:只能是public或默認。

接口名:和類名採用相同命名機制

extends:接口可以多繼承

常量:接口中的屬性只能是常量,總是:public static final 修飾。不寫也是。

方法:接口中的方法只能是:public abstract。 省略的話,也是public abstract。

2.3 接口的使用要點

    1.    子類通過implements來實現接口中的規範

    2.    接口不能創建實例,但是可用於聲明引用變量類型。

    3.    一個類實現了接口,必須實現接口中所有的方法,並且這些方法只能是public的。

    4.    接口中只能包含靜態常量、抽象方法,不能有普通屬性、構造方法、普通方法。

    5.    常量必然是:public static final。  我們不加這些修飾符,也是這樣。

    6.    方法必然是:public abstract。  我們不加這些修飾符,也是這樣。

    7.    接口完全支持多繼承。和類的繼承類似,子接口擴展某個父接口,將會獲得父接口中所定義的一切。

 

3、內部類

一般情況,我們把類定義成獨立的單元。有些情況下,我們把一個類放在另一個類的內部定義,稱爲內部類。

3.1 內部類的作用

    1.    內部類提供了更好的封裝。只能讓外部類直接訪問,不允許同一個包中的其他類直接訪問。

    2.    內部類可以直接訪問外部類的私有屬性,內部類被當成其外部類的成員。 但外部類不能訪問內部類的內部屬性。

 內部類的使用場合:

    由於內部類提供了更好的封裝特性,並且可以很方便的訪問外部類的屬性。所以,通常內部類在只爲所在外部類提供服務的情況下優先使用。

3.2 內部類的分類

3.2.1 成員內部類

(可以使用privateprotetedpublic任意進行修飾。 類文件:外部類$內部類.class

a)    非靜態內部類(外部類裏使用非靜態內部類和平時使用其他類沒什麼不同)

i.    非靜態內部類必須寄存在一個外部類對象裏。因此,如果有一個非靜態內部類對象那麼一定存在對應的外部類對象。 非靜態內部類對象單獨屬於外部類的某個對象。

ii.    非靜態內部類可以使用外部類的成員,但是外部類不能直接訪問非靜態內部類成員。

iii.    非靜態內部類不能有靜態方法、靜態屬性、靜態初始化塊。

iv.    靜態成員不能訪問非靜態成員:外部類的靜態方法、靜態代碼塊不能訪問非靜態內部類,包括不能使用非靜態內部類定義變量、創建實例。

v.    成員變量訪問要點:

    1.    內部類裏方法的局部變量:變量名

    2.    內部類屬性:this.變量名

    3.    外部類屬性:外部類名.this.變量名

vi.    內部類的訪問:

    1.    外部類中定義內部類:  new InnerClass()

    2.    外部類以外的地方使用非靜態內部類: 
 Outer.inner  varname = OuterObject.new Inner()

Face.Nose nose =  new Face().new Nose();
Face f2 = new Face();
Face.Nose nose2 = f2.new Nose();

b) 靜態內部類

i.    定義方式:

static  class   ClassName {
    //類體
}

ii.    使用要點:

    1.    當一個靜態內部類對象存在,並不一定存在對應的外部類對象。 因此,靜態內部類的實例方法不能直接訪問外部類的實例方法。

    2.    靜態內部類看做外部類的一個靜態成員。 因此,外部類的方法中可以通過:靜態內部類.名字  訪問靜態內部類的靜態成員。通過 new 靜態內部類()訪問靜態內部類的實例。

    3.    在外部類的外面創建靜態內部類:

Face.TestStaticInner  aInner = new  Face.TestStaticInner();

 3.2.2 匿名內部類

    適合那種只需要使用一次的類。比如:鍵盤監聽操作等等。語法:

new  父類構造器(實參類表) 實現接口 () {
    //匿名內部類類體!
}

3.2.3 局部內部類

定義在方法內部。作用域只限於本方法。用的非常少。

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