title: Overriding equals() & hashCode() in sub classes ... considering super fields
body: <p>Is there a specific rule on how Overriding <code>equals()</code> &amp; <code>hashCode()</code> in <strong>sub classes</strong> considering <strong>super fields</strong> ?? knowing that there is many parameters : super fields are private/public , with/without getter ...</p>
  
  <p>For instance, Netbeans generated equals() &amp; hashCode() will not consider the super fields ... and</p>
  
  <pre><code>    new HomoSapiens("M", "80", "1.80", "Cammeron", "VeryHot").equals(
      new HomoSapiens("F", "50", "1.50", "Cammeron", "VeryHot"))
  </code></pre>
  
  <p>will return true :(</p>
  
  <pre><code>public class Hominidae {
  
      public String  gender;
      public String  weight;
      public String  height;
  
      public Hominidae(String gender, String weight, String height) {
          this.gender = gender;
          this.weight = weight;
          this.height = height;
      }
      ... 
  }
  
  public class HomoSapiens extends Hominidae {
      public String name;
      public String faceBookNickname;
  
      public HomoSapiens(String gender, String weight, String height, 
                         String name, String facebookId) {
          super(gender, weight, height);
          this.name = name;
          this.faceBookNickname = facebookId;
      }
      ...  
  }
  </code></pre>
  
  <p>If you want to see the Netbeans generated equals() &amp; hashCode() :</p>
  
  <pre><code>public class Hominidae {
  
      ...
  
      @Override
      public boolean equals(Object obj) {
          if (obj == null) {
              return false;
          }
          if (getClass() != obj.getClass()) {
              return false;
          }
          final Hominidae other = (Hominidae) obj;
          if ((this.gender == null) ? (other.gender != null) : !this.gender.equals(other.gender)) {
              return false;
          }
          if ((this.weight == null) ? (other.weight != null) : !this.weight.equals(other.weight)) {
              return false;
          }
          if ((this.height == null) ? (other.height != null) : !this.height.equals(other.height)) {
              return false;
          }
          return true;
      }
  
      @Override
      public int hashCode() {
          int hash = 5;
          hash = 37 * hash + (this.gender != null ? this.gender.hashCode() : 0);
          hash = 37 * hash + (this.weight != null ? this.weight.hashCode() : 0);
          hash = 37 * hash + (this.height != null ? this.height.hashCode() : 0);
          return hash;
      }
  
  }
  
  
  public class HomoSapiens extends Hominidae {
  
      ...
  
      @Override
      public boolean equals(Object obj) {
          if (obj == null) {
              return false;
          }
          if (getClass() != obj.getClass()) {
              return false;
          }
          final HomoSapiens other = (HomoSapiens) obj;
          if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
              return false;
          }
          if ((this.faceBookNickname == null) ? (other.faceBookNickname != null) : !this.faceBookNickname.equals(other.faceBookNickname)) {
              return false;
          }
          return true;
      }
  
      @Override
      public int hashCode() {
          int hash = 7;
          hash = 89 * hash + (this.name != null ? this.name.hashCode() : 0);
          hash = 89 * hash + (this.faceBookNickname != null ? this.faceBookNickname.hashCode() : 0);
          return hash;
      }
  }
  </code></pre>