в классе наследнике определен статический метод такой же как родительском java

В классе наследнике определен статический метод такой же как родительском java

в классе наследнике определен статический метод такой же как родительском java. Смотреть фото в классе наследнике определен статический метод такой же как родительском java. Смотреть картинку в классе наследнике определен статический метод такой же как родительском java. Картинка про в классе наследнике определен статический метод такой же как родительском java. Фото в классе наследнике определен статический метод такой же как родительском java

Определение

Статическими методами в Java называют такие методы, которые могут быть вызваны без создания экземпляра класса. Например, метод pow () из класса Math является статическим:

Когда следует использовать

Особенности применения

Важным моментом является то, что статические методы переопределять (Override) нельзя. Если объявить такой же метод в классе-наследнике (subclass), т.е. метод с таким же именем и сигнатурой, то лишь «спрячется» метод суперкласса (superclass) вместо переопределения. Это явление известно как сокрытие методов (hiding methods). Это означает, что при обращении к статическому методу, который объявлен как в родительском, так и в дочернем классе, во время компиляции всегда будет вызван метод исходя из типа переменной. В отличие от переопределения, такие методы не будут выполнены во время работы программы. Рассмотрим пример:

Вывод в консоль:
Внутри родительского класса/статического метода

Код наглядно демонстрирует: несмотря на то, что объект имеет тип Car, вызван статический метод из класса Vehicle, т.к. произошло обращение к методу во время компиляции. И при этом ошибки во время компиляции не возникло!

Статические методы в JVM

Статические методы и переменные хранились в области Permgen до 8-й версии java. Начиная с 8-й версии, они хранятся в новой область памяти, которая называется Metaspace

Примеры применения статических методов

Достоинства и недостатки

Достоинства

Недостатки

Источник

Переопределение методов

1. Что такое переопределение методов?

Если в иерархии классов совпадают имена и сигнатуры типов методов из подкласса и супер класса, то говорят, что метод из подкласса переопределяет метод из супер-класса.

Переопределение методов выполняется только в том случае, если имена и сигнатуры типов обоих методов одинаковы. В противном случае оба методы считаются перегружаемыми.

Когда переопределенный метод вызывается из своего подкласса, он всегда ссылается на свой вариант, определенный в подклассе. А вариант метода, определенный в супер классе, будет скрыт. Из метода someMethod() будет вызван метод того же класса N :

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

Результат выполнения кода:

2. Методы подставки

После выхода Java 5 появилась возможность при переопределении методов указывать другой тип возвращаемого значения, в качестве которого можно использовать только типы, находящиеся ниже в иерархии наследования, чем исходный тип. Такие типы еще называются ковариантными.

3. Переопределение и статические методы

Статические методы не могут быть переопределены. Класс наследник может объявлять метод с такой же сигнатурой, что и супер класс, но это не будет переопределением. При вызове переопределенного метода JVM выбирает нужный вариант основываясь на типе объекта. Вызов же статического метода происходит без объекта. Версия вызываемого статического метода всегда определяется на этапе компиляции.

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

Создадим в супер классе и наследнике статические методы с одинаковой сигнатурой:

4. Переопределение методов в классах наследниках

5. Аннотация @Override

Необязательная аннотация @Override используется с методом для указания того, что он переопределен. Если метод переопределен неверно, код не будет компилироваться:

Источник

Переопределение статического метода в Java

В Java нельзя переопределять статические методы. Но почему работает следующий код:

На печать выводится «B». Все выглядит так, как будто это переопределение. Потому что при перегрузке я должна была бы что-то изменить в сигнатуре метода. Но нет, я ничего не меняла.

Аннотацию «override» не могу поставить над методом.

в классе наследнике определен статический метод такой же как родительском java. Смотреть фото в классе наследнике определен статический метод такой же как родительском java. Смотреть картинку в классе наследнике определен статический метод такой же как родительском java. Картинка про в классе наследнике определен статический метод такой же как родительском java. Фото в классе наследнике определен статический метод такой же как родительском java

2 ответа 2

Переопределение метода:

Переопределение метода (Method overriding) это возможность языка позволяющая подклассу или дочернему элементу классу обеспечивать специфическую реализацию метода, который уже реализовали в одном из супер-классов или родительском классе. Переопределение выглядит так:

Переопределенный метод должен иметь тот же модификатор доступа что его родитель, принимать аргументы как его родитель, и иметь возвращаемый тип такой же как у его родителя
Т.е.

Сокрытие метода:

Сокрытие методов, грубо говоря, представляет из себя «перекрытие» методом текущего класса, метода родительского класса. Выглядит это следующим образом:

Важно отметить, что перекрытие требует таких же правил как и переопределение метода.

Переопределенный метод должен иметь тот же модификатор доступа что его родитель, принимать аргументы как его родитель, и иметь возвращаемый тип такой же как у его родителя

Рассмотрим использование таких методов в своих классах

Поскольку в классе-наследнике нет реализованного схожего по сигнатуре с родительским классом метода, то используется метод унаследованный от родительского класса

