枚舉類(enum)可以派生子類


枚舉類默認是final修飾的,不能派生子類,但是

枚舉類如果是抽象的,則其不是final修飾,可以派生子類,其子類為final修飾

枚舉類包含匿名內部類,該父類不是final修飾,其內部類是final修飾

在今天的學習,我發現了枚舉類enum是可以派生子類的,可是不是說enum為了不改變數據,使用final修飾的嗎,於是我就自己試了試,首先使用正常沒有派生子類的枚舉類如下:

public enum AceEnum{
	BOY("男孩"),GIRL("女孩");
	private String gender;
	private AceEnum(String gender){
		this.gender = gender;
	}
}

然后編譯,並進行反編譯:
在這里插入圖片描述
可以看的出,在編譯后,AceEnum枚舉類已經是final類,那么按理說應該是不能派生子類的,可是,繼續向下看。如果我們要為每個不同的枚舉對象設置一個特定的方法,那么就需要應用的匿名內部類,為其實現相應方法,也就是改成下面的代碼

public enum AceEnum{
	BOY("男孩"){
		public void show(){
			System.out.println("我是男孩");
		}
	},GIRL("女孩"){
		public void show(){
			System.out.println("我是女孩");
		};
	};
	private String gender;
	private AceEnum(String gender){
		this.gender = gender;
	}
}

在這里插入圖片描述
結果發現,他的final修飾符沒有了,所以是可以派生出匿名子類,不過也同樣注意到,匿名內部類中的方法是無意義的,因為沒有辦法通過枚舉類使用該方法,所以需要為其添加一個可以唄訪問的方法,

public enum AceEnum{
	BOY("男孩"){
		public void show(){
			System.out.println("我是男孩");
		}
	},GIRL("女孩"){
		public void show(){
			System.out.println("我是女孩");
		};
	};
	private String gender;
	private AceEnum(String gender){
		this.gender = gender;
	}
	public abstract void show();
}

在這里插入圖片描述
也就發現,現在這種情況符合我們的要求,並且這個枚舉類是抽象的,然后通過查閱資料,我發現

枚舉類,如果是非抽象的,那么會默認采用final修飾,而如果是抽象的,也即是最后一個例子,那么由於抽象類是不能被final修飾的,(抽象類如果不實現就沒什么意義,用final修飾的話會導致其不能被實現),所以是可以派生子類的。

而另一種情況,就是非抽象,不過用匿名內部類實現自己特定的方法:

public enum AceEnum{

	MALE("男"){
		public void info() {
			System.out.println("男的");
		}
	},
	FEMALE("女"){
		public void info() {
			System.out.println("女的");
		}
	};
	private final String name;
	private AceEnum(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void info() {
		System.out.println("我是默認");
	}
	public static void main(String[] args) {
		AceEnum boy = AceEnum.MALE;
		boy.info();
	}
}

在這里插入圖片描述
編譯后,有三個文件,一個是枚舉類父類,他是沒有final修飾符的,還有兩個內部類,都繼承於父類,他們都是final修飾的。

我認為這個機制是能更好的讓我們使用枚舉類

1.我們在使用枚舉類的時候,不能更改枚舉類的信息

2.枚舉類可以根據不同需求,對不同枚舉值編寫其不同的方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM