equals and hashCode.
All non-static, non-transient fields are used. Subclasses are never equal to their superclasses.
If there is a superclass that overrides equals, then super.equals() and super.hashCode are also called.
Array-valued fields are compared using #Arrays#deepEquals.