Поскольку теперь у класса Dog появился «свой метод» voice() он перекрывает метод унаследованный от Animal

Хочу дополнить тем, что перекрытие работает не только с методами класса, но и с его полями. Небольшой пример:

Источник

Статические методы наследуются в Java?

Я читал Руководство программиста по Сертификация Java ™ SCJP от Халида Могала.

В главе о наследовании объясняется, что

Наследование членов тесно связано с их заявленной доступностью. Если член суперкласса доступен по своему простому имени в подклассе (без использования какого-либо дополнительного синтаксиса, такого как super), этот член считается унаследованным

Также упоминается, что статические методы не наследуются. Но приведенный ниже код прекрасен:

Применимо ли объяснение в книге только к методам экземпляра?

14 ответов

Все доступные методы наследуются подклассами.

Подкласс наследует все открытые и защищенные члены своего родителя, независимо от того, в каком пакете находится подкласс. Если подкласс находится в том же пакете, что и его родительский элемент, он также наследует частные члены пакета родительского класса. Вы можете использовать унаследованные элементы как есть, заменять их, скрывать или дополнять их новыми членами.

Единственное отличие от унаследованных статических (классовых) методов и унаследованных нестатических (экземпляров) методов заключается в том, что когда вы пишете новый статический метод с той же сигнатурой, старый статический метод просто скрывается, а не переопределяется.

На странице о разнице между переопределением и скрытием.

Различие между сокрытием и отменой имеет важные последствия. Вызывается версия переопределенного метода, указанная в подклассе. Версия вызываемого скрытого метода зависит от того, вызывается он из суперкласса или подкласса.

Статические члены не будут унаследованы в подкласс, потому что наследование предназначено только для нестатических членов. И статические члены будут загружены в статический пул загрузчиком класса. Наследование возможно только для тех членов, которые загружены внутри объекта.

Многие озвучили свой ответ на словах. Это расширенное объяснение в кодах:

Вы можете переопределить статические методы, но если вы попытаетесь использовать полиморфизм, они будут работать в соответствии с областью действия класса (вопреки тому, что мы обычно ожидаем).

Все общедоступные и защищенные члены могут быть унаследованы от любого класса, в то время как члены по умолчанию или члены пакета также могут быть унаследованы от класса в том же пакете, что и суперкласс. Это не зависит от того, является ли он статическим или нестатическим членом.

Но верно также и то, что статические функции-члены не участвуют в динамической привязке. Если сигнатура этого статического метода одинакова как в родительском, так и в дочернем классе, применяется концепция Shadowing, а не полиморфизм.

Эта концепция не так проста, как кажется. Мы можем получить доступ к статическим членам без наследования, которое является отношением HasA. Мы можем получить доступ к статическим членам, также расширив родительский класс. Это не означает, что это ISA-отношение (наследование). Фактически статические члены принадлежат классу, а статические не являются модификатором доступа. Пока модификаторы доступа разрешают доступ к статическим членам, мы можем использовать их в других классах. Например, если он общедоступный, он будет доступен внутри того же пакета, а также вне пакета. Для личного пользования мы не можем нигде использовать. По умолчанию мы можем использовать его только внутри пакета. Но для защиты мы должны расширить суперкласс. Таким образом, получение статического метода для другого класса не зависит от того, является ли он статическим. Это зависит от модификаторов доступа. Итак, на мой взгляд, статические члены могут получить доступ, если позволяют модификаторы доступа. В противном случае мы можем использовать их так же, как мы используем отношение Hasa. И имеет отношение не по наследству. Опять же, мы не можем переопределить статический метод. Если мы можем использовать другой метод, но не можем его переопределить, то это отношение HasA. Если мы не сможем их переопределить, это не будет наследованием, значит, автор был на 100% прав.

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

B.display () работает, потому что статическое объявление делает метод / член принадлежащим классу, а не какому-либо конкретному экземпляру класса (также известному как Object). Подробнее об этом можно узнать здесь.

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

Статические методы в Java наследуются, но не могут быть переопределены. Если вы объявляете тот же метод в подклассе, вы скрываете метод суперкласса, а не переопределяете его. Статические методы не полиморфны. Во время компиляции статический метод будет статически связан.

Вы получите следующее:

Если это действительно то, что книга говорит, это неправильно. [1]

8.4.8 Наследование, переопределение и скрытие

Класс C наследует от своего прямого суперкласса все конкретные методы m (как статические, так и экземпляры) суперкласса, для которых выполняются все следующие условия:

m является членом прямого суперкласса C.

m является общедоступным, защищенным или объявленным с доступом к пакету в том же пакете, что и C.

Ни один метод, объявленный в C, не имеет сигнатуры, которая является субподписью (§8.4.2) сигнатуры m.

[1] Это не сказано в моем экземпляре, 1-е издание, 2000 г.

Вы можете почувствовать разницу в следующем коде, который немного изменен по сравнению с вашим кодом.

