Ответ 1
run
of A
переопределяется, run
of B
реализуется. Поскольку B
является интерфейсом, он только указывает, как ваши объекты ведут себя к другим и не применяют никакого поведения.
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");
}
}
run
of A
переопределяется, run
of B
реализуется. Поскольку B
является интерфейсом, он только указывает, как ваши объекты ведут себя к другим и не применяют никакого поведения.
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.
Нет конфликта, потому что оба метода имеют одну и ту же подпись. Объявления метода в интерфейсах не переопределяются, потому что они ничего не реализуют. Поэтому в этом случае метод run в классе A переопределяется.
С другой стороны, при переопределении методов вам рекомендуется использовать аннотацию @Override
, например
@Override
public void run() {
....
}
Что будет называться
public void run(){
System.out.println("run method");
}
Почему?
Вы реализуете run
из interface B
, и вы также переопределяете его реализацию A
.
Если вы удалите последнюю реализацию run()
и удалите implements B
, будет вызван run()
of A
.
Интерфейс 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");
}
}
Посмотрите эту ссылку...
Вы узнаете больше, чем мы расскажем...
http://docs.oracle.com/javase/tutorial/java/IandI/override.html
Метод суперкласса всегда называется методом overridden
, тогда как метод подкласса называется overriding
.
Окончательный метод cannot be
переопределенный. [если метод суперкласса окончательный]
Конечные методы can
переопределить. [Читайте это как грамматический путь. Этот метод находится в подклассе и является окончательным, но метод суперкласса не является окончательным]