java枚举继承
❶ java的枚举过程,是用什么关键字来修饰的
定义枚举类型时本质上就是定义一个类别,只不过很多细节由编译器帮我们完成了,所以某些程度上,enum关键字的作用 就像是class或interface
当我们使用“enum”定义枚举类型时,实质上我们定义出来的类型继承自java.lang.Enum类型,而枚举的成员其实就是我们定义的枚举类型的一个实例(Instance),他们都被预设为final,所以我们无法改变他们,他们也是static成员,所以我们可以通过类型名称直接使用他们,当然最重要的,他们都是公开的(public)。
即,我们定义的每个枚举类型都继承自java.lang.Enum类,枚举中的每一个成员默认都是public static final 的。
❷ 请问java枚举类型的枚举值是不是继承枚举类的一个对象啊
确切的说java里有枚举类型enum,只可以用在类静态或者成员变量中,不可作为局部变量。
实际上这样声明的枚举类型是集继承于java.lang.Enum类的,但是我们不能直接继承枚举类,只能通过这种方法创建枚举对象。
示例
class Test {
private static enum test {
ffffff, blue, green
}
public static void main(String[] args) {
System.out.println(test.ffffff);
}
}
❸ java 枚举可以大量用吗
首先你要了解枚举(enum)的概念,java.lang.Enum是JDK5.0版本新加入的类,我们所编写的枚举其实都是隐式的继承自它,既然它是类,因此会有类型安全性、编译期检查以及可将它用在变量声明中的能力。这可以把使用数值或字符串来模拟含义的常量彻底打败,枚举中的各个实例(值)都是被隐式声明为public static final的,而且你也不能将这些声明手动赋予给实例(值),编译器会自己处理。
枚举的应用场合:在你需要一个仅允许特定数据类型值的有限集合,在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。
如果搞懂了这些问题,你就应该自己可以判断你的程序里需要不需要它,大量应用枚举这件事本身并不会引发什么(性能问题),要看你应用的场景是否合适,sun搞了enum必然有其道理,原则上讲JDK5以后都是为了简化开发,enum也是一样的,只要你认为使用了enum会为你编程带来便捷,那么你还考虑什么,程序员不要被业界那些条条框框所束缚,一动手就一大堆的面向对象思想,设计模式的,打个比方,你天天要去一个地方,建议你多试几条路,这样你就知道哪条最近了。
❹ java 可以 继承的枚举 怎么写
importjava.util.ArrayList;
importjava.util.List;
publicclassColor{
privateStringvalue;
privatestaticList<Color>colors=newArrayList<Color>();
publicColor(Stringvalue){
this.value=value;
colors.add(this);
}
publicstaticColorRed=newColor("red");
publicstaticColorBlud=newColor("Blud");
publicstaticColorGreen=newColor("Green");
publicvoidtest(){
System.out.println("我是"+value);
}
publicstaticColor[]values(){
returncolors.toArray(newColor[colors.size()]);
}
publicstaticvoidmain(String[]args){
Color.Red.test();
Color.Green.test();
ColorB.black.test();
for(Colorc:ColorB.values()){
c.test();
}
}
}
/**
*子类
*@author储宝
*
*/
classColorBextendsColor{
publicColorB(Stringvalue){
super(value);
}
publicstaticColorBblack=newColorB("black");
}
枚举的伪实现。和枚举不同的是,还是可以new一个对象,本来是想把构造私有化的,但是就不能继承了。
❺ java枚举类型
java 枚举类型enum 的使用
最近跟同事讨论问题的时候,突然同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum 定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义。既然不明白就抽时间研究下吧。
Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型。要了解枚举类型,建议大家先打开jdk 中的Enum类简单读一下,这个类里面定义了很多protected 方法,比如构造函数,如果要使用这些方法我们可以把枚举类型定义到当前类中。每个枚举类型,都有自己的名字和顺序,当我们输出一个枚举类型的时候,会输入枚举类型的name ,具体可以参考下面的例子。
一、 通常定义常量方法
我们通常利用public final static 方法定义的代码如下,分别用1 表示红灯,3 表示绿灯,2 表示黄灯。
package com.csdn.myEnum;
public class Light {
/* 红灯 */
public final static int RED =1;
/* 绿灯 */
public final static int GREEN =3;
/* 黄灯 */
public final static int YELLOW =2;
}
二、 枚举类型定义常量方法
枚举类型的简单定义方法如下,我们似乎没办法定义每个枚举类型的值。比如我们定义红灯、绿灯和黄灯的代码可能如下:
public enum Light {
RED , GREEN , YELLOW ;
}
我们只能够表示出红灯、绿灯和黄灯,但是具体的值我们没办法表示出来。别急,既然枚举类型提供了构造函数,我们可以通过构造函数和覆写toString方法来实现。首先给Light 枚举类型增加构造方法,然后每个枚举类型的值通过构造函数传入对应的参数,同时覆写toString 方法,在该方法中返回从构造函数中传入的参数,改造后的代码如下:
public enum Light {
// 利用构造函数传参
RED (1), GREEN (3), YELLOW (2);
// 定义私有变量
private int nCode ;
// 构造函数,枚举类型只能为私有
private Light( int _nCode) {
this . nCode = _nCode;
}
@Override
public String toString() {
return String.valueOf ( this . nCode );
}
}
三、 完整示例代码
枚举类型的完整演示代码如下:
package com.csdn.myEnum;
import java.util.EnumMap;
import java.util.EnumSet;
public class LightTest {
// 1. 定义枚举类型
public enum Light {
// 利用构造函数传参
RED (1), GREEN (3), YELLOW (2);
// 定义私有变量
private int nCode ;
// 构造函数,枚举类型只能为私有
private Light( int _nCode) {
this . nCode = _nCode;
}
@Override
public String toString() {
return String.valueOf ( this . nCode );
}
}
/**
* @param args
*/
public static void main(String[] args ) {
// 1. 遍历枚举类型
System. out .println( " 演示枚举类型的遍历 ......" );
testTraversalEnum ();
// 2. 演示 EnumMap 对象的使用
System. out .println( " 演示 EnmuMap 对象的使用和遍历 ....." );
testEnumMap ();
// 3. 演示 EnmuSet 的使用
System. out .println( " 演示 EnmuSet 对象的使用和遍历 ....." );
testEnumSet ();
}
/**
* 演示枚举类型的遍历
*/
private static void testTraversalEnum() {
Light[] allLight = Light.values ();
for (Light aLight : allLight) {
System. out .println( " 当前灯 name : " + aLight.name());
System. out .println( " 当前灯 ordinal : " + aLight.ordinal());
System. out .println( " 当前灯: " + aLight);
}
}
/**
* 演示 EnumMap 的使用, EnumMap 跟 HashMap 的使用差不多,只不过 key 要是枚举类型
*/
private static void testEnumMap() {
// 1. 演示定义 EnumMap 对象, EnumMap 对象的构造函数需要参数传入 , 默认是key 的类的类型
EnumMap<Light, String> currEnumMap = new EnumMap<Light, String>(
Light. class );
currEnumMap.put(Light. RED , " 红灯 " );
currEnumMap.put(Light. GREEN , " 绿灯 " );
currEnumMap.put(Light. YELLOW , " 黄灯 " );
// 2. 遍历对象
for (Light aLight : Light.values ()) {
System. out .println( "[key=" + aLight.name() + ",value="
+ currEnumMap.get(aLight) + "]" );
}
}
/**
* 演示 EnumSet 如何使用, EnumSet 是一个抽象类,获取一个类型的枚举类型内容<BR/>
* 可以使用 allOf 方法
*/
private static void testEnumSet() {
EnumSet<Light> currEnumSet = EnumSet.allOf (Light. class );
for (Light aLightSetElement : currEnumSet) {
System. out .println( " 当前 EnumSet 中数据为: " + aLightSetElement);
}
}
}
执行结果如下:
演示枚举类型的遍历 ......
当前灯 name : RED
当前灯 ordinal : 0
当前灯: 1
当前灯 name : GREEN
当前灯 ordinal : 1
当前灯: 3
当前灯 name : YELLOW
当前灯 ordinal : 2
当前灯: 2
演示 EnmuMap 对象的使用和遍历 .....
[key=RED,value= 红灯 ]
[key=GREEN,value= 绿灯 ]
[key=YELLOW,value= 黄灯 ]
演示 EnmuSet 对象的使用和遍历 .....
当前 EnumSet 中数据为: 1
当前 EnumSet 中数据为: 3
当前 EnumSet 中数据为: 2
四、 通常定义常量方法和枚举定义常量方法区别
以下内容可能有些无聊,但绝对值得一窥
1. 代码:
public class State {
public static final int ON = 1;
public static final Int OFF= 0;
}
有什么不好了,大家都这样用了很长时间了,没什么问题啊。
首先,它不是类型安全的。你必须确保是int
其次,你还要确保它的范围是0 和1
最后,很多时候你打印出来的时候,你只看到 1 和0 ,
但其没有看到代码的人并不知道你的企图,抛弃你所有旧的public static final 常量
2. 可以创建一个enum 类,把它看做一个普通的类。除了它不能继承其他类了。(java 是单继承,它已经继承了Enum),
可以添加其他方法,覆盖它本身的方法
3. switch() 参数可以使用enum 了
4. values() 方法是编译器插入到enum 定义中的static 方法,所以,当你将enum 实例向上转型为父类Enum 是,values() 就不可访问了。解决办法:在Class中有一个getEnumConstants() 方法,所以即便Enum 接口中没有values() 方法,我们仍然可以通过Class 对象取得所有的enum 实例
5. 无法从enum 继承子类,如果需要扩展enum 中的元素,在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组。达到将枚举元素进行分组。
6. 使用EnumSet 代替标志。enum 要求其成员都是唯一的,但是enum 中不能删除添加元素。
7. EnumMap 的key 是enum ,value 是任何其他Object 对象。
8. enum 允许程序员为eunm 实例编写方法。所以可以为每个enum 实例赋予各自不同的行为。
9. 使用enum 的职责链(Chain of Responsibility) . 这个关系到设计模式的职责链模式。以多种不同的方法来解决一个问题。然后将他们链接在一起。当一个请求到来时,遍历这个链,直到链中的某个解决方案能够处理该请求。
10. 使用enum 的状态机
11. 使用enum 多路分发
❻ java枚举类的几点疑惑
先看一个简单的枚举类。
package enumcase;
public enum SeasonEnum {
SPRING,SUMMER,FALL,WINTER;
}
enum和class、interface的地位一样
使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口。
枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。
使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。
❼ java枚举类型enum用法
用法如下:
用法一:常量 在JDK1.5之前,我们定义常量都是:public static fianl....。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法
用法六:使用接口组织枚举
用法七:关于枚举集合的使用
❽ java中的枚举类型怎么定义
Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。
1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。
2.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。
3.Enum默认实现了java.lang.Comparable接口。
4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.
5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。
6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。
7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。
了解了这些基本特性,我们来看看如何使用它们。
1.遍历所有有枚举值. 知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。
for (Color c: Color.values())
System.out.println(“find value:” + c);
2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。
public enum Color {
Red,
Green,
Blue;
/*
*定义一个变量表示枚举值的数目。
*(我有点奇怪为什么sun没有给enum直接提供一个size方法).
*/
private static int number = Color.values().length ;
/**
* 随机返回一个枚举值
@return a random enum value.
*/
public static Color getRandomColor(){
long random = System.currentTimeMillis() % number;
switch ((int) random){
case 0:
return Color.Red;
case 1:
return Color.Green;
case 2:
return Color.Blue;
default : return Color.Red;
}
}
}
可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。
3.覆载(Override)toString, valueOf方法
前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。
….
public String toString(){
switch (this){
case Red:
return "Color.Red";
case Green:
return "Color.Green";
case Blue:
return "Color.Blue";
default:
return "Unknow Color";
}
}
….
这时我们可以看到,此时再用前面的遍历代码打印出来的是
Color.Red
Color.Green
Color.Blue
而不是
Red
Green
Blue.
可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。
4.使用构造函数
虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。
public enum Color {
Red("This is Red"),
Green("This is Green"),
Blue("This is Blue");
private String desc;
Color(String desc){
this.desc = desc;
}
public String getDesc(){
return this.desc;
}
}
这里我们为每一个颜色提供了一个说明信息, 然后定义了一个构造函数接受这个说明信息。
要注意这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。
5.实现特定的接口
我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。
6.定义枚举值自己的方法。
前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。
public enum Color {
Red {
public String toString(){
return "Color.Red";
}
},
Green {
public String toString(){
return "Color.Green";
}
},
Blue{
public String toString(){
return "Color.Blue";
}
};
}
从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。
总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个
人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。
❾ 枚举能继承类或接口吗
1 枚举的定义 :一个特殊的java类,对象的某个属性的值不能是任意的,必须为固定的一组取值其中的某一个
接口的定义:定义对象的扩展功能,是在继承之外还需这个对象具备的一些功能
2 上面的定义中说明了枚举是一个特俗的java类,既然是一个java类,那么就可以继承接口。
3 下面的用java代码来展示枚举继承接口的方式 :
//定义一个枚举:
public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES }
public interfacel SuitImp{}//接口
//枚举实现接口的代码
public enum Suit implements SuitImp()