【问题标题】:Enum work as a class? [duplicate]枚举作为一个类工作? [复制]
【发布时间】:2015-08-12 16:03:23
【问题描述】:

我写了一个测试类,我正在尝试 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 'like' 一个类,但我不能初始化它?

【问题讨论】:

  • 枚举类型的构造函数必须是包私有或私有访问。它会自动创建在枚举体开头定义的常量。您不能自己调用​​枚举构造函数。 docs.oracle.com/javase/tutorial/java/javaOO/enum.html
  • 您的误解来自不知道Java中引用是如何初始化的。 Car carObj; - 这不会初始化任何东西,无论 enum 是类还是枚举。

标签: java class object enums


【解决方案1】:

您声明的Car 是一个嵌套的enum

它嵌套在您的EnumTest 类中,并绑定到它的实例。

你不能像初始化一个类一样初始化一个枚举。

但是,您可以声明绑定到每个 enum 实例的方法,例如 run 方法。

【讨论】:

    【解决方案2】:

    你让每个枚举实现接口:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      相关资源
      最近更新 更多