It is stated in Object's .equals(Object) javadoc:
It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
Almost everywhere in example code I see overridden .equals(Object) method which uses instanceof as one of the first tests, for example here: What issues / pitfalls must be considered when overriding equals and hashCode?
public class Person {
    private String name;
    private int age;
    public boolean equals(Object obj) {
        if (obj == null)
            return false;
        if (obj == this)
            return true;
        if (!(obj instanceof Person))
            return false;
        ...
    }
}
Now with class SpecialPerson extends Person having in equals:
        if (!(obj instanceof SpecialPerson))
            return false;
we con not guarantee that .equals() is symmetric.
It has been discussed for example here: any-reason-to-prefer-getclass-over-instanceof-when-generating-equals
Person a = new Person(), b = new SpecialPerson();
a.equals(b);    //sometimes true, since b instanceof Person
b.equals(a);    //always false
Maybe I should add in the beginning of SpecialPerson's equals direct call to super?
    public boolean equals(Object obj) {
        if( !obj instanceof SpecialPerson )
            return super.equals(obj);
        ... 
        /* more equality tests here */
    }
 
     
     
     
     
     
    