void* class MyCl extends Object class MyCl extends XYZ /* extends ... extends ... extends Object */ { int i; String s; @Override /* annotation */ // public String toString(String s) public String toString() { return String.format("MyCl {%d, %s}", i, s); // return String.format("MyCl {%d, %s}%n", i, s); } } new MyCl(5, "abc").toString(); -> MyCl {5, "abc"} equivalence relation - reflexive a.equals(a) - symmetrical a.equals(b) ====> b.equals(a) - transitive a.equals(b) && b.equals(c) ====> a.equals(c) MUST: a.equals(b) ==(necessary)==> a.hashCode() == b.hashCode() GOOD: !a.equals(b) ==(good idea)==> a.hashCode() != b.hashCode() (not necessary) // possible but BAD public int hashCode() { return 0; }