枚舉是一種特殊的類
-
-
本類內部創建一組常量對象,並添加public static修飾符,對外暴露這些常量對象
【修飾符】 enum 枚舉類名{
常量對象列表;
其他成員列表;
}
枚舉類的要求和特點:
-
枚舉類的常量對象列表必須在枚舉類的首行,因爲是常量,所以建議大寫。
-
如果常量對象列表後面沒有其他代碼,那麼“;”可以省略,否則不可以省略“;”。
-
編譯器給枚舉類默認提供的是private的無參構造,如果枚舉類需要的是無參構造,就不需要聲明,寫常量對象列表時也不用加參數,
-
如果枚舉類需要的是有參構造,需要手動定義private的有參構造,調用有參構造的方法就是在常量對象名後面加(實參列表)就可以。
-
枚舉類默認繼承的是java.lang.Enum類,因此不能再繼承其他的類型。
-
-
枚舉類型如有其它屬性,建議(不是必須)這些屬性也聲明爲final的,因爲常量對象在邏輯意義上應該不可變。
1.toString(): 默認返回的是常量名(對象名),可以繼續手動重寫該方法!
2.name():返回的是常量名(對象名) 【很少使用】
3.ordinal():返回常量的次序號,默認從0開始
4.values():返回該枚舉類的所有的常量對象,返回類型是當前枚舉的數組類型,是一個靜態方法
5.valueOf(String name):根據枚舉常量對象名稱獲取枚舉對象
序號 | 基本數據類型 | 包裝類(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的對象;
-128~127 | |
Short | -128~127 |
Integer | -128~127 |
Long | -128~127 |
Float | 沒有 |
Double | 沒有 |
Character | 0~127 |
Boolean | true和false |
包裝類對象不可變:一旦修改就是新對象。如:方法的參數傳遞,不會改變原先的對象的值
【修飾符】 interface 接口名{
// 靜態常量
// 抽象方法
// 默認方法
// 靜態方法
// 私有方法
}
1、公共的靜態的常量:public static final
2、公共的抽象的方法:public abstract
非抽象的實現類必須重寫
3、公共的默認方法:public default,JDK1.8之後
使用“實現類的對象."進行調用
實現類可以選擇重寫
4、公共的靜態方法:public static, JDK1.8之後
只能使用”接口名.“進行調用
實現類不能重寫
5、私有的方法:private(private不能省略)JDK1.9之後
【修飾符】 class 實現類 [extends 父類] implements 接口1,接口2{
// 重寫接口中抽象方法【必須】
// 重寫接口中默認方法【可選】default單詞就不要再寫了
}//繼承在前,實現在後
實現類實現接口時,必須重寫接口的所有抽象方法,否則實現類就必須是抽象類。
不能重寫靜態方法
-
-
也只能使用“接口名."進行調用,不能通過實現類的對象進行調用
-
-
對於接口的抽象方法、默認方法,只能通過實現類對象纔可以調用
-
接口不能直接創建對象,只能創建實現類的對象
-
方法可能有衝突問題:
(1)一個實現類實現了多個接口,而多個接口中出現了方法簽名相同的默認方法時:
實現類必須做出選擇:
A:保留其中一個:接口名.super.方法名
B:也可以完全重寫
(2)一個實現類既繼承父類,又實現接口,當父類中出現與接口的默認方法的方法簽名相同的方法:
B:也可以完全重寫
接口的多繼承
一個接口能繼承另一個或者多個接口,接口的繼承也使用 extends
【修飾符】 interface 接口 extends 接口1,接口2{
}
子接口重寫默認方法時,default關鍵字可以保留。
子類重寫默認方法時,default關鍵字不可以保留。
接口與實現類對象的多態引用
抽象類與接口的區別
1、 抽象層次不同。抽象類是對類抽象,而接口是對行爲的抽象。抽象類是對整個類整體進行抽象,包括屬性、行爲,但是接口卻是對類局部(行爲)進行抽象。
2、 跨域不同。抽象類所跨域的是具有相似特點的類,而接口卻可以跨域不同的類。我們知道抽象類是從子類中發現公共部分,然後泛化成抽象類,子類繼承該父類即可,但是接口不同。實現它的子類可以不存在任何關係,共同之處。所以說抽象類所體現的是一種繼承關係,要想使得繼承關係合理,父類和派生類之間必須存在"is-a" 關係,即父類和派生類在概念本質上應該是相同的。對於接口則不然,並不要求接口的實現者和接口定義在概念本質上是一致的, 僅僅是實現了接口定義的契約而已。
3、 設計層次不同。對於抽象類而言,它是自下而上來設計的,我們要先知道子類才能抽象出父類,而接口則不同,它根本就不需要知道子類的存在,只需要定義一個規則即可,至於什麼子類、什麼時候怎麼實現它一概不知。所以說抽象類是自底向上抽象而來的,接口是自頂向下設計出來的。
一個類對另外一個類的依賴性應當是建立在最小的接口上