This is specified in the JLS.
The definition of functional interface excludes methods in an interface that are also public methods in Object. This is to allow functional treatment of an interface like java.util.Comparator that declares multiple abstract methods of which only one is really "new" - int compare(T,T). The other method - boolean equals(Object) - is an explicit declaration of an abstract method that would otherwise be implicitly declared, and will be automatically implemented by every class that implements the interface.
Note that if non-public methods of Object, such as clone(), are declared in an interface, they are not automatically implemented by every class that implements the interface. The implementation inherited from Object is protected while the interface method is necessarily public. The only way to implement such an interface would be for a class to override the non-public Object method with a public method.
Interfaces don't have clone() and finalize() methods implicitly, so in the case of the interface, that is a new method, so it can't be considered to override anything.
In such a case the implementing classes would have to overridde specifically clone()
and finalize()
, otherwise it is a syntax error because they have protected visibility and they are claiming to implement a method inherited from the interface with public visibility.