枚举可以继承吗?如何继承?

2020-04-17 18:51:47 java常见问答 12945

如果你也对java编程语言感兴趣的话,可能也听说过或者说了解过,数据类型,可能其中的枚举类型,大家可能不太了解,下面就跟小编一起来看看,枚举是否可以继承?可以的话如何继承?

其实在项目中,一般是推荐使用枚举来代替常量接口和常量类。但是呢,枚举类的用途又不仅仅是定义常量,还有其它较多的方法,比如:实现接口、定义抽象方法、当作单例使用…

枚举类使用enum进行创建,其实例必须从”第一行“开始显示写出。

enum Season{
     SPRING,SUMMER,FALL,WINTER;//默认public static final,这都是Season类的对象。
}

枚举有以下特点,

枚举类的对象默认都是public static final

枚举类的构造器都是private,所以无法在外部创建其实例,这也决定了枚举类实例的个数的确定性(写了几个就是几个)。

enum类不可被继承。

enum类默认extends java.lang.Enum,所以无法再继承其他类。

当在enum类中创建匿名子类对象的时候,在运行时,会将Season编译为一个.class文件,没有final修饰,同时对于匿名子类,会生成一个.class文件,当enum类中没有匿名子类对象时,对应的class就是final的,如果enum类中含有抽象方法,那么这个类就是抽象的,给出的对象必须实现抽象方法,即便enum中有抽象方法,它也是被final修饰的,由于final 和abstract是不能同时出现的。所以大多认为:枚举类实际上不存在final、abstract。只是规定不能被继承,final、abstract是对于运行时生成的对应class而言的。enum类不存在final或者abstract的,就是不能被继承。

如果像《疯狂Java讲义》中说的,非抽象枚举类默认是final的,那么应该可以显示用final修饰,但是不行,所以说,enum本身不存在final、abstract的说法。就是不能被继承。运行时生成的class才有final、abstract的说法。

运行时,会生成对应的.class文件(可以理解为一个新的class类型的类)。

如果enum类中没有抽象方法,也没有匿名子类对象,那么这个类是被final修饰的。

如果enum类中有抽象方法,那么这个类是抽象的,对象必须实现该抽象方法。

如果enum类中没有抽象方法,但是有匿名子类对象,那么这个类不被final修饰,也不是抽象的。

其实由此可以见得,枚举类使用enum定义之后是在编译后默认继承了java.lang.Enum类,而不是普通的去继承Object类。其次enum声明类继承了Serializable和Comparable两个接口。且采用zdenum声明后,此类专会被编译器加上final的声明,故该类是无法继承的。

好了,希望以上内容可以帮助到有需要的朋友,还想了解更多一些java一些知识问答记得关注本站消息哦。