Наследование Java - C -> B -> A. Метод, определенный в A и переопределяемый в C. Какой из них должен быть вызван? - PullRequest
0 голосов
/ 18 января 2019

У меня есть базовый интерфейс A .Затем есть еще один интерфейс B, который выходит из этого интерфейса A .И, наконец, класс C, который реализует B .

interface A{
    default void method1(){
        System.out.println("method1 printing from interface A");
    }
    default void method2(){
         method1(); // note that method1() is overriden in class C.
                    // which one should be called? from A or C?
    }
}

interface B extends A{
    void methodWhichCallsMethodOnInterface();
}

class C implements B{
    @Override 
    public void method1(){
        System.out.println("method1 printing from class C");
    }

    @Override
    public void methodWhichCallsMethodOnInterface(){
        method2();
    }
}

. Я вызываю methodWhichCallsMethodOnInterface следующим образом:

B b = new C();
b.methodWhichCallsMethodOnInterface();

Вывод: "method1 печатает из класса C"Msgstr "

Я не понимаю, как method1 из C вызывается напрямую из интерфейса A?Может кто-нибудь объяснить контексты, в которых вызывается каждый метод?

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Вызов b.methodWhichCallsMethodOnInterface(), вызовы method2() с интерфейса А и method2() с интерфейса А, вызовы method2() с интерфейса А, я полагаю, вы думали, что b.methodWhichCallsMethodOnInterface() по какой-то причине сделает method2() с интерфейса А method1() из класса С.

Если вы позвоните b.method1(), вы должны получить печать из класса C Но вызов другой функции вызовет интерфейс А method1()

Полагаю, вы инициализированы B b = new C() верно?

0 голосов
/ 18 января 2019

Во-первых, 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.

0 голосов
/ 18 января 2019

Это правильно вызывает method1 () из A, потому что это метод интерфейса. Это правильное и ожидаемое поведение методов, определенных в интерфейсе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...