1. Java中的枚举究竟是什么鬼?
如果从C++转java的话,会发现一个现象那就是在java中的枚举跟C++区别非常大,甚至可以说除了名字一样外,其他实现等都是非常不同的,在C++枚举更像个常数,而java的枚举更靠近正常的普通成员内部类。让我们从字节码角度看看java中的enum究竟是什么东西吧
源码:
public enum book{
BOOK1,BOOK2,BOOK3
}
字节码:
Last modified 2017-7-23; size 1026 bytes
MD5 checksum 338ca8c3927b424ae7b0acacb42fd28b
Compiled from "ChildTest.java"
public final class ChildTest$book extendsjava.lang.Enum<ChildTest$book>
minor version: 0
major version: 52
flags:ACC_PUBLIC, ACC_FINAL, ACC_SUPER, ACC_ENUM
Constantpool:
#1 = Class #2 // ChildTest$book
#2 = Utf8 ChildTest$book
#3 = Class #4 // java/lang/Enum
#4 = Utf8 java/lang/Enum
#5 = Utf8 BOOK1
#6 = Utf8 LChildTest$book;
#7 = Utf8 BOOK2
#8 = Utf8 BOOK3
#9 = Utf8 ENUM$VALUES
#10 = Utf8 [LChildTest$book;
#11 = Utf8 <clinit>
#12 = Utf8 ()V
#13 = Utf8 Code
#14 = String #5 // BOOK1
#15 = Methodref #1.#16 //ChildTest$book."<init>":(Ljava/lang
/String;I)V
#16 = NameAndType #17:#18 //"<init>":(Ljava/lang/String;I)V
#17 = Utf8 <init>
#18 = Utf8 (Ljava/lang/String;I)V
#19 = Fieldref #1.#20 // ChildTest$book.BOOK1:LChildTest$boo
k;
#20 = NameAndType #5:#6 // BOOK1:LChildTest$book;
#21 = String #7 // BOOK2
#22 = Fieldref #1.#23 // ChildTest$book.BOOK2:LChildTest$boo
k;
#23 = NameAndType #7:#6 // BOOK2:LChildTest$book;
#24 = String