Clearly, Employee has a conflict; the signature of the default int getId() method of both Person and Identified identical.
JLS 9.4.1.3 describes this as a behavioral conflict that leads to an error. Naturally, you have to decide which getId() method should be called (either override it, or choose the default implementation from Person or Identified .
JLS 9.4.1.1 (Overriding by instance methods) gives the key:
Access to the default overridden method can be obtained using the call expression method (Β§15.12), which contains the super keyword with the name of the superinterface.
But the most formalized reason for using the word super comes from JLS 15.12 and, in particular, 15.12.1: Compilation time Step 1. Defining a class or interface to search
The section describes 6 forms that a method call can take.
One form of Identified.getId() reserved for a static link and is discussed in another answer.
Another form of super.getId() . This is a more common use of the word super ; which refers to the superclass of the class.
This leads to the final form mentioned in 12.15.1: TypeName.super.getId()
Here the word super has only one purpose. If the word super appears to the left of the getId () method, and if TypeName appears to the left of the super, then (i) TypeName must be either a class or an interface, (ii) If TypeName is a class, it takes precedence over the interface, (iii) If TypeName is not a class; it must be an interface.
So, this ultimately leads to an explanation of super in this context:
Super in this case is used to match the TypeName.super.identifier form , which is a certain way (according to JLS 15.12.1), to call the method identifier from the TypeName interface.