// Practice2.java
// contains classes P, Q, R, and Practice2
//
// Preparation for output problems on a quiz
// or exam, involving inheritance.
//
// Before you run this program, write down on paper
// what you think the complete output will be.
// Then run the program to see if you were right.


class P  {

   private static int objectCount = 0;

   private int objectNumber;

   public P()
   {
      objectCount++;
      objectNumber = objectCount;
      System.out.println("*** constructor P(): object#="
                         + objectNumber + ", class="
                         + getClass().getName());
   }  // constructor P()

   public String toString()
   {
       return (getClass().getName() + ":object#" + objectNumber);
   }  // method toString()

}  // class P


class Q extends P {

   private int n;

   public Q()
   {
      n = 0;
      System.out.println("--- constructor Q(): n=" + n);
   }  // constructor Q()

   public Q(int i)
   {
      n = i;
      System.out.println("--- constructor Q(int): i="
                         + i + " n=" + n);      
   }  // constructor Q(int)

   public void q()
   {
       n++;
       System.out.println("--- Q: q(): n=" + n);
   }  // method q()

   public String toString()
   {
       return (super.toString() + ",n=" + n);
   }  // method toString()

}  // class Q


class R extends Q  {

   private int m;

   public R()
   {
      m = 0;
      System.out.println("--- constructor R(): m=" + m);      
   }  // constructor R()

   public R(int i)
   {
      super(i);
      m = i * 10;
      System.out.println("--- constructor R(int): i="
                         + i + " m=" + m);      
   }  // constructor R(int)

   public void r()
   {
      m += 10;
      System.out.println("--- R: r(): m=" + m);
   }  // method r()

   public String toString()
   {
       return (super.toString() + ",m=" + m);
   }  // method toString()
}  // class R


public class Practice2  {
   public static void main(String[] args)
   {
      P[] array = { new P(), new Q(100), new Q(),
                    new R(100), new R() };

      for ( int i=0; i<5; i++ )
      {
          System.out.println("Begin testing array[" + i + "]:  "
                             + array[i].toString());
          if ( array[i] instanceof Q )
             ((Q) array[i]).q();
          if ( array[i] instanceof R )
             ((R) array[i]).r();
          System.out.println("End testing array[" + i + "]:  "
                             + array[i]);  // automatic call to
                                           // array[i].toString()
      }  // for i
   }  // method main
}  // class Practice2