Enum作为一个班级工作?

时间:2015-08-12 16:03:24

标签: java class object enums

我写了一个测试类,我正在尝试 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'喜欢'一堂课,但我无法初始化它?

3 个答案:

答案 0 :(得分:5)

您无法使用enum关键字对new进行实例化,因为枚举的构造函数始终是私有的。

枚举构造函数是隐式私有的,就像隐式公开的接口方法一样。

JLS的相关部分指出:

  

如果没有为普通类的构造函数指定访问修饰符,则构造函数具有默认访问权限。

     

如果没有为枚举类型的构造函数指定访问修饰符,则构造函数为private

     

如果枚举类型(第8.9节)的构造函数声明为publicprotected,则为编译时错误。

你只需要以这种方式思考,枚举基本上是一个值集,所以它的构造函数必须是私有的,否则有人会实例化它并创建更多的值从而打败了它的整个目的。

希望它有所帮助。

答案 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();
}