public class CallWhat { public static void main (String[] args) { System.out.println ("Test 1:"); System.out .println ("[Child a = new Child (1, 1); Child b = new Child (1, 2)]"); Child a = new Child (1, 1); Child b = new Child (1, 2); System.out.println ("a.sequals (b) : " + a.traceableEquals (b)); System.out.println ("b.traceableEquals (a) : " + b.traceableEquals (a)); System.out.println (""); System.out.println ("Test 2: "); System.out.println ("[Root x = a; Root y = b]"); Root x = a; Root y = b; System.out.println ("a.traceableEquals (y): " + a.traceableEquals (y)); System.out.println ("a.traceableEquals (x): " + a.traceableEquals (x)); System.out.println ("b.traceableEquals (y): " + b.traceableEquals (y)); System.out.println ("b.traceableEquals (x): " + b.traceableEquals (x)); System.out.println ("Test 2, reversed:"); System.out.println ("y.traceableEquals (b): " + y.traceableEquals (b)); System.out.println ("y.traceableEquals (a): " + y.traceableEquals (a)); System.out.println ("x.traceableEquals (b): " + x.traceableEquals (b)); System.out.println ("x.traceableEquals (a): " + x.traceableEquals (a)); System.out.println ("Test 3:"); System.out.println ("x.traceableEquals (y): " + x.traceableEquals (y)); System.out.println ("y.traceableEquals (x): " + y.traceableEquals (x)); } } class Root { private int i; public Root (int i) { this.i = i; } public boolean traceableEquals (Root r) { System.out.println ("In Root#traceableEquals (Root r):"); System.out.println (" My real class is: " + getClass ()); System.out.println (" r's real class is: " + r.getClass ()); return this.i == r.i; } } class Child extends Root { private int j; public Child (int i, int j) { super (i); this.j = j; } public boolean tracableEquals (Child c) { System.out.println ("In Child#traceableEquals (Child c):"); System.out.println (" My real class is: " + getClass ()); System.out.println (" c's real class is: " + c.getClass ()); boolean parentEquality = super.traceableEquals (c); System.out.println (" Superclass equality test returned: " + parentEquality); return parentEquality && this.j == c.j; } }