Enum作为一个班级工作?

Lup*_*iyo 4 java enums class object

我写了一个测试类,我正在尝试枚举类型:

public class EnumTest { 
   enum Car{MERCEDEZ, FERRARI};

   public static void main(String[] args) {     
      Car carObj;
      carObj.run();
   }
}
Run Code Online (Sandbox Code Playgroud)

所以似乎我可以使用枚举 "声明"一个类(因为我的包中没有类Car),我把方法run()看看会发生什么.在那之后,我run()按照IDE的建议写了我的身体,但也在枚举中.

enum Car {
   MERCEDEZ, FERRARI;

      public void run() {   
      }
   };
Run Code Online (Sandbox Code Playgroud)

我觉得这很奇怪,但还可以.我继续我的弗兰肯斯坦实验并试图用main上的构造函数初始化对象.

enum Car {
        MERCEDEZ, FERRARI;
        public void run() {
            // TODO Auto-generated method stub

        };
        Car(){}
    };
Run Code Online (Sandbox Code Playgroud)
Car carObj = new Car();
Run Code Online (Sandbox Code Playgroud)

它说我无法实例化类型EnumTest.Car,所以我的测试已经完成,但有疑问.对不起,如果它看起来很傻,但我没有在我的搜索中找到这个.

问题:为什么我可以将汽车'像'一类,但我不能初始化它?

Ari*_*Roy 5

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

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

JLS的相关部分指出:

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

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

它是一个编译时间错误,如果枚举类型(§8.9)的构造被声明publicprotected.

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

希望能帮助到你.