Java 什么是枚举?
现在我正试图弄清楚什么是java中的枚举。我知道它们是如何工作的,以及如何/何时使用它们,但我有点不清楚它们到底是什么。根据它们的行为,在我看来,它们只不过是一个带有私有构造函数的类。然而,在我看来,编译器对它们做了一些特殊的处理,因为枚举有一个名为Java 什么是枚举?,java,Java,现在我正试图弄清楚什么是java中的枚举。我知道它们是如何工作的,以及如何/何时使用它们,但我有点不清楚它们到底是什么。根据它们的行为,在我看来,它们只不过是一个带有私有构造函数的类。然而,在我看来,编译器对它们做了一些特殊的处理,因为枚举有一个名为values()的特殊方法,它不会出现在Oracle文档站点上的Enum类中 我的问题是,枚举到底是什么?编译器如何解释它们?一个enum是一个类,它继承了(a)一个private构造函数的类,如您所述;(b)固定的命名,最终实例列表 在封面下,当您
values()
的特殊方法,它不会出现在Oracle文档站点上的Enum类中
我的问题是,枚举到底是什么?编译器如何解释它们?一个
enum
是一个类,它继承了(a)一个private
构造函数的类,如您所述;(b)固定的命名,最终
实例列表
在封面下,当您声明一个枚举时
:
public enum Foo {
A(1) {
public void bar() {
System.out.println("A#bar");
}
},
B(2) {
public void bar() {
System.out.println("B#bar");
}
},
C(3) {
public void bar() {
System.out.println("C#bar");
}
};
private Foo(int x) {
// Code goes here...
}
public abstract void bar();
}
…您可以想象编译器生成如下内容:
public class Foo extends Enum<Foo> {
public static final Foo A=new Foo(1) {
public void bar() {
System.out.println("A#bar");
}
};
public static final Foo B=new Foo(2) {
public void bar() {
System.out.println("B#bar");
}
};
public static final Foo C=new Foo(3) {
public void bar() {
System.out.println("C#bar");
}
};
private Foo(int x) {
// Code goes here...
}
}
公共类Foo扩展了Enum{
公共静态最终Foo A=新Foo(1){
公共空白栏(){
System.out.println(“A#bar”);
}
};
公共静态最终Foo B=新Foo(2){
公共空白栏(){
System.out.println(“B#bar”);
}
};
公共静态最终Foo C=新Foo(3){
公共空白栏(){
System.out.println(“C#bar”);
}
};
私人Foo(int x){
//代码在这里。。。
}
}
还有几件事使enum
s与众不同:
enum
s有一个固定的实例列表。这允许它在开关
没有处理每个值的case
语句时发出警告我肯定我遗漏了一些东西,但这是一个很好的起点。一个
enum
是一个从类继承的类,该类具有(a)一个私有
构造函数,如您所述;(b)固定的命名,最终
实例列表
在封面下,当您声明一个枚举时
:
public enum Foo {
A(1) {
public void bar() {
System.out.println("A#bar");
}
},
B(2) {
public void bar() {
System.out.println("B#bar");
}
},
C(3) {
public void bar() {
System.out.println("C#bar");
}
};
private Foo(int x) {
// Code goes here...
}
public abstract void bar();
}
…您可以想象编译器生成如下内容:
public class Foo extends Enum<Foo> {
public static final Foo A=new Foo(1) {
public void bar() {
System.out.println("A#bar");
}
};
public static final Foo B=new Foo(2) {
public void bar() {
System.out.println("B#bar");
}
};
public static final Foo C=new Foo(3) {
public void bar() {
System.out.println("C#bar");
}
};
private Foo(int x) {
// Code goes here...
}
}
公共类Foo扩展了Enum{
公共静态最终Foo A=新Foo(1){
公共空白栏(){
System.out.println(“A#bar”);
}
};
公共静态最终Foo B=新Foo(2){
公共空白栏(){
System.out.println(“B#bar”);
}
};
公共静态最终Foo C=新Foo(3){
公共空白栏(){
System.out.println(“C#bar”);
}
};
私人Foo(int x){
//代码在这里。。。
}
}
还有几件事使enum
s与众不同:
enum
s有一个固定的实例列表。这允许它在开关
没有处理每个值的case
语句时发出警告我肯定我错过了一些东西,但这是一个好的开始。阅读。在那之后,带着一个具体的问题回来。你有麻烦过吗?这是一个很好的起点。投票关闭,因为缺乏研究。从上面的链接可以看出:枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量。
enum
s:Singleton的用法在文档中。此外,如果E
是enum
类型的名称,则该类型具有以下隐式声明的static
方法:[……]public static E[]values();
[…]按声明顺序返回包含此枚举类型常量的数组@白化病Wordfish:阅读文章。它会告诉你一切!习惯于阅读说明书。你已经浪费了太多时间了,读吧。在那之后,带着一个具体的问题回来。你有麻烦过吗?这是一个很好的起点。投票关闭,因为缺乏研究。从上面的链接可以看出:枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量。enum
s:Singleton的用法在文档中。此外,如果E
是enum
类型的名称,则该类型具有以下隐式声明的static
方法:[……]public static E[]values();
[…]按声明顺序返回包含此枚举类型常量的数组@白化病Wordfish:阅读文章。它会告诉你一切!习惯于阅读说明书。你已经浪费了这么多时间。默认可见性构造函数也是允许的,尽管我认为这是一个“古怪”的波希米亚怪。是的,我同意,这是一个怪癖。我的意思是,答案很好,我根本不想从中减去,但OP也可以直接阅读@波希米亚人可能会启用懒惰,让您只键入Foo(){…}
,而不显式指定private
。因为无论如何都不允许调用枚举构造函数,所以它的访问级别并不那么重要,而且它的隐私也会被暗示。(当然,他们也可以这样做,省略访问修饰符相当于枚举的private
,但这将在某个地方增加一个特殊情况。)也就是说,尽管存在反射和安全性的微妙交互,假设枚举构造函数可以通过反射调用,我现在还不确定。谢谢您的响应。默认值