枚举类(enum)可以派生子类

版权声明:如需转载注明出处 https://blog.csdn.net/u011463794/article/details/88933674
枚举类默认是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.枚举类可以根据不同需求,对不同枚举值编写其不同的方法

猜你喜欢

转载自blog.csdn.net/u011463794/article/details/88933674