2015-01-23 4 views
3

У меня есть простой вопрос, на который я просто не могу найти хороший ответ. Почему в следующей программе Java отображается 20? Я бы предпочел подробный ответ, если возможно, пожалуйста.Статические методы и полиморфизм

class Something{ 
    public int x; 
    public Something(){ 
     x=aMethod(); 
    } 
    public static int aMethod(){ 
     return 20; 
    } 
} 
class SomethingElse extends Something{ 
    public static int aMethod(){ 
     return 40; 
    } 
    public static void main(String[] args){ 
     SomethingElse m; 
     m=new SomethingElse(); 
     System.out.println(m.x); 
    } 
} 
+3

Полиморфизм работает только для методов, которые не являются 'final' или' private' или 'static'. – Pshemo

+0

Кроме того, если вы хотите, чтобы 'aMethod()' в 'SomethingElse' переопределял' aMethod() 'в' Something', тогда вы должны указать атрибут '@ Override', хотя вам также придется удалить' static ' –

ответ

1

Наследование для статических методов работает иначе, чем нестатические. В частности, статический метод суперкласса НЕ переопределяется подклассом. Результат вызова статического метода зависит от класса объекта, на который он вызывается. Переменная x создается во время создания объекта Something, и поэтому этот статический метод класса (Something) вызывается для определения его значения.

Рассмотрим следующий код:

public static void main(String[] args){ 
    SomethingElse se = new SomethingElse(); 
    Something  sg = se; 
    System.out.println(se.aMethod()); 
    System.out.println(sg.aMethod()); 
} 

Это будет правильно напечатать 40, 20, как каждый класс объект вызывает свой собственный статический метод. Java documentation описывает это поведение в части скрытых статических методов.

8

Поскольку полиморфизм применяется только к методам экземпляра.

Метод staticaMethod вызывается здесь

public Something(){ 
    x=aMethod(); 
} 

относится к aMethod объявленной в Something.

0

Потому что int x объявлен в классе Something. Когда вы делаете объект SomethingElse, вы сначала делаете объект Something (который должен установить x, и он использует aMethod() от Something вместо SomethingElse (потому что вы создаете Something)). Это связано с тем, что aMethod() является статическим, а полиморфизм не работает для статических методов. Затем, когда вы печатаете x из m, вы печатаете 20, так как вы никогда не меняли значение x.

Смежные вопросы