Это связано с тем, что статические методы являются методами класса.

Источник

Наследуются ли статические методы в Java?

Я читал руководство Программиста По Сертификация Java™ SCJP Халид Моголов.

в главе наследования он объясняет, что

наследование членов тесно связано с их объявленным доступность. Если элемент суперкласса доступен по его простому имени в подклассе (без использования какого-либо дополнительного синтаксиса, такого как super), это член считается унаследованным

Он также упоминает, что статические методы не наследуются. Но код ниже отлично подходит:

применимо ли объяснение книги только к методам экземпляра?

14 ответов

все доступные методы наследуются подклассами.

подкласс наследует все открытые и защищенные члены своего родителя, независимо от того, в каком пакете находится подкласс. Если подкласс находится в том же пакете, что и его родитель, он также наследует члены package-private родителя. Наследуемые элементы можно использовать как есть, заменять их, скрывать или дополнять новыми члены

единственное отличие от унаследованных статических (class) методов и унаследованных нестатических (instance) методов заключается в том, что при написании нового статического метода с той же сигнатурой старый статический метод просто скрыт, а не переопределен.

с страница о разнице между переопределением и скрытием.

различие между скрытием и переопределением имеет важные последствия. Версия переопределенного метода что вызывается в подклассе. Версия скрытого метода, который вызывается, зависит от того, вызывается ли он из суперкласса или подкласса

Если это то, что книга действительно говорит, это неправильно.[1]

8.4.8 наследование, переопределение и сокрытие

класс C наследует от своего прямого суперкласса все конкретные методы m (как статические, так и экземплярные) суперкласса, для которого все следующее верно:

m является членом прямого суперкласса C.

м. public, protected или объявленная с выходом пакета в пакет С.

ни один метод, объявленный в C, не имеет подписи, которая является подсигнализацией (§8.4.2) подписи m.

[1] это не сказано в моей копии, 1-е издание, 2000.

вы можете испытать разницу в следующем коде, который немного изменяет ваш код.

это связано с тем, что статические методы являются методами класса.

A. display () и B. display () вызовут метод своих соответствующих классов.

B. display () работает, потому что статическое объявление делает метод/член принадлежащим классу, а не какому-либо конкретному экземпляру класса (aka Object). Вы можете прочитать больше об этом здесь.

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

эта концепция не так проста, как кажется. Мы можем получить доступ к статическим членам без наследования, который имеет отношения. Мы можем получить доступ к статическим членам, также расширив родительский класс. Это не означает, что это ISA-отношение (наследование). На самом деле статические члены принадлежат классу, а static не является модификатором доступа. Пока модификаторы доступа разрешают доступ к статическим членам, мы можем использовать их в других классах. Например, если он публичный, то он будет доступен внутри такой же пакет и также вне пакета. Для частных мы не можем использовать его нигде. По умолчанию мы можем использовать только внутри пакета. Но для защиты мы должны расширить супер класс. Таким образом, получение статического метода в другой класс не зависит от статичности. Это зависит от модификаторов доступа. Таким образом, на мой взгляд, статические члены могут получить доступ, если модификаторы доступа позволяют. В противном случае, мы можем использовать их, как мы используем по Хаса-связи. И имеет отношение не к наследованию. Снова мы не можем переопределить статический метод. Если мы можем использовать другой метод, но не можем его переопределить, то это hasa-relation. Если мы не сможем их отменить, это не будет наследством.Таким образом, автор был на 100% прав.

статические методы наследуются в Java, но они не участвуют в полиморфизме. Если мы попытаемся переопределить статические методы, они просто скроют статические методы суперкласса вместо их переопределения.

все открытые и защищенные члены могут быть унаследованы от любого класса, в то время как члены по умолчанию или пакета также могут быть унаследованы от класса в том же пакете, что и у суперкласса. Это не зависит от того, является ли он статическим или нестатическим членом.

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

вы можете переопределить статические методы, но если вы пытаетесь использовать полиморфизм, то они работают по области видимости класса(вопреки тому, что мы обычно ожидаем).

многие озвучили свой ответ в словах. Это расширенное объяснение в коде:

таким образом, это вывод:

статические методы в Java наследуются, но не могут быть переопределены. Если вы объявляете тот же метод в подклассе, вы скрываете метод суперкласса вместо его переопределения. Статические методы не являются полиморфными. Во время компиляции статический метод будет статически связан.

вы получите следующее:

мы можем объявить статические методы с той же сигнатурой в подклассе, но он не считается переопределяющим, поскольку не будет никакого полиморфизма во время выполнения.Поскольку все статические члены класса загружаются во время загрузки класса, он решает во время компиляции(переопределение во время выполнения), поэтому ответ «Нет».

статические члены являются универсальными членов. К ним можно получить доступ из любого места.

статические члены не будут наследоваться подклассу, потому что наследование только для нестатических членов.. И статические члены будут загружены внутри статического пула загрузчиком класса. Наследование только для тех членов, которые загружаются внутри объекта

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *