Почему статика имеет разные значения в зависимости от контекста? [дубликат]


этот вопрос уже есть ответ здесь:

  • В терминах непрофессионалов, что означает "статический" в Java? [дубликат] 6 ответов

Как я понимаю:

  • статический класс применяется только к вложенным классам, и это означает, что вложенный класс не имеет ссылок на внешний класс.

  • статическое поле-это своего рода глобальная переменная, в которой есть только один ее экземпляр, и она совместно используется другими членами того же класса.

  • статический метод означает, что он может быть вызван, даже если объект еще не был создан.

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

6 56

6 ответов:

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

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

  • статический метод означает, что вы для вызова метода не требуется экземпляр класса. Вы можете позвонить String.format без фактического String экземпляр, например.

  • статическое поле будет существовать даже без экземпляра класса. Если ваш Foo класс counter поле, которое является статическим, вы можете получить к нему доступ без создания экземпляра Foo класса.

рассмотрим, как Уточняющий момент, что интерфейс может иметь статические классы, статические поля, и статические методы. Однако он не может иметь нестатическую версию любой из этих вещей (игнорируя методы по умолчанию, которые являются своего рода ad-hoc'D в концепции). Это связано с тем, что вы никогда не можете создать экземпляр интерфейса, поэтому никогда не может быть заключающего экземпляра.

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

последний византийский момент. Если вы выполняете статический импорт (import static pack.age.Foo.*) вы сможете делать безусловные ссылки на любые статические элементы в классе (включая интерфейсы, аннотации и перечисления независимо от того, являются ли они избыточно помеченными статическими).

почему статика имеет разные значения в зависимости от контекста? Почему разве не используются разные ключевые слова?

на самом деле это не имеет разных значений.

вы можете взять static ключевое слово, чтобы указать следующее, Где бы он ни встречался:

"без связи или отношения к какому-либо конкретному экземпляру"

  • статическое поле-это поле, которое принадлежит классу а не к какому-то конкретному экземпляру.

  • статический метод определен в классе и не имеет никакого понятия this. Такой метод не может получить доступ к полям экземпляра в любом конкретном экземпляре, за исключением случаев, когда экземпляр передается ему.

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

с Ядро Java Кей Хорстман:

термин "статический" имеет любопытную историю. Сначала ключевое слово static было введено в C to обозначьте локальные переменные, которые не исчезают при выходе из блока. В этом контексте термин "статический" имеет смысл: переменная остается вокруг и все еще там, когда блок вводится снова. Затем статика получила второе значение в C, чтобы обозначить глобальные переменные и функции это не может быть доступно из других файлы. Ключевое слово static было просто повторно использовано, чтобы избежать вводить новое ключевое слово. Наконец, C++ повторно использовал ключевое слово для третьего, несвязанного, интерпретация-для обозначения переменных и функций, которые принадлежат к классу, но не к любому конкретный объект класса. Это то же самое значение, что и ключевое слово в Java.

Java наследует от C++ и C. В этих языках,static имеет два дополнительных смыслов. Локальная переменная (область действия функции), определяемая как static имеет значение, несколько похожее на значение статического поля в классе. Однако Java не поддерживает этот контекст "статического". Квалификация переменной или функции как static в C или C++ в области файла означает " Ssh! Не говори линкеру!". Java не поддерживает это средство static, либо.

в английском языке одно и то же слово может иметь несколько значений в зависимости от контекста. Посмотрите на любое часто используемое слово в словаре, и вы найдете несколько определений этого слова. Некоторые слова не только имеют несколько значений, они имеют несколько частей речи. "Счетчик", например, может быть существительным, глаголом, прилагательным или наречием, в зависимости от контекста. Другие слова могут иметь противоречивые смыслы в зависимости от контекста. "Извинение "может означать" мне так жаль! или это может означать: "мне совсем не жаль!"Главный пример последнего-это "Извинение математика" Г. Х. Харди. Английский язык вовсе не уникален в этом отношении; то же самое относится к любому языку, который люди используют для общения друг с другом. Как люди, мы вполне привыкли к словам, имеющим различные значения в зависимости от контекста.

существует врожденный конфликт между наличием слишком мало ключевых слов и слишком много в компьютерном языке. Lisp, forth и smalltalk-очень красивые языки с очень небольшим количеством ключевых слов. Они имеют несколько специальных символов, например, открывать и закрывать круглые скобки в lisp. (Полное раскрытие: я запрограммировал на всех трех этих языках, и мне это понравилось.) Здесь есть проблема: удачи в чтении кода, который вы сами написали через шесть месяцев после этого факта. Еще лучше передать этот код кому-то другому. В результате эти языки также имеют довольно ограниченное число приверженцев. Другие языки идут сверху и оставляем огромное количество слов, как "ключевые слова."(Полное раскрытие информации: я был вынужден программировать на этих языках а также, и я ненавидел это.)

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

Java учебник говорит

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

в основном "статический" означает, что объект, отмеченный им, отделен от экземпляров класса. Статический метод не имеет экземпляра, связанного с ним. Статическое поле является общим для всех экземпляров (по существу существует в классе, а не в экземпляре).
статические вложенные классы отделены от заключающего экземпляра. Вы правы, что это немного запутанно, потому что вы можете иметь экземпляр статического вложенного класса с нестатическими методами и полями внутри него.
Подумайте о слове static как о том, что " я объявляю сущность, поле, метод или внутренний класс, который собирается не имеют никакого отношения к экземпляр включения"

все упомянутые применения статики имеют некоторую общность, как я ее вижу - во всех случаях они означают, что класс/поле/метод менее привязан к экземпляру класса, чем это было бы без статики. Конечно, эквивалентность между статическими полями и статическими методами, в частности, должна быть ясной: они являются способом объявления одноэлементных (для каждого загрузчика классов) полей и методов, которые работают с этими полями, аналогично глобальным объектам на других языках.

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

поэтому я не вижу в них особой непоследовательности.

один из ответов на более общий вопрос о том, почему ключевые слова повторно используются для явно разных целей в языке программирования, заключается в том, что часто функции вводятся по мере развития языка, но трудно добавьте новые ключевые слова, так как часто ломают существующие программы, которые, возможно, использовали это в качестве идентификатора. Java, например, фактически резервирует ключевое слово const даже если он не используется в языке, возможно, чтобы обеспечить расширение в будущем!

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