суббота, 5 ноября 2011 г.

Переопределение(override) статического метода

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

Рассмотрим пример:

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

class B extends A{
  static void f(){ System.out.println("B");}
}

public class Test{
  public static void main(String []args){
    A aa = new A();
    A ab = new B();
    B bb = new B();
    aa.f();
    ab.f();
    bb.f();
  }
}

Итак, что имеем на выходе? А имеем мы следующее:
A
A
B
Нас интересует вторая строка, ведь мы, переопределяя метод, ожидали увидеть в ней "B".
А происходит это потому, что выбор вызываемого статического метода происходит при раннем связывании(на этапе компиляции, а не выполнения).
Так что будьте внимательней, ибо (ещё раз) компилятор вам ничего на этот счёт не скажет.
Удачи!

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.