Статические методы и их переопределение - PullRequest
5 голосов
/ 26 марта 2010

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");
    }
}

здесь не выполняется переопределение?

Ответы [ 5 ]

9 голосов
/ 26 марта 2010

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

К сожалению, Java позволяет вам вызывать статический метод через ссылку. Ваш вызов это проще записать как:

next.show();

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

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

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

4 голосов
/ 26 марта 2010

Это «скрытие», а не «переопределение». Чтобы увидеть это, измените метод 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

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

1 голос
/ 26 марта 2010

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

0 голосов
/ 30 ноября 2011

Переопределение происходит на уровне объекта. для бывшего obj1.overridedmenthod (). и нет концепции переопределения метода уровня класса, т. е. ... статического метода ex: Class.overridedmethod ().

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

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

0 голосов
/ 26 марта 2010

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

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

stat13.show(...);

OR

next.show(...);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...