我写了一个测试类,我正在尝试 enum 类型:
public class EnumTest {
enum Car{MERCEDEZ, FERRARI};
public static void main(String[] args) {
Car carObj;
carObj.run();
}
}
所以我似乎可以宣布'一个使用 enum 的类(因为我的包中没有类Car),我把方法run()
看看会发生什么。之后,我按照IDE的建议编写了run()
正文,但也在 enum 中。
enum Car {
MERCEDEZ, FERRARI;
public void run() {
}
};
我认为这很奇怪,但还可以。我继续我的弗兰肯斯坦实验并试图用main上的构造函数初始化对象。
enum Car {
MERCEDEZ, FERRARI;
public void run() {
// TODO Auto-generated method stub
};
Car(){}
};
Car carObj = new Car();
它说我无法实例化类型EnumTest.Car,所以我的测试已经完成,但有疑问。对不起,如果它看起来很傻,但我没有在我的搜索中找到它。
问题:为什么我可以使用Car'喜欢'一堂课,但我无法初始化它?
答案 0 :(得分:5)
您无法使用enum
关键字对new
进行实例化,因为枚举的构造函数始终是私有的。
枚举构造函数是隐式私有的,就像隐式公开的接口方法一样。
JLS的相关部分指出:
如果没有为普通类的构造函数指定访问修饰符,则构造函数具有默认访问权限。
如果没有为枚举类型的构造函数指定访问修饰符,则构造函数为
private
。如果枚举类型(第8.9节)的构造函数声明为
public
或protected
,则为编译时错误。
你只需要以这种方式思考,枚举基本上是一个值集,所以它的构造函数必须是私有的,否则有人会实例化它并创建更多的值从而打败了它的整个目的。
希望它有所帮助。
答案 1 :(得分:3)
您声明的Car
是嵌套的enum
。
它嵌套在你的EnumTest
类中,并绑定到它的实例。
您无法以类的方式初始化枚举。
但是,您可以声明绑定到每个enum
的实例的方法,例如run
方法。
答案 2 :(得分:0)
您使每个枚举实现接口:
enum Car implements Runnable {
MERCEDEZ {
@Override
public void run() {
}
},
FERRARI {
@Override
public void run() {
}
};
};
public static void main(String[] args) {
Car carObj = Car.MERCEDEZ;
carObj.run();
}