Java наследование и подклассы - PullRequest
2 голосов
/ 09 октября 2011

Ява нуб тут с быстрым вопросом.

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

public class Foo{
    public static void Method1(){
        Method 2();
    }
    public static void Method2(){
    }
}

А вот и подкласс.

public class Foo2{
    public static void Method2(){
    }
}

Как я могу написать это так, чтобы при вызове Foo2.Method1() вместо Foo1.Method2()?

использовалось Foo2.Method2()?

Ответы [ 3 ]

3 голосов
/ 09 октября 2011

Статические методы не являются полиморфными, поэтому динамическая отправка отсутствует.Следовательно, решение

  • делает Method2 нестатичным для активации динамической отправки или
  • на отменяет скрывает Method1 в Foo2 или
  • если это вызовет много дублирования кода, создать вспомогательный метод для переопределения , скрывающего только части кода.

Подробно о статическихметоды: это методы на уровне класса, поэтому

  • вы не можете их переопределить - если вы также определите их в Foo2, вы скрываете реализацию в Foo.
  • вы не должны вызывать их в экземпляре, как вы делаете в Method1.Если вы вызываете их обычным способом, Foo.Method2, становится очевидным, в чем заключается проблема и возможные решения.
3 голосов
/ 09 октября 2011

Единственный способ - создать Method1 в Foo2, который будет вызывать Foo2.Method2. Foo.Method2 Будучи статическим, всегда будет вызываться Foo.Method1, независимо от дальнейшего подкласса. Там просто нет переопределения, когда речь идет о статических методах.

0 голосов
/ 09 октября 2011

Наследование и перегрузка / перезапись методов работают только в нестатической части класса. Поэтому нет способа делать то, что вы хотите. Это также причина, по которой static следует использовать как можно меньше - его нельзя расширять.

...