Java: Do interfaces inherit from Object?

Interfaces do not inherit from Object. And there is no common “root” interface implicitly inherited by all interfaces either as in the case with classes.(*)

What may seem surprising is that it’s still possible to call Object methods (such as toString, hashCode etc) even on interface types.

Serializable s = "";
s.toStringCompiles even though Serializable neither
declares toString nor inherits from Object.
();

Formally, this is because each interface implicitly declares one method for each public method in Object. This is explained in detail in the Java Language Specification:

9.2 Interface Members

[…]

  • If an interface has no direct superinterfaces, then the interface implicitly declares a public abstract member method m with signature s, return type r, and throws clause t corresponding to each public instance method m with signature s, return type r, and throws clause t declared in Object, unless a method with the same signature, same return type, and a compatible throws clause is explicitly declared by the interface.

[…]JLS 9.2

(*) Note that the notion of being a subtype of is not equivalent to inherits from: Interfaces with no super interface are indeed subtypes of Object (§ 4.10.2. Subtyping among Class and Interface Types) even though they do not inherit from Object.

Comments