Интерфейсы. Java 8. Статические методы

Интерфейсы. Java 8. Статические методы

Статические методы интерфейсов принадлежат только интерфейсам, нельзя получить доступ к ним через ссылочные переменные или имя класса, которые их имплементируют.


interface HelloInterface {

    static void printHello() {
        System.out.println("Hello!");
    }
}

class A implements HelloInterface {
    public static void main(String[] args) {
        HelloInterface ha = new A();
        ha.printHello(); // ошибка компиляции, 
                //метод printHello() не принадлежит объекту hа

        A a = new A();
        a.printHello(); // ошибка компиляции
        A.printHello(); // ошибка компиляции

        HelloInterface.printHello(); // доступен только из интерфейса
    }
}
Статические методы в интерфейсе и классе, который его имплементирует, никак не связаны друг с другом. В классе можно создать статический метод с таким же именем, но другой сигнатурой без каких-либо проблем. Такой статический метод не будет ни скрывать метод интерфейса, ни переопределять его. Это будет самостоятельный метод, принадлежащий классу.


class B implements HeyInterface {

    public static String sayHey() {
        return "Hey from class B!";
    }
}


System.out.println(B.sayHey()); // Hey from class B!
Если дефолтный метод интерфейса вызывает свой статический метод, то вызов этого статического метода никак не переопределяется в классе, который реализует этот интерфейс. Даже если класс будет содержать обычный или статический метод с такой же сигнатурой, интерфес всё равно вызовет свой статический метод.


interface Bb {
    default void a() {
        b();
    }
    static void b() {
        System.out.println("from the interface");
    }
}


class StaticMethodImpl implements Bb {
    static void b() {
        System.out.println("from the class");
    }

    public static void main(String[] args) {
        StaticMethodImpl s = new StaticMethodImpl();
        s.a(); // from the interface
    }
}
Интерфейсы и Абстрактные классы