Как класс Java может расширить другой класс и реализовать интерфейс в одно и то же время с тем же именем метода - PullRequest
1 голос
/ 25 июня 2019

У меня есть интерфейс (A), содержащий метод myMethod () и класс (B) также содержат тот же метод myMethod (), а другой класс (c) расширяет и реализует A и B.

Нетя создал объект класса A a = new C() и вызвал a.myMethod();.

как он выполняет myMethod класса B.

interface A {
    void myMethod();
}

class B {
    public void myMethod() {
        System.out.println("My Method");
    }
}

class C extends B implements A {

}

class MainClass {
    public static void main(String[] args) {
        A a = new C();
        a.myMethod();
    }
}

Вывод программы -

 My Method

Ответы [ 3 ]

1 голос
/ 25 июня 2019

Методы имеют одинаковую подпись. Это означает, что методы выглядят одинаково после того, как все типы были приведены к их наиболее компактной форме, и вся (казалось бы) избыточная информация была удалена во время компиляции. Это то, что в конечном итоге «предварительно скомпилировано» в файлы .class.

Что запоминает компилятор о методе интерфейса: name: myMethod, returns: void, parameters: {}

Что запоминает компилятор о методе интерфейса: name: myMethod, returns: void, parameters: {}

(Для обоих методов компилятор также помнит, что они являются экземплярами-методами, в отличие от статических методов, и, следовательно, на самом деле есть параметр [объект 'this']. Но это интересно только позже разработчик life :))

Итак, по сути, это один и тот же метод для компилятора. Другими словами, класс, который вы расширяете, покрывает этот метод для вас, и вам не нужно реализовывать его явно. Однако вы можете (если хотите) переопределить поведение вашего расширенного класса B и сделать что-нибудь еще, если потребуется.

0 голосов
/ 26 июня 2019

Выполненный метод зависит от типа объекта , а не от переменной (полиморфизм). В вашем случае объект имеет тип C, который наследует реализацию myMethod от типа B.

0 голосов
/ 25 июня 2019

Сначала он будет искать реализацию myMethod () в классе C. Так как его там нет, он проверит ваш расширенный класс B. Затем он выполнит этот класс B myMethod ().Но если вы реализовали myMethod () в классе C, ваша программа выполнит класс C myMethod ().

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