2010-03-26 6 views
5

Java не позволяет переопределение статических методов но,Статические методы и их переопределение

class stat13 
{ 
    static void show() 
    { 
     System.out.println("Static in base"); 
    } 
    public static void main(String[] ar) 
    { 
     new next().show(); 
    } 
} 


class next extends stat13 
{ 
    static void show() 
    { 
     System.out.println("Static in derived"); 
    } 
} 

не переопределении сделано здесь?

+0

рассмотрите вопрос о редактировании ... код не так читается. – RubyDubee

+0

спасибо pgras за редактирование вопроса, могли бы вы просто рассказать мне о том, как вы форматировали? – abson

ответ

4

Это «сокрытие», а не «переопределение». Чтобы увидеть это, изменить метод main к следующему:

public static void main (String[] arghh) { 
    next n = new next(); 
    n.show(); 
    stat13 s = n; 
    s.show(); 
} 

Это должно напечатать:

Static in derived 
Static in base 

Если есть реальная наиважнейшая происходит, то вы увидите:

Static in derived 
Static in derived 

Обычно считается, что это плохой стиль для вызова статического метода с использованием типа экземпляра ... как вы это делаете ... потому что легко думать, что вы вызываете метод экземпляра, и путайте i Не думая, что происходит переопределение. Инструмент проверки ключа/проверки кода в стиле Java обычно укажет на это как ошибку стиля/потенциальную ошибку.

9

Нет, вы ничего не игнорируете - вы всего лишь скрываете оригинальный метод.

Прискорбно, что Java позволяет вам вызвать статический метод посредством ссылки. Ваш звонок это более просто, как написано:

next.show(); 

Важно отметить, что этот код будет по-прежнему вызывать оригинальную версию в stat13:

public static void showStat(stat13 x) 
{ 
    x.show(); 
} 
... 
showStat(new next()); 

Другими словами, связывание с правого метода делается на compile- времени и не имеет ничего общего со значением x - которое обычно было бы с переопределением.

1

Java не дает ошибки компилятора для этого. но этот метод не будет вести себя так, как вы ожидаете ... лучше объяснить. here

0

Переопределение происходит, когда дочерний класс предоставляет собственную реализацию для метода, для которого будет вызван экземпляр дочернего класса. Оперативное слово здесь - экземпляр.

Статические методы вызывают в контексте класса, например.

stat13.show(...); 

ИЛИ

next.show(...); 

FWIW, ваш пример кода не является примером переопределения.

0

Переопределение происходит на уровне объекта. для ex obj1.overridedmenthod(). и нет понятия переопределения метода уровня класса, то есть ... static method ex: Class.overridedmethod().

и эта концепция переопределения статического метода называется методом скрытия.

попробуйте простой пример.

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