2016-09-26 1 views
0

Я читаю Java Как программировать 10-е издание и просматриваю первые несколько глав. В этом примере мы показываем, как убедиться в классе SecureRandom, но есть часть, которая меня полностью озадачивает.Зачем использовать объявляющую ссылочную переменную object 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, почему она все еще называется переменной Craps?

Ваша переменная randomNumbers является членом Craps класса и его тип SecureRandom. то есть определено, что он используется как переменная класса Craps, которая имеет тип SecureRandom. Он определяется как статическое средство, где будет только одна копия randomNumbers, и она будет использоваться всеми экземплярами Craps