Java基礎語法08-面向對象-接口

枚舉

枚舉是一種特殊的類它的對象是有限固定的幾個常量對象。

JDK1.5之前

  • 構造器加private私有化

  • 本類內部創建一組常量對象,並添加public static修飾符,對外暴露這些常量對象

JDK1.5之後格式

【修飾符】 enum 枚舉類名{
  常量對象列表;
  其他成員列表;
}

枚舉類的要求和特點:

  • 枚舉類的常量對象列表必須在枚舉類的首行,因爲是常量,所以建議大寫

  • 如果常量對象列表後面沒有其他代碼,那麼“;”可以省略,否則不可以省略“;”。

  • 編譯器給枚舉類默認提供的是private的無參構造,如果枚舉類需要的是無參構造,就不需要聲明,寫常量對象列表時也不用加參數,

  • 如果枚舉類需要的是有參構造,需要手動定義private的有參構造,調用有參構造的方法就是在常量對象名後面加(實參列表)就可以。

  • 枚舉類默認繼承的是java.lang.Enum類,因此不能再繼承其他的類型。

  • JDK1.5之後switch,提供支持枚舉類型,case後面可以寫枚舉常量名。

  • 枚舉類型如有其它屬性,建議(不是必須)這些屬性也聲明爲final的,因爲常量對象在邏輯意義上應該不可變。

常用方法:

1.toString(): 默認返回的是常量名(對象名),可以繼續手動重寫該方法!
2.name():返回的是常量名(對象名) 【很少使用】
3.ordinal():返回常量的次序號,默認從0開始
4.values():返回該枚舉類的所有的常量對象,返回類型是當前枚舉的數組類型,是一個靜態方法
5.valueOf(String name):根據枚舉常量對象名稱獲取枚舉對象

Enum類只有一個唯一的構造器

protected Enum(String name, int ordinal)

包裝類

序號基本數據類型包裝類(java.lang包)
1 byte Byte
2 short Short
3 int Integer
4 long Long
5 float Float
6 double Double
7 char Character
8 boolean Boolean
9 void Void

 

1、裝箱與拆箱

裝箱:把基本數據類型-->包裝類對象

手動裝箱:例如:new Integer(int值) 或 Integer.valueOf(int值)

自動裝箱:Integer i = int值;

拆箱:把包裝類的對象-->基本數據類型

手動拆箱:例如:Integer的對象.intValue()

自動拆箱:int i = Integer的對象;

注意:只能與自己對應的類型之間才能實現自動裝箱與拆箱。

包裝類的一些API

包裝類有緩存對象

Byte -128~127
Short -128~127
Integer -128~127
Long -128~127
Float 沒有
Double 沒有
Character 0~127
Boolean true和false

沒有緩存對象的類或超出緩存的類,每一個都是新new的

包裝類對象不可變:一旦修改就是新對象。如:方法的參數傳遞,不會改變原先的對象的值

接口

使用 interface 關鍵字。它也會被編譯成.class文件,但一定要明確它並不是類,而是另外一種引用數據類型

Interface的方所有法訪問權限自動被聲明爲public。確切的說只能爲public

可以用abstract修飾符修飾,修飾之後就有了類的屬性(如在同一.java文件中不能再聲明一個public 權限的類了,其他待驗證)

【修飾符】 interface 接口名{
  // 靜態常量
  // 抽象方法
  // 默認方法
  // 靜態方法
  // 私有方法
}

1、公共的靜態的常量:public static final

2、公共的抽象的方法:public abstract

非抽象的實現類必須重寫

3、公共的默認方法:public default,JDK1.8之後

使用“實現類的對象."進行調用

實現類可以選擇重寫

4、公共的靜態方法:public static, JDK1.8之後

只能使用”接口名.“進行調用

實現類不能重寫

5、私有的方法:private(private不能省略)JDK1.9之後

實現接口

接口的使用,它不能創建對象,但是可以被實現(implements ,類似於被繼承)。

一個類能同時實現多個接口

【修飾符】 class 實現類 [extends 父類] implements 接口1,接口2{ 

  // 重寫接口中抽象方法【必須】
  // 重寫接口中默認方法【可選】default單詞就不要再寫了

}//繼承在前,實現在後

實現類實現接口時,必須重寫接口的所有抽象方法,否則實現類就必須是抽象類。

不能重寫靜態方法

如何調用對應的方法

  • 對於接口的靜態方法,直接使用“接口名.”進行調用即可

    • 也只能使用“接口名."進行調用,不能通過實現類的對象進行調用

  • 對於接口的抽象方法、默認方法,只能通過實現類對象纔可以調用

    • 接口不能直接創建對象,只能創建實現類的對象

接口的多實現

一個類是可以實現多個接口的,這叫做接口的多實現。並且,一個類能繼承一個父類,同時實現多個接口。

接口中,有多個抽象方法時,實現類必須重寫所有抽象方法如果抽象方法有重名的,只需要重寫一次

方法可能有衝突問題

(1)一個實現類實現了多個接口,而多個接口中出現了方法簽名相同的默認方法時:

實現類必須做出選擇:

A:保留其中一個:接口名.super.方法名

B:也可以完全重寫

(2)一個實現類既繼承父類,又實現接口,當父類中出現與接口的默認方法的方法簽名相同的方法:

A:默認遵循親爹原則,即保留父類的

B:也可以完全重寫

接口的多繼承

一個接口能繼承另一個或者多個接口,接口的繼承也使用 extends 關鍵字,子接口繼承父接口的方法。

【修飾符】 interface 接口 extends 接口1,接口2{

}

小貼士:

子接口重寫默認方法時,default關鍵字可以保留。

子類重寫默認方法時,default關鍵字不可以保留。

接口與實現類對象的多態引用

實現類實現接口,類似於子類繼承父類,因此,接口類型的變量與實現類的對象之間,也可以構成多態引用。通過接口類型的變量調用方法,最終執行的是你new的實現類對象實現的方法體。

經典接口

抽象類與接口的區別

 1、 抽象層次不同。抽象類是對類抽象,而接口是對行爲的抽象。抽象類是對整個類整體進行抽象,包括屬性、行爲,但是接口卻是對類局部(行爲)進行抽象。

2、 跨域不同。抽象類所跨域的是具有相似特點的類,而接口卻可以跨域不同的類。我們知道抽象類是從子類中發現公共部分,然後泛化成抽象類,子類繼承該父類即可,但是接口不同。實現它的子類可以不存在任何關係,共同之處。所以說抽象類所體現的是一種繼承關係,要想使得繼承關係合理,父類和派生類之間必須存在"is-a" 關係,即父類和派生類在概念本質上應該是相同的。對於接口則不然,並不要求接口的實現者和接口定義在概念本質上是一致的, 僅僅是實現了接口定義的契約而已。

 3、 設計層次不同。對於抽象類而言,它是自下而上來設計的,我們要先知道子類才能抽象出父類,而接口則不同,它根本就不需要知道子類的存在,只需要定義一個規則即可,至於什麼子類、什麼時候怎麼實現它一概不知。所以說抽象類是自底向上抽象而來的,接口是自頂向下設計出來的。 

一個類對另外一個類的依賴性應當是建立在最小的接口上

 

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