01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package subclass.equals;
class C1 {
  int i;
  public C1(int i) { this.i = i; }
  public boolean equals(Object thatObject) {
    if (!(thatObject instanceof C1))
      return false;
    C1 that = (C1) thatObject;
    return that.i == this.i;
  }
}
class D1 extends C1 {
  int j;
  public D1(int i, int j) { super(i); this.j = j; }
  public boolean equals(Object thatObject) {
    if (!(thatObject instanceof D1))
      return false;
    D1 that = (D1) thatObject;
    return that.i == this.i && that.j == this.j;
  }
}
class C2 {
  int i;
  public C2(int i) { this.i = i; }
  public boolean equals(Object thatObject) {
    if ((thatObject == null) || (thatObject.getClass() != this.getClass()))
      return false;
    C2 that = (C2) thatObject;
    return that.i == this.i;
  }
}
class D2 extends C2{
  int j;
  public D2(int i, int j) { super(i); this.j = j; }
  public boolean equals(Object thatObject) {
    if ((thatObject == null) || (thatObject.getClass() != this.getClass()))
      return false;
    D2 that = (D2) thatObject;
    return that.i == this.i && that.j == this.j;
  }
}
public class Main {
  public static void main(String[] args) {
    C1 x1 = new C1(27);
    C1 y1 = new D1(27,42);
    System.out.println("x1==y1? " + (x1.equals(y1) ? "true" : "false"));
    System.out.println("y1==x1? " + (y1.equals(x1) ? "true" : "false"));

    C2 x2 = new C2(27);
    C2 y2 = new D2(27,42);
    System.out.println("x2==y2? " + (x2.equals(y2) ? "true" : "false"));
    System.out.println("y2==x2? " + (y2.equals(x2) ? "true" : "false"));
  }
}