Почему статический метод доступен без полного имени в подклассе? - PullRequest
2 голосов
/ 17 ноября 2011

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

package synchronizedpkg;

class SuperClass
{
    public final static synchronized void staticMethod()
    {
        System.out.println("Method called.");
    }
}

final class SubClass extends SuperClass
{
    public void woof()
    {
        staticMethod();
    }
}

final public class Main
{
    public static void main(String[] args)
    {
        new SubClass().woof();
    }
}

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

Ответы [ 5 ]

2 голосов
/ 17 ноября 2011

Ваше понимание неверно:

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

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

Итак, это видно, поэтому вы можете получить к нему доступ. И это член, поэтому вам не нужно его квалифицировать.

2 голосов
/ 17 ноября 2011

Статический метод наследуется так же, как методы экземпляра. С раздел 8.4.8 JLS :

Класс C наследует от своего прямого суперкласса и прямых суперинтерфейсов все не приватные методы (абстрактные или нет) суперкласса и суперинтерфейсов, которые являются открытыми, защищенными или объявлены с доступом по умолчанию в том же пакете, что и C, и не переопределяются (§8.4.8.1), ни скрытый (§8.4.8.2) объявлением в классе.

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

1 голос
/ 23 сентября 2013

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

Пример. Предположим, у вас есть учитель, который учит всех учащихся всех классов. Таким образом, на самом деле не имеет значения, если ученик 1-го класса звонит своему учителю 1-го класса, а ученик 2-го класса звонит своему учителю 2-го класса или кто-то еще называет ее школьным учителем. Все они ссылаются на одного и того же учителя.

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

Вот как это работает даже в Java. Ява, вероятно, единственный язык, который относится к сценариям реального мира. Надеюсь, это поможет .....:)

1 голос
/ 17 ноября 2011

С Понимание экземпляра и членов класса :

"Язык программирования Java поддерживает статические методы, а также статические переменные. Статические методы, которые имеют статический модификатор в своих объявлениях, должны вызываться с именем класса, без необходимости создания экземпляра класса, как в

ClassName.methodName(args)

Примечание: Вы также можете ссылаться на статические методы с помощью ссылки на объект, такой как

instanceName.methodName(args)

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

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

РЕДАКТИРОВАТЬ: Что касается окончательного модификатора, это просто означает, что метод не может быть переопределен в подклассе. Насколько я понимаю, вы этого не делаете, поэтому это не влияет на результат. Вы можете прочитать об этом здесь .

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

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

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