- Ни один класс не является островом.
- Серебряных пуль нет, по крайней мере, это очень верно в программировании.
- Преждевременная оптимизация - корень всего зла.
- В Java у нас нет глобальных переменных. У нас есть только переменные класса, переменные экземпляра и переменные метода.
[Изменить]
Я пытаюсь объяснить здесь мой последний пункт. Фактически, перенося обсуждение, которое продолжается в комментариях ниже, к фактическому сообщению.
Сначала посмотрите на это, SO поток C # . Там люди также предлагают то же самое, то есть
Итак, поехали.
реторта: Классы имеют глобальную область, и, следовательно, все переменные класса имеют глобальную область. Следовательно, следует называть глобальным.
counter-реторта: Не все классы имеют глобальную область применения. Класс может быть package-private
. Поэтому переменные static
там не будут видны за пределами пакета. Следовательно, не следует называть глобальным. Кроме того, классы могут быть вложенными, таким образом, они также могут быть private
и определенно могут иметь некоторые static
переменные, но они не будут называться глобальными.
реторта: public
классы имеют глобальную область, и, следовательно, все переменные класса имеют глобальную область.
встречная реторта: Не совсем так. Я хотел бы перенести предыдущий аргумент здесь, но на переменном уровне. Не имеет значения, является ли сам класс public
. Переменные могут быть protected
, package-private
и private
. Следовательно, static
переменные не будут глобальными в этом случае.
Теперь, если вы хотите назвать переменную public static
в классе public static
как глобальную, тогда вызовите ее любым способом. Но учтите это, когда вы создаете новый ClassLoader
(как дочерний элемент начальной загрузки ClassLoader
) и загружаете уже загруженный класс. Тогда это приводит к «очень новой копии класса» - в комплекте с собственным новым набором static
s. Очень "неглобальный", действительно. Тем не менее, мы не используем слово global в Java, потому что оно может сбить с толку, а затем нам нужно привести множество объяснений, чтобы все прояснить. Люди по праву любят объяснять особенность global
переменных в Java с помощью static
переменных. В этом нет проблем. Если у вас есть проблема / код на любом другом языке, который использует глобальные переменные, и вам нужно преобразовать этот код в Java, то, скорее всего, вы используете переменную static
в качестве альтернативы.
Несколько примеров, которые я хотел бы привести здесь
Когда я запустил Java, инструкторам нравилось объяснять разницу между передачей переменных типа объекта и примитивных переменных. И они постоянно используют термин объекты pass-by-reference
, тогда как примитивы pass-by-value
. Студенты сочли это объяснение довольно запутанным. Итак, мы пришли к мысли, что все в Java передается по значению. И мы объясняем, что для объектов ссылки передаются по значению. Становится намного понятнее и проще.
Аналогично, существуют языки, которые поддерживают множественное наследование. Но Java, опять же, можно утверждать. Но люди склонны объяснять эту функцию, используя interface
s. Они объясняют это классом, реализующим много интерфейсов, и называют это множественным наследованием. Это прекрасно. Но то, что класс, на самом деле, получает путем наследования ряда интерфейсов. Честно говоря, ничего. Зачем?
.Поскольку все переменные в интерфейсах неявно public
, final
и static
, что, очевидно, означает, что они принадлежат классу, и любой может получить к ним доступ.Теперь мы можем сказать, что, возможно, в интерфейсе будет inner class
, тогда класс, реализующий интерфейс, будет иметь его.Но опять же это будет неявно static
и будет принадлежать интерфейсу.Следовательно, все, что получит класс, это методы.И не забывайте только определение и контракт, который гласит: «класс, реализующий этот интерфейс, должен обеспечить реализацию всех методов или объявить себя abstract
».Следовательно, этот класс получит только обязанности и ничего особенного.Но это решает наши проблемы блестящим образом.
Итог
Поэтому мы говорим
- Тамв Java нет глобальных переменных
- Java не поддерживает множественное наследование, но нечто подобное можно реализовать путем реализации нескольких интерфейсов.И это действительно работает
- В Java нет ничего отсылочного к ссылке, но ссылки передаются по значению
Теперь мне нравится посещать еще несколько мест
- Java не поддерживает глобальные, универсально доступные переменные.Вы можете получить те же самые эффекты с классами, которые имеют статические переменные [Ref]
- Однако
extern
в ObjectiveC не является альтернативой статической переменной класса в Java,на самом деле это больше похоже на глобальную переменную ... так что используйте с осторожностью. [Ref] - Вместо глобальных переменных, как в C / C ++, Java позволяет объявить переменные в классе статическими [Ref]
Все это выводит одну и ту же идею.То есть Java не поддерживает глобальные переменные.
Черт, я так много писал.Извините, ребята.