我试图通过使用功能适用于所有的常量和定义功能为颜色enum
和其他例如信息每个常量的发言权,使GREEN
可是为什么我需要定义的抽象函数一样,虽然我已经有个别功能为每不断我对enum
。
enum color {
GREEN {
public void info() {
System.out.println("Dangerous Color: GREEN");
}
},
RED {
public void info() {
System.out.println("Dangerous Color");
}
},
BLUE {
public void info() {
System.out.println("Ordinary universal colour: BLUE");
}
};
public void info() { System.out.println("Ordinary universal colour"); }
public abstract void info();
}
public class EnumDemo4 {
public static void main(String[] args) {
color[] c = color.values();
for (color c1 : c) {
System.out.println(c1);
c1.info();
}
}
}
为什么我们需要方法外enum
常数法,虽然我们已经为每个常数不同的方法?
为什么我们需要补充,虽然我们已经定义了各自恒定功能的抽象的,非抽象的方法?
首先,你的代码不能编译。你不能在同一个枚举定义info()
两次。
这条线已被删除:public void info() { System.out.println("Ordinary universal colour"); }
无论如何,当你期待它的工作?它不与任何颜色相关联。
正确的定义是这样的:
enum Color {
GREEN {
@Override
public void info() {
System.out.println("Dangerous Color: GREEN");
}
},
RED {
@Override
public void info() {
System.out.println("Dangerous Color");
}
},
BLUE {
@Override
public void info() {
System.out.println("Ordinary universal colour: BLUE");
}
};
public abstract void info();
}
您需要定义枚举水平abstract void info()
的原因是因为要强制在你的枚举所有的常量提供。据低保列举的所有实例将提供它,所以你c1.info()
功能行main()
工作。
如果您尝试删除abstract void info()
,您的常量将不约而同各有info()
实现的,但没有告诉编译器在Color
枚举的水平,你将永远拥有它。因此,将编译失败。
如果你想要一个稍微不那么笨重的定义,你可以改变它这样,它做同样的事情:
enum Color {
GREEN("Dangerous Color: GREEN"),
RED("Dangerous Color"),
BLUE("Ordinary universal colour: BLUE");
private final String info;
Colour(String info) {
this.info = info;
}
public void info() {
System.out.println(info);
}
}