Your logic
So the comparison actually call the default equals(Object o) method to determine whether n1 equals n2. However, as I remember, default equals(Object o) works exactly as ==. So n1 == n2 return false ==> n1.equals(n2) should return false.
applies to the comparison that is done with == operator.
So, if you do a n1 == n2 check then your understanding above applies and it should return false.
But since you are doing n1.equals(n2), it is a direct method call to the equals() in your Nearly class. The equals() here is an overloaded method.