0

我正在查看我书中提供的示例代码

enum Coin
{
   PENNY(1),
   NICKEL(5),
   DIME(10),
   QUARTER(25);

   private final int denomValue;

   Coin(int denomValue)
   {
      this.denomValue = denomValue;
   }

   int denomValue()
   {
      return denomValue;
   }

   int toDenomination(int numPennies)
   {
      return numPennies / denomValue;
   }
}

public class Coins
{
   public static void main(String[] args)
   {
      if (args.length == 1)
      {
         int numPennies = Integer.parseInt(args[0]);
         System.out.println(numPennies + " pennies is equivalent to:");
         int numQuarters = Coin.QUARTER.toDenomination(numPennies);
         System.out.println(numQuarters + " " + Coin.QUARTER.toString() +
                            (numQuarters != 1 ? "s," : ","));
         numPennies -= numQuarters * Coin.QUARTER.denomValue();
         int numDimes = Coin.DIME.toDenomination(numPennies);
         System.out.println(numDimes + " " + Coin.DIME.toString() +
                            (numDimes != 1 ? "s, " : ","));
         numPennies -= numDimes * Coin.DIME.denomValue();
         int numNickels = Coin.NICKEL.toDenomination(numPennies);
         System.out.println(numNickels + " " + Coin.NICKEL.toString() +
                            (numNickels != 1 ? "s, " : ", and"));
         numPennies -= numNickels*Coin.NICKEL.denomValue();
         System.out.println(numPennies + " " + Coin.PENNY.toString() +
                            (numPennies != 1 ? "s" : ""));
      }
      System.out.println();
      System.out.println("Denomination values:");
      for (int i = 0; i < Coin.values().length; i++)
         System.out.println(Coin.values()[i].denomValue());
   }
}  

如果 enum 就像一个类,是否可以在类中为方法和字段使用相同的名称,就像在 denomValue 中所做的那样?

为什么会int numQuarters = Coin.QUARTER.toDenomination(numPennies);以这种方式调用?toDenomination()默认 是静态的吗?

在上述情况下,denomValue 字段的值是多少?该程序的输出提示它应该等于 QUARTER。但这是如何工作的?Coin.QUARTER 是否等同于创建一个硬币对象并将 QUARTER 作为其构造函数参数传递?

4

2 回答 2

6

每个PENNY,NICKEL都是Coin类的实例并且是静态的,因此它们可以作为Coin.PENNY.

所以当你这样做时:

Coin.QUARTER.toDenomination(numPennies)

您正在访问QUARTERcoin 类的实例并调用其toDenomination()方法,该方法是在实例上调用的实例方法QUARTER

当你这样做时:

PENNY(1) //this actually calls the constructor with one integer argument of Coin class

检查 PENNY 是Coin类的实例:

System.out.println(Coin.PENNY.getClass());  //Will show you Coin
于 2013-07-29T09:42:44.937 回答
1

Enums 是特殊类:

  • 它们是常量类。
  • 枚举值只能静态访问。

因此,为什么Enums 有一个私有构造函数。

获得值后,就可以像普通类一样访问声明的方法和属性。

的值denomValue取决于枚举中Enum声明的值。Coin例如:PENNY枚举denomValue1并且将永远是1

于 2013-07-29T09:44:23.640 回答