Во-первых, interface B
продлите interface A
, чтобы вы могли представить, что:
interface B {
default void method1() { // inherited from A
System.out.println("method1 printing from interface A");
}
default void method2() { // inherited from A
method1();
}
void methodWhichCallsMethodOnInterface(); // wrote new in B
}
Вы можете забыть interface A
с этого момента! Продолжайте с вашим кодом.
class C implements B{
@Override
public void method1() {
System.out.println("method1 printing from class C");
}
@Override
public void methodWhichCallsMethodOnInterface() {
method2();
}
}
Class B
был реализован class C
. Когда вы выполните код B b = new C
, объект C будет создан и приведен к interface B
(это означает, что object b
имеет полные свойства class C
). Посмотрите на interface B
и class C
, вы можете увидеть два одинаковых метода method1()
. Поскольку class C
внедряют interface B
и method1()
перезаписываются, b.method1()
будет выполнять метод внутри class C
. Вы можете себе представить, что:
class C implements B{
@Override
public void method1() {
System.out.println("method1 printing from class C");
}
@Override
public void methodWhichCallsMethodOnInterface() {
method2();
}
default void method2() { // inherited from B
method1();
}
}
Теперь, я думаю, вы понимаете, почему ваша программа печатает method1 printing from class C
.