 
                            ...
| Code Block | ||
|---|---|---|
| 
 | ||
| 
public class Card {
  private final int number;
  public Card(int number) {
    this.number = number;
  }
  public boolean equals(Object o) {
  if (!(o instanceof Card))
    return false;
    Card c = (Card)o;
    return c.number == number;
  }
}
class XCard extends Card {
  private String type;
  private Card card;
  
  public XCard(int number, String type) {
    super(number);
    this.type = type;
  }
	  
  public Card viewCard() {
    return card;
  }
  public boolean equals(Object o) {
    if (!(o instanceof XCard))
      return false;
      
      XCard cp = (XCard)o;
         return cp.card.equals(card) && cp.type.equals(type);
  }
	  
  public static void main(String[] args) {
    XCard p1 = new XCard(1, "type1");
    Card p2 = new Card(1);
    XCard p3 = new XCard(1, "type2");
    System.out.println(p1.equals(p2)); //returns false
    System.out.println(p2.equals(p3)); //returns false
    System.out.println(p1.equals(p3)); //returns false
  }
}
 | 
Exceptions
EX1: There is no need to override equals if checking logical equality is not useful. Enum types are an example.
 EX2: If a subclass inherits an implementation of equals from a superclass and does not need additional functionality, one can forgo overriding equals().
Risk Assessment
Violating the general contract when overriding the equals() method can lead to unexpected results.
...