Java Enum类型浅析

今天在code的时候看到如下定义的Enum类型,觉得很奇怪:

public enum Sex {
	NONE {
		@Override
		public String getName() {
			// TODO Auto-generated method stub
			return "空";
		}
	},
	MAN {
		@Override
		public String getName() {
			// TODO Auto-generated method stub
			return "男";
		}
	},
	WOMEN {
		@Override
		public String getName() {
			// TODO Auto-generated method stub
			return "女";
		}
	};
	
	public abstract String getName();
}

      印象中Enum类型应该是被翻译成final的类,而每个成员应该都是此类的实例,为什么还能加入abstract方法,而且还能被重写呢.

随后又写了一个类:

State:

public enum State {
	
	BUSY,
	LEISURE;
	
}

     然后使用javap -p命令反编译了一下两个枚举对象生成的.class文件:

     首先是Sex.class,反编译结果如下:

//Compiled from "Sex.java"
public abstract class test.he.enumeration.Sex extends java.lang.Enum<test.he.enumeration.Sex> {
  public static final test.he.enumeration.Sex NONE;
  public static final test.he.enumeration.Sex MAN;
  public static final test.he.enumeration.Sex WOMEN;
  private static final test.he.enumeration.Sex[] $VALUES;
  public static test.he.enumeration.Sex[] values();
  public static test.he.enumeration.Sex valueOf(java.lang.String);
  private test.he.enumeration.Sex();
  public abstract java.lang.String getName();
  test.he.enumeration.Sex(java.lang.String, int, test.he.enumeration.Sex$1);
  static {};
}
    1. 发现这里的Sex类被声明成abstract的了.

     2.而且还发现系统还生成了另外3个.class文件:Sex$1.class、Sex$2.class和Sex$3.class


     编译其中一个Sex$1.class:

//Compiled from "Sex.java"
final class test.he.enumeration.Sex$1 extends test.he.enumeration.Sex {
  test.he.enumeration.Sex$1(java.lang.String, int);
  public java.lang.String getName();
}

     3.注意到这里的Sex$1已经变成包访问权限,而且被声明了final,并且继承了Sex


     再使用jd-gui反编译Sex$1.class:

 enum Sex$1
{
  Sex$1()
  {
    super(str, i, null);
  }

  public String getName() {
    return "空";
  }
}
     4.这个其实就是我们重写后的新的enum类,构造方法也是包访问权限

     随后反编译了State.class文件:

//Compiled from "State.java"
public final class test.he.enumeration.State extends java.lang.Enum<test.he.enum
eration.State> {
  public static final test.he.enumeration.State BUSY;
  public static final test.he.enumeration.State LEISURE;
  private static final test.he.enumeration.State[] $VALUES;
  public static test.he.enumeration.State[] values();
  public static test.he.enumeration.State valueOf(java.lang.String);
  private test.he.enumeration.State();
  static {};
}

     5.发现这里的对象直接被声明成了final.


试着把abstract方法删除,直接在对象后面定义方法,发现反编译的结果大致一致

只是Sex没被声明任何关键字:public class Sex

可以理解为Sex中,可以有自己的对象,也可以有自己子类的对象,所以未声明任何关键字

在一般情况下,需要把共有方法声明为abstract方法,

 因为从public static final test.he.enumeration.Sex NONE;可以知道,这里利用了多态性,在外部访问NONE时,只能访问Sex中存在的方法

 其实测试一下可以发现,不需要将方法声明为abstract方法也可以访问,但是使用abstract有更好的强制性,让子类必须重写这个方法


从上面的众多结果可以发现,Enum中的每个属性都是 该类(A)的实例/该类的子类(B extends A)的实例

向Enum类(A)中的属性中添加方法或属性,该类(A)就不会被(abstract或者正常)声明为final,并且产生继承自该类的子类(B extends A),而该属性就会成为子类(B)的对象.

好吧有点绕口......不会说......

如果这个浅析有错误,希望大家指正



### 回答1: Javaenum类型是一种特殊的类型,它可以用来定义一组有限的常量。enum类型Java语言中的一个关键字,可以用来定义枚举类型。每个enum常量都是enum类型的一个实例。enum类型可以用来定义枚举类型,例如月份、星期、颜色等。 例如: ``` enum Season { SPRING, SUMMER, FALL, WINTER } ``` 上面代码定义了一个枚举类型Season,它有4个枚举常量:SPRING、SUMMER、FALL和WINTER。 enum类型也可以带有构造函数和方法,带有构造函数和方法的enum类型需要利用关键字enum定义 ``` enum Color { RED("红色", 1), GREEN("绿色", 2), BLUE("蓝色", 3); private String name; private int index; private Color(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } } ``` 上面代码定义了一个枚举类型Color,它有3个枚举常量:RED、GREEN和BLUE。带有构造函数和方法的enum类型可以更方便的存储和获取枚举常量的信息。 总结:Javaenum类型是一种特殊的类型,它可以用来定义一组有限的常量,可以避免使用常 ### 回答2: Java中的enum类型是一种特殊的数据类型,它用于定义一组常量。常量是指在程序运行期间不会改变的值。枚举类型可以以更简洁和可读性好的方式来表示一组相关常量。 枚举类型Java中由关键字enum来定义,它能够包含一个或多个枚举常量。每个枚举常量都拥有自己的名称和值。我们可以通过枚举常量的名称来引用它们,并且无法对枚举常量进行更改。 枚举类型可以具有方法、构造函数和字段,就像普通的Java类一样。使用enum定义的枚举类型默认继承自java.lang.Enum类。此外,枚举类型还可以实现接口,从而使枚举常量能够具备更多的行为。 枚举类型Java中的应用非常广泛,它主要用于定义一组固定的常量,例如季节、星期几、颜色等。我们可以通过enum类型提供的方法来遍历枚举常量,比如values()方法可以返回枚举类型的所有常量,valueOf()方法可以根据常量名获取枚举常量。 使用枚举类型有许多好处,它可以提供更好的类型安全性,避免了使用原始类型常量的麻烦。此外,枚举类型在编码过程中也可以增加可读性,并且它们的实例是线程安全的。 总之,Java中的enum类型是一种非常有用的特性,它提供了一种更好的方式来定义和使用常量。通过使用enum类型,我们可以让代码更具可读性和可维护性。 ### 回答3: Javaenum类型是一种特殊的数据类型,用于定义一组常量。枚举类型可以认为是一个固定值的集合,比如一周的天数或是一年的季节。 在Java中,使用关键字enum来定义一个枚举类型。枚举类型中的每个常量都是唯一且有固定值的,它们可以通过枚举类型的名称来访问。 枚举类型的定义方式如下: enum Season { SPRING, SUMMER, AUTUMN, WINTER } 在上面的代码中,定义了一个名为Season的枚举类型,其中包含了四个常量:SPRING、SUMMER、AUTUMN和WINTER。 枚举类型可以用于switch语句中,让代码更加简洁和易读。例如: Season season = Season.SUMMER; switch (season) { case SPRING: System.out.println("春天"); break; case SUMMER: System.out.println("夏天"); break; case AUTUMN: System.out.println("秋天"); break; case WINTER: System.out.println("冬天"); break; } 除了常量之外,枚举类型还可以有构造方法、成员变量和成员方法。可以通过修改枚举类型的构造方法来给每个常量赋予不同的属性。 总之,Javaenum类型是一种方便、灵活且易于使用的数据类型,适用于定义一组固定值的常量。通过使用枚举类型,可以提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值