Наследование - Какой метод вызывается? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть класс A, который расширяет класс B.

A определяется следующим образом, он также переопределяет метод B:

class A extends B
{
    public A() {
        super();
    }

    @Override
    public void doSomething(){
        //does something
    }
}

B определяется следующим образом:

public class B
{
    public B(){
        doSomething();
    }

    public void doSomething(){
        //does something
    }
}

Так что, если я инициализирую объект A, конструктор вызывает тот из суперкласса, который вызывает метод doSomething().Но какой из них будет казнен?Реализация B или переопределенная в A?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Если класс переопределяет метод, будет вызван переопределенный метод. Попробуйте пример ниже:

public class A {
 void doSomething() {
  System.out.println("a");
 }
}
public class B extends A {
 @Override
 void doSomething() {
  System.out.println("b");
 }
}
A a = new B();
a.doSomething(); // will print "b"
0 голосов
/ 17 мая 2018

Это распространенная ошибка, только вызовите final методы в конструкторе, будет вызван метод из A.

Кстати Sonar (если он у вас есть) вызовет здесь правило, гласящее, что вы не должны вызывать полиморфные методы внутри конструктора.

...