Explicitly calling a default method in Java Explicitly calling a default method in Java java java

Explicitly calling a default method in Java


As per this article you access default method in interface A using

A.super.foo();

This could be used as follows (assuming interfaces A and C both have default methods foo())

public class ChildClass implements A, C {    @Override        public void foo() {       //you could completely override the default implementations       doSomethingElse();       //or manage conflicts between the same method foo() in both A and C       A.super.foo();    }    public void bah() {       A.super.foo(); //original foo() from A accessed       C.super.foo(); //original foo() from C accessed    }}

A and C can both have .foo() methods and the specific default implementation can be chosen or you can use one (or both) as part of your new foo() method. You can also use the same syntax to access the default versions in other methods in your implementing class.

Formal description of the method invocation syntax can be found in the chapter 15 of the JLS.


The code below should work.

public class B implements A {    @Override    public void foo() {        System.out.println("B.foo");    }    void aFoo() {        A.super.foo();    }    public static void main(String[] args) {        B b = new B();        b.foo();        b.aFoo();    }}interface A {    default void foo() {        System.out.println("A.foo");    }}

Output:

B.fooA.foo


This answer is written mainly for users who are coming from question 45047550 which is closed.

Java 8 interfaces introduce some aspects of multiple inheritance. Default methods have an implemented function body. To call a method from the super class you can use the keyword super, but if you want to make this with a super interface it's required to name it explicitly.

class ParentClass {    public void hello() {        System.out.println("Hello ParentClass!");    }}interface InterfaceFoo {    public default void hello() {        System.out.println("Hello InterfaceFoo!");    }}interface InterfaceBar {    public default void hello() {        System.out.println("Hello InterfaceBar!");    }}public class Example extends ParentClass implements InterfaceFoo, InterfaceBar {    public void hello() {        super.hello(); // (note: ParentClass.super could not be used)        InterfaceFoo.super.hello();        InterfaceBar.super.hello();    }        public static void main(String[] args) {        new Example().hello();    }}

Output:

Hello ParentClass!
Hello InterfaceFoo!
Hello InterfaceBar!