Подтвердить что ты не робот

Какой метод переопределен?

Class A имеет метод run(), а интерфейс B также имеет метод run(). Вопрос прост, метод run() переопределен в классе Main и как мы это докажем? Почему в этом коде нет конфликта (ошибка времени компиляции)?

class A{
    void run(){System.out.println("A class");}
}

interface B{
    void run();
}

class Main extends A implements B{
    public static void main(String args[]){         
        Main m = new Main();
        m.run();
    }

    // Overridding method
    public void run(){
        System.out.println("run method");
    }
}
4b9b3361

Ответ 1

run of A переопределяется, run of B реализуется. Поскольку B является интерфейсом, он только указывает, как ваши объекты ведут себя к другим и не применяют никакого поведения.

Ответ 2

run() Метод интерфейса B будет реализован в классе Main by переопределенный метод класса A.

Добавление дополнительной точки,

Это вы не будете писать метод run() в дочернем классе Main, вы не получите известную ошибку "Невыполненные методы". Это справедливо для методов public класса A для непубличных методов, вы получите ошибку компилятора: унаследованный метод не может скрыть публичный абстрактный метод.

Это потому, что методы интерфейса общедоступны по умолчанию, и вы не можете скрыть его с помощью модификатора доступа default (package private).

Пример:

class A{
    public void run() {
        System.out.println("This method will be inherited.");
    }
}

interface B{
    void run();
}

class Main extends A implements B{
    public static void main(String args[]){         
        Main m = new Main();
        m.run();
    }
}

OUTPUT : This method will be inherited.

В приведенном выше экземпляре кода метод run() наследуется от класса A, который реализует метод run() интерфейса B.

Ответ 3

Нет конфликта, потому что оба метода имеют одну и ту же подпись. Объявления метода в интерфейсах не переопределяются, потому что они ничего не реализуют. Поэтому в этом случае метод run в классе A переопределяется.

С другой стороны, при переопределении методов вам рекомендуется использовать аннотацию @Override, например

@Override
public void run() {
   ....
}

Ответ 4

Что будет называться

public void run(){
    System.out.println("run method");
}

Почему?

Вы реализуете run из interface B, и вы также переопределяете его реализацию A.

Если вы удалите последнюю реализацию run() и удалите implements B, будет вызван run() of A.

Ответ 5

Интерфейс B говорит, что любой класс, реализующий его, должен иметь метод запуска. Main расширяет A и наследует метод A run().

Main отвечает требованиям интерфейса B для использования метода run. Метод run в Main затем переопределяет метод run(), полученный из класса A.

// This is a class with a run method.
class A{
    void run(){System.out.println("A class");}
}

// Anything implementing this interface must have a run method.
interface B{
    void run();
}

// This class is an extension of A (and therefore has A run() method)
// This class implements B and must have a run method, which it does, because it has A's
class Main extends A implements B{
    public static void main(String args[]){         
        Main m = new Main();
        m.run();
    }

    // This method then overrides the run Method it inherited from A
    // And this method meets the requirement set by implementing B.
    public void run(){
        System.out.println("run method");
    }
}

Ответ 7

Метод суперкласса всегда называется методом overridden, тогда как метод подкласса называется overriding.

Окончательный метод cannot be переопределенный. [если метод суперкласса окончательный]
Конечные методы can переопределить. [Читайте это как грамматический путь. Этот метод находится в подклассе и является окончательным, но метод суперкласса не является окончательным]