title: Printing a private field from a separate class
body: <p>I have been tasked with linking two classes together. The first class is a ticket machine which allows the person to buy a ticket and then print it out (via System.out.println). The second class is a clock display which displays the time.</p>
  
  <p>My task is to make the ticket class print the time currently displayed in the clock display class. I have been told I do not need to edit either the NumberDisplay class or the ClockDisplay class.</p>
  
  <p>My initital thoughts were to create a new ClockDisplay field within my ticketmachine class, and then use</p>
  
  <pre><code>System.out.println("Time:" + ClockDisplay.displayString);
  </code></pre>
  
  <p>as displayString is what I use to find the value within the clockdisplay class. However, as the field is private and I cannot edit the clockdisplay class, I cannot do this. Any thoughts?</p>
  
  <p>Thank you. Here is my code so far, with the aforementioned piece of code in the TicketMachine class.</p>
  
  <p><strong>NumberDisplay</strong></p>
  
  <pre><code>public class NumberDisplay
  {
  private int limit;
  private int value;
  
  /**
   * Constructor for objects of class NumberDisplay.
   * Set the limit at which the display rolls over.
   */
  public NumberDisplay(int rollOverLimit)
  {
      limit = rollOverLimit;
      value = 0;
  }
  
  /**
   * Return the current value.
   */
  public int getValue()
  {
      return value;
  }
  
  /**
   * Return the display value (that is, the current value as a two-digit
   * String. If the value is less than ten, it will be padded with a leading
   * zero).
   */
  public String getDisplayValue()
  {
      if(value &lt; 10) {
          return "0" + value;
      }
      else {
          return "" + value;
      }
  }
  
  /**
   * Set the value of the display to the new specified value. If the new
   * value is less than zero or over the limit, do nothing.
   */
  public void setValue(int replacementValue)
  {
      if((replacementValue &gt;= 0) &amp;&amp; (replacementValue &lt; limit)) {
          value = replacementValue;
      }
  }
  
  /**
   * Increment the display value by one, rolling over to zero if the
   * limit is reached.
   */
  public void increment()
  {
      if ((value +1) &gt;= limit) {
          value = 0;
      }
      else {
          value = value + 1;
      }
  }
  }
  </code></pre>
  
  <p><strong>ClockDisplay</strong></p>
  
  <pre><code>public class ClockDisplay
  {
  private NumberDisplay hours;
  private NumberDisplay minutes;
  private NumberDisplay seconds;
  private String displayString;    // simulates the actual display
  
  /**
   * Constructor for ClockDisplay objects. This constructor 
   * creates a new clock set at 12:00:00.
   */
  public ClockDisplay()
  {
      hours = new NumberDisplay(12); // changed from 24hour to 12 hour
      minutes = new NumberDisplay(60);
      seconds = new NumberDisplay(60);
      updateDisplay();
  }
  
  /**
   * Constructor for ClockDisplay objects. This constructor
   * creates a new clock set at the time specified by the 
   * parameters.
   */
  public ClockDisplay(int hour, int minute, int second)
  {
      hours = new NumberDisplay(12); //changed from 24hour to 12 hour
      minutes = new NumberDisplay(60);
      seconds = new NumberDisplay(60);
      setTime(hour, minute, second);
  }
  
  /**
   * This method should get called once every minute - it makes
   * the clock display go one minute forward.
   */
  public void timeTick()
  {
      minutes.increment();
      if(minutes.getValue() == 0) {  // it just rolled over!
          hours.increment();
      }
      updateDisplay();
  }
  
  /**
   * Set the time of the display to the specified hour and
   * minute and second.
   */
  public void setTime(int hour, int minute, int second)
  {
      if (hour == 12) { //changing the display from '00:00' to '12:00'
          hour = 0;
      }
      hours.setValue(hour);
      minutes.setValue(minute);
      seconds.setValue(second);
      updateDisplay();
  }
  
  /**
   * Return the current time of this display in the format HH:MM:SS.
   */
  public String getTime()
  {
      return displayString;
  }
  
  /**
   * Update the internal string that represents the display.
   */
  private void updateDisplay()
  {
      int hour = hours.getValue(); //changes the display to from showing '00:00' to '12:00'
      if (hour == 0) {
          hour = 12;
      }
      displayString = hour + ":" + 
                      minutes.getDisplayValue() + ":" + seconds.getDisplayValue();
  }
  </code></pre>
  
  <p>}</p>
  
  <p><strong>Ticket Machine</strong></p>
  
  <pre><code>public class TicketMachine
  {
  // The price of a ticket from this machine.
  private int price;
  // The amount of money entered by a customer so far.
  private int balance;
  // The total amount of money collected by this machine.
  private int total;
  // The time from the clockdisplay class
  private ClockDisplay time;
  
  /**
   * Create a machine that issues tickets of the given price.
   */
  public TicketMachine(int cost)
  {
      price = cost;
      balance = 0;
      total = 0;
  }
  
  /**
   * @Return The price of a ticket.
   */
  public int getPrice()
  {
      return price;
  }
  
  /**
   * Return The amount of money already inserted for the
   * next ticket.
   */
  public int getBalance()
  {
      return balance;
  }
  
  /**
   * Receive an amount of money from a customer.
   * Check that the amount is sensible.
   */
  public void insertMoney(int amount)
  {
      if(amount &gt; 0) {
          balance = balance + amount;
      }
      else {
          System.out.println("Use a positive amount rather than: " +
                             amount);
      }
  }
  
  /**
   * Print a ticket if enough money has been inserted, and
   * reduce the current balance by the ticket price. Print
   * an error message if more money is required.
   */
  public void printTicket()
  {
      if(balance &gt;= price) {
          // Simulate the printing of a ticket.
          System.out.println("##################");
          System.out.println("# The BlueJ Line");
          System.out.println("# Ticket");
          System.out.println("# " + price + " cents.");
          System.out.println("##################");
          System.out.println();
  
          // Update the total collected with the price.
          total = total + price;
          // Reduce the balance by the prince.
          balance = balance - price;
          // Print the current time from the NumberDisplay class.
          System.out.println("Time:" + ClockDisplay.displayString);
      }
      else {
          System.out.println("You must insert at least: " +
                             (price - balance) + " more cents.");
  
      }
  }
  
  /**
   * Return the money in the balance.
   * The balance is cleared.
   */
  public int refundBalance()
  {
      int amountToRefund;
      amountToRefund = balance;
      balance = 0;
      return amountToRefund;
  }
  </code></pre>
  
  <p>}</p>