
Статические методы интерфейсов принадлежат только интерфейсам, нельзя получить доступ к ним через ссылочные переменные или имя класса, которые их имплементируют.
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
}
}