7
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&B6の本からのSCJP1.6の質問です。これは、SCJP 6の機能としての定数固有のクラス本体の例です。これを実行して、結果の出力を確認するにはどうすればよいですか?

2つの質問があります:

  1. 私のJavaメインメソッドはどのように見えますか?この部分的なコードを実行するのを手伝ってください。出力がどのように動作するか理解できません。

  2. getLidCode()Java 1.6のこのクラス本体では、メソッドはどのように機能しますか?

4

2 に答える 2

16

定数固有のクラス本体と呼ばれるものは、JLSが列挙型定数のオプションのクラス本体と呼ぶものです。これは、列挙型を囲む外部を拡張する匿名の内部クラスとして実装されます。したがって、あなたの場合、列挙型定数は、を拡張し、メソッドをオーバーライドOVERWHELMINGする匿名の内部型になります。擬似コードでは、内部クラスは次のようになります。CoffeeSizegetLidCode()

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());
于 2013-03-08T18:46:16.660 に答える
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
------------------------------------
于 2013-03-09T12:53:26.430 に答える