Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 枚举可以用作类吗?_Java - Fatal编程技术网

Java 枚举可以用作类吗?

Java 枚举可以用作类吗?,java,Java,我正在通读,看到一个正在使用的enum示例: public enum Planet { MERCURY (3.303e+23, 2.4397e6), VENUS (4.869e+24, 6.0518e6), EARTH (5.976e+24, 6.37814e6), MARS (6.421e+23, 3.3972e6), JUPITER (1.9e+27, 7.1492e7), SATURN (5.688e+26, 6.026

我正在通读,看到一个正在使用的enum示例:


public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    private double mass() { return mass; }
    private double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("Usage: java Planet <earth_weight>");
            System.exit(-1);
        }
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }
}


公共枚举行星{
水银(3.303e+23,2.4397e6),
金星(4.869e+24,6.0518e6),
接地(5.976e+24,6.37814e6),
火星(6.421e+23,3.3972e6),
木星(1.9e+27,7.1492e7),
土星(5.688e+26,6.0268e7),
天王星(8.686e+25,2.5559e7),
海王星(1.024e+26,2.4746e7);
私人最终双质量;//单位为千克
专用最终双半径;//以米为单位
行星(双质量,双半径){
这个质量=质量;
这个半径=半径;
}
私有双质量(){return mass;}
专用双半径(){return radius;}
//通用重力常数(m3 kg-1 s-2)
公共静态最终双G=6.67300E-11;
双表面整体性(){
返回G*质量/(半径*半径);
}
双曲面灯光(双质量){
返回其他质量*表面间隙();
}
公共静态void main(字符串[]args){
如果(args.length!=1){
System.err.println(“用法:JavaPlanet”);
系统退出(-1);
}
双倍重量=double.parseDouble(args[0]);
双质量=土壤重量/土壤表面完整性();
对于(行星p:Planet.values())
System.out.printf(“您在%s上的重量是%f%n”,
p、 p.表面光(质量);
}
}
我一直认为枚举是通常在类之外使用的相关常量集,但本例显示了使用枚举时,它就像使用类一样,有自己的方法和构造函数。我知道它是一个枚举,因为类声明中有“enum”。枚举可以像类一样使用吗?如果类和枚举如此相似,它们之间的区别是什么?对于像标准类一样工作的枚举,有哪些好的用途


谢谢

枚举和标准类之间的主要区别在于限制:枚举的所有实例都必须在编译时声明;所有字段都必须是最终字段,并且类不能扩展。

枚举和标准类之间的主要区别在于限制:枚举的所有实例都必须在编译时声明;所有字段都必须是final,并且类不能扩展。

enum关键字是一种语言构造,它本质上创建了一个(final)类,该类扩展了
java.lang.enum
,并强制您在enum定义中预先定义所有命名实例(可能为空)集。 所以答案肯定是肯定的;事实上,你不能用其他任何方式来使用它

即使不向其添加任何逻辑,它仍然是类:

enum Day { SUNDAY, MONDAY... }

这已经为您提供了静态方法,如
Day.valueOf()
和实例方法,如
Day.SUNDAY.ordinal()
name()
compareTo()
关键字
enum
是一种语言构造,它本质上创建了一个(最终的)关键字类,该类扩展了
java.lang.Enum
,并强制您在枚举定义中预先定义所有命名实例(可能为空)集。 所以答案肯定是肯定的;事实上,你不能用其他任何方式来使用它

即使不向其添加任何逻辑,它仍然是类:

enum Day { SUNDAY, MONDAY... }

这已经为您提供了静态方法,如
Day.valueOf()
,以及实例方法,如
Day.SUNDAY.ordinal()
name()
compareTo()
如果您想将enum作为一个类使用,可以按以下方式使用它

public class Weather {

     public enum Season {
         WINTER,
         SPRING,
         SUMMER,
         FALL
     }
     private final Season season;

     private static final List < Weather > listWeather = new ArrayList < Weather > ();

     private Weather(Season season) {
         this.season = season;
     }

     public Season getSeason() {
         return season;
     }

     static {

         for (Season season: Season.values()) {
             listWeather.add(new Weather(season));
         }
     }

     public static ArrayList < Weather > getWeatherList() {
         return listWeather;
     }
     public String toString() {
         return season;
     }
 }
公共类天气{
公众普查季节{
冬天
春天
夏天,
落下
}
私人决赛季;
私有静态最终列表listWeather=newarraylist();
私人天气(季节){
这个季节=季节;
}
公众季节{
回归季节;
}
静止的{
用于(季节:季节.值()){
添加(新天气(季节));
}
}
公共静态数组列表getWeatherList(){
回归天气;
}
公共字符串toString(){
回归季节;
}
}

如果您想将enum作为一个类使用,可以按以下方式使用它

public class Weather {

     public enum Season {
         WINTER,
         SPRING,
         SUMMER,
         FALL
     }
     private final Season season;

     private static final List < Weather > listWeather = new ArrayList < Weather > ();

     private Weather(Season season) {
         this.season = season;
     }

     public Season getSeason() {
         return season;
     }

     static {

         for (Season season: Season.values()) {
             listWeather.add(new Weather(season));
         }
     }

     public static ArrayList < Weather > getWeatherList() {
         return listWeather;
     }
     public String toString() {
         return season;
     }
 }
公共类天气{
公众普查季节{
冬天
春天
夏天,
落下
}
私人决赛季;
私有静态最终列表listWeather=newarraylist();
私人天气(季节){
这个季节=季节;
}
公众季节{
回归季节;
}
静止的{
用于(季节:季节.值()){
添加(新天气(季节));
}
}
公共静态数组列表getWeatherList(){
回归天气;
}
公共字符串toString(){
回归季节;
}
}

一个
枚举
非常像一个普通的类,不同的是实例是在编译时定义的,并且保证是单例的,它们可能不会扩展任何东西

但是,他们可以:

  • 有实例字段,可能是最终的,也可能不是(尽管在常规用法中它们是不可变的,但不是必需的)
  • 具有类(
    静态
    )字段(尽管它们必须在实例之后声明)
  • 有字段的getter/setter
  • 有构造器(但不是公共构造器)
  • 实现接口
  • 用注解装饰

一个
枚举
非常像一个普通的类,不同的是实例是在编译时定义的,并且保证是单例的,它们不能
扩展
任何东西

但是,他们可以:

  • 有实例字段,这可能是最终的,也可能不是(尽管在常规用法中它们是i)