Java 1.6中的枚举类主体功能

时间:2013-03-08 18:28:14

标签: java enums

enum CoffeeSize{               
      BIG(8),   
      HUGE(10),   
      OVERWHELMING(16) {   

       public String getLidCode(){   
            return "A";   
       }   
      };   

    private int ounces;   

    public int getOunces(){   
         return ounces;   
    }    

    CoffeeSize(int ounces){   
        this.ounces = ounces;   
    }   

    public String getLidCode(){   
            return "B";   
    }   
}  

这是K& B 6书中的SCJP 1.6问题。 这是常量特定类主体的一个示例,作为SCJP 6的一个特性。如何执行此操作并查看结果输出?

我有两个问题:

  1. 我的Java主要方法是什么样的?请帮我执行这部分代码。我无法理解输出的行为。

  2. {1}}方法在Java 1.6中如何在此类主体中工作?

2 个答案:

答案 0 :(得分:16)

你称之为常量特定类主体的是JLS所指的枚举常量的可选类主体。它被实现为一个匿名的内部类,扩展外部的封闭枚举。因此,在您的情况下,枚举常量OVERWHELMING将是一个扩展CoffeeSize的匿名内部类型,并覆盖方法getLidCode()。在伪代码中,内部类看起来像这样:

class CoffeeSize$1 extends CoffeeSize {
    @Override
    public String getLidCode() {
        return "A";
    }
}

在常量getLidCode()BIG上调用HUGE将调用基本枚举实现,而在OVERWHELMING上调用相同的方法将调用方法的覆盖版本,因为OVERWHELMING实际上是另一种类型。要进行测试,只需运行代码即可调用不同枚举常量的getLidCode()

System.out.println(CoffeeSize.BIG.getLidCode());
System.out.println(CoffeeSize.HUGE.getLidCode());
System.out.println(CoffeeSize.OVERWHELMING.getLidCode());

答案 1 :(得分:3)

I have executed my answer,as below.Please correct me if im wrong.output is given. 

干杯: - ))

public class EnumOverriddenExample {
enum CoffeeSize{               
      BIG(8),   
      HUGE(10),   
      OVERWHELMING(16){   

           public String getLidCode(){   
                return "A";   
           }   
      };

    CoffeeSize(int ounces){   
            this.ounces = ounces;   
    }

    private int ounces;   

    public int getOunces(){   
         return ounces;   
    }   

    public void setOunces(int ounces){   
         this.ounces=ounces;   
    }

    public String getLidCode(){   
            return "B";   
    }   
}  
public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("CoffeeSize for BIG is "+EnumOverriddenExample.CoffeeSize.BIG.getLidCode());
    System.out.println("CoffeeSize for HUGE is "+EnumOverriddenExample.CoffeeSize.HUGE.getLidCode());
    System.out.println("CoffeeSize for OVERWHELMING is "+EnumOverriddenExample.CoffeeSize.OVERWHELMING.getLidCode());

    System.out.println("CoffeeSize for BIG is "+EnumOverriddenExample.CoffeeSize.BIG.getOunces());
    System.out.println("CoffeeSize for HUGE is "+EnumOverriddenExample.CoffeeSize.HUGE.getOunces());
    System.out.println("CoffeeSize for OVERWHELMING is "+EnumOverriddenExample.CoffeeSize.OVERWHELMING.getOunces());

}

}

Output is below
-----------------------------------
CoffeeSize for BIG is B --> returns "B"
CoffeeSize for HUGE is B -->returns "B"
CoffeeSize for OVERWHELMING is A--constant specific class body returns "A"
CoffeeSize for BIG is 8
CoffeeSize for HUGE is 10
CoffeeSize for OVERWHELMING is 16
------------------------------------