零基礎學習之Java列舉類
- 概述
- JDK1.5之前
- 創建列舉類
- 代碼示例
- JDK1.5之后
- 創建列舉類
- 代碼示例
- 列舉類繼承父類
- 基本介紹
- 代碼示例
- 列舉類實作介面
- 基本介紹
- 代碼示例
- 列舉類實作單例模式
- 基本介紹
- 代碼示例
概述
列舉類是Java類中一個特殊的類,它是用來專門解決某些型別的物件是有限的幾個的場景,這樣的場景在我們的生活中非常常見,比如:人的性別(男,女),一年的月份(1月…12月),一年的季節(春夏秋冬),一周內天的表示法(周一…周日),彩虹的顏色(紅…紫)等等,所以列舉類在實際生活中尤其的有用,
專業點說就是:列舉型別本質上也是一種類,只不過是這個類的物件是固定的幾個,而不能隨意讓用戶創建,
Java列舉類是在JDK1.5新增的類,在JDK1.5之前,需要程式員自己通過特殊的方式來定義列舉型別,在JDK1.5之后,Java支持enum關鍵字來快速的定義列舉型別,
下面將以JDK1.5為界限對Java列舉類進行說明
JDK1.5之前
創建列舉類
在該階段如果想要實作一個類對外提供固定個數得物件(列舉類)的功能,需要通程序式員自己的邏輯創建類,其創建要求如下:
- ①必須將構造器私有化
- ②需要設定若干個公有的靜態常量(想要提供的物件)
- ③類中得物件,一定要設定為常量,不能被修改
- ④類中如果有屬性,屬性不能提供set方法(防止被修改)
代碼示例
Person類
package com.atguigu.bean;
public class Person {
private int id;
private String name;
private Gender gender; //物件關聯
public Person() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
}
實作列舉類的功能
package com.atguigu.bean;
public class Gender {
//方法一:常用的
public static final Gender BOY = new Gender("男孩");
public static final Gender GIRL = new Gender("女孩");
private final String value;
private Gender(String value) {
this.value=value;
}
public String getValue() {
return value;
}
/*
方法二
public static final Gender BOY;
public static final Gender GIRL;
static {
BOY = new Gender();
GIRL = new Gender();
}
public Gender() {
}*/
/*
方法三
public static final Gender BOY =new Gender();
public static final Gender GIRL =new Gender();
public Gender() {
}
public static Gender getBOY() {
return BOY;
}
public static Gender getGIRL() {
return GIRL;
}*/
}
測驗類
package com.atguigu.demo;
import com.atguigu.bean.Gender;
import com.atguigu.bean.Person;
public class Demo2 {
public static void main(String[] args) {
Person person = new Person();
person.setId(10);
person.setName("張三");
person.setGender(Gender.BOY);
System.out.println(person.getName()+"的性別是:"+person.getGender().getValue());
}
}
JDK1.5之后
創建列舉類
在JDK.5之后,Java提供了enum關鍵字來快速的定義列舉型別,這樣列舉類實作起來就非常方便了,其實作語法如下:
【修飾符】 enum 列舉類名{
常量物件串列
}
【修飾符】 enum 列舉類名{
常量物件串列;
其他成員串列;
}
雖然方便實作了,但是該方法實作列舉類也有很多需要注意的點:
-
①列舉類的構造器默認是私有的,并且必須是私有的
-
② 直接寫物件名即可(物件與物件之間采用逗號隔開,最后使用分號)
-
③ 默認是采用無參構造器(后期可以設定)
-
④ 物件默認就是共有的靜態的常量
-
⑤ 物件串列必須在類的首行
-
⑥ 如果顯示的創建了有參的構造器,沒有無參構造器
物件的創建就需要使用有參構造器 ,每個物件后面加小括號
-
⑦ JDK1.5之后switch,提供支持列舉型別,case后面可以寫列舉常量名
代碼示例
列舉類
package com.atguigu.bean;
public enum Gender2 {
// BOY,GIRL; 無參
BOY("男孩"), GIRL("女孩"); //必須在第一行
private String value;
Gender2(String value) {
this.value =value ;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return value;
}
}
測驗類
package com.atguigu.demo;
import com.atguigu.bean.Gender2;
public class Demo3 {
public static void main(String[] args) {
Gender2 gender2 = Gender2.BOY; //通過類名可以呼叫說明是靜態的,跨包是共有的
// Gender2.BOY = Gender2.Girl; 不可以更改說明是常量
System.out.println(gender2.getValue());
//回傳該列舉類所有的常量物件,(后面會說到這個方法)
Gender2[] gender21 =Gender2.values();
for (int i = 0; i < gender21.length; i++) {
switch(values[i]){
case BOY:
System.out.println(values[i]+":男孩");
break;
case GIRL:
System.out.println(values[i]+":女孩");
break;
}
}
}
列舉類繼承父類
基本介紹
列舉類默認繼承的是java.lang.Enum類,因此不能再繼承其他的類,繼承了Enum類的列舉類默認有以下幾種方法:
name(); //獲取物件的名稱
toString(); //回傳也是物件的名稱,自定義的列舉類可以再次重寫
ordinal(); //回傳當前物件的位置(角標)
static values(); //回傳該列舉類所有的常量物件
static valueOf(String name); //根據字串的名稱,回傳常量物件
注:列舉類也不能被其他類繼承
代碼示例
測驗類
package com.atguigu.demo;
import com.atguigu.bean.Gender2;
public class Demo3 {
public static void main(String[] args) {
Gender2 gender2 = Gender2.BOY;
//獲取物件的名稱
System.out.println(gender2.name());
//回傳也是物件的名稱,自定義的列舉類可以再次重寫
System.out.println(gender2.toString());
//回傳當前物件的位置(角標)
System.out.println(gender2.ordinal());
//回傳該列舉類所有的常量物件
Gender2[] gender21 =Gender2.values();
for (int i = 0; i < gender21.length; i++) {
System.out.println(gender21[i]);
}
//根據字串的名稱,回傳常量物件
String str = "BOY";
Gender2 gender22 = Gender2.valueOf(str);
System.out.println(gender22);
}
}
列舉類實作介面
基本介紹
列舉類雖然不能繼承其他的類,但是列舉類也是類,可以實作介面,可以同時實作多個介面,可以統一實作,也可以用匿名內部類的形式,單獨給某個常量物件實作抽象方法,
修飾符 類名 implements 介面名{
}
注意:
- 列舉類提供的物件個數是確定的,并且在類加載的時候物件已經產生了,所以,抽象方法的實作,可以將范圍縮小到某個物件
常量物件 【(實參串列)】{
對父級做擴展
}
- 當列舉類中所有的物件都單獨對抽象方法做了實作,那么公有的實作就可以洗掉
代碼示例
public enum Gender3 implements Eat {
BOY("男孩"){
@Override
public void eat() {
System.out.println("男孩吃的多");
}
},
GIRL("女孩"){
@Override
public void eat() {
System.out.println("女孩吃的多");
}
};
}
interface Eat{
void eat();
}
列舉類實作單例模式
基本介紹
如果列舉類的物件只有一個,那么可以作為單例模式的實作,這是因為單例模式約束一個類只能實體化一個物件,目前來說在Java中,為了強制只實體化一個物件,最好的方法是使用一個列舉量,
在 Java 中使用列舉作為單例有以下幾個原因:
- 自由序列化,
- 保證一個實體(即使通過反射也不能實體化超過一個列舉,)
- 執行緒安全
代碼示例
public class Singleton {
public static void main(String[] args) {
Singleton singleton1 = Singleton.INSTANCE;
Singleton singleton2 = Singleton.INSTANCE;
System.out.println(singleton1 == singleton2 );
System.out.println("singleton1 ,hashCode= " + singleton1.hashCode());
System.out.println("singleton2 ,hashCode = " + singleton2.hashCode());
singleton1.sayOK();
}
}
enum Singleton{
INSTANCE;
public void sayOK() {
System.out.println("ok~");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/393917.html
標籤:java
