2016-09-26 78 views
0

我正在阅读Java How to Program第10版并阅读前几章。对于这个例子,我们展示了如何确保SecureRandom类,但是有一部分让我感到困惑。为什么你会使用声明一个对象引用变量static final?

// Fig. 6.8: Craps.java 
// Craps class simulates the dice game craps. 
import java.security.SecureRandom; 

public class Craps 
{ 
    // create secure random number generator for use in method rollDice 
    private static final SecureRandom randomNumbers = new SecureRandom(); 

    // enum type with constants that represent the game status 
    private enum Status { CONTINUE, WON, LOST }; 

    // constants that represent common rolls of the dice 
    private static final int SNAKE_EYES = 2; 
    private static final int TREY = 3; 
    private static final int SEVEN = 7; 
    private static final int YO_LEVEN = 11; 
    private static final int BOX_CARS = 12; 

    // plays one game of craps 
    public static void main(String[] args) 
    { 
     int myPoint = 0; // point if no win or loss on first roll 
     Status gameStatus; // can contain CONTINUE, WON or LOST 

     int sumOfDice = rollDice(); // first roll of the dice 

     // determine game status and point based on first roll 
     switch (sumOfDice) 
     { 
      case SEVEN: // win with 7 on first roll 
      case YO_LEVEN: // win with 11 on first roll 
       gameStatus = Status.WON; 
       break; 
      case SNAKE_EYES: // lose with 2 on first roll 
      case TREY: // lose with 3 on first roll 
      case BOX_CARS: // lose with 12 on first roll 
       gameStatus = Status.LOST; 
       break; 
      default: 
       gameStatus = Status.CONTINUE; // game is not over 
       myPoint = sumOfDice; // remember the point 
       System.out.printf("Point is %d%n", myPoint); 
       break; 
     } 

     // while game is not complete 
     while (gameStatus == Status.CONTINUE) // not WON or LOST 
     { 
      sumOfDice = rollDice(); // roll dice again 

      // determine game status 
      if (sumOfDice == myPoint) // win by making point 
       gameStatus = Status.WON; 
      else if (sumOfDice == SEVEN) // lose by rolling 7 before point 
       gameStatus = Status.LOST; 
     } 

     // display won or lost message 
     if (gameStatus == Status.WON) 
      System.out.println("Player wins"); 
     else 
      System.out.println("Player loses"); 
    } 

    // roll dice, calculate sum and display results 
    public static int rollDice() 
    { 
     // pick random die values 
     int die1 = 1 + randomNumbers.nextInt(6); // first die roll 
     int die2 = 1 + randomNumbers.nextInt(6); // second die roll 

     int sum = die1 + die2; // sum of die values 

     // display results of this roll 
     System.out.printf("Player rolled %d + %d = %d%n", die1, die2, sum); 

     return sum; 
    } 
} // end class Craps 

从书,它提到,它被声明为类的私有静态最终变量,SecureRandom使一个物体总是被用来调用方法,rollDice()。如果有一个包含Craps类的多个实例的程序,它们将共享这一个对象。我的问题是有没有机会需要类SecureRandom的多个实例?下一个问题将是因为这是一个对象引用变量SecureRandom,为什么它仍然被称为Craps的变量?

回答

1

下一个问题将是,因为这是一个SecureRandom的对象引用变量,为什么它仍然被称为骰子的变量?

你的可变randomNumbersCraps类的成员,并且它的类型是SecureRandom的。即它被定义为用作SecureRandom类型的掷骰子类的变量。它被定义为静态意味着将只有一个randomNumbers的副本,并且将由所有Craps

相关问题