Чтобы быть конкретным, я пытался этот код:
package hello;
public class Hello {
Clock clock = new Clock();
public static void main(String args[]) {
clock.sayTime();
}
}
Но это дало ошибку
Невозможно получить доступ к нестатическому полю в статическом методе main
Поэтому я изменил декларацию clock
на это:
static Clock clock = new Clock();
И это сработало. Что значит поставить это ключевое слово перед объявлением? Что именно он будет делать и / или ограничивать с точки зрения того, что можно сделать с этим объектом?
java
static
oop
language-features
restriction
Нажмите Upvote
источник
источник
Ответы:
static
члены принадлежат классу, а не конкретному экземпляру.Это означает, что существует только один экземпляр
static
поля [1], даже если вы создаете миллион экземпляров класса или не создаете ни одного. Он будет доступен всем экземплярам.поскольку
static
методы также не принадлежат конкретному экземпляру, они не могут ссылаться на члены экземпляра. В приведенном примереmain
не знает, на какой экземплярHello
класса (и, следовательно, на какой экземплярClock
класса) он должен ссылаться.static
Участники могут ссылаться только наstatic
членов. Участники экземпляра, конечно, могут получить доступ кstatic
членам.Примечание: конечно,
static
члены могут получить доступ к членам экземпляра через ссылку на объект .Пример:
[1]: В зависимости от характеристик времени выполнения, это может быть один для ClassLoader или AppDomain или потока, но это не относится к делу.
источник
Это означает, что в Hello есть только один экземпляр «clock», а не по одному на каждый отдельный экземпляр класса «Hello», или более того, это означает, что среди всех экземпляров будет одна общедоступная ссылка «clock». класс "Привет".
Поэтому, если бы вы выполняли «новый Hello» где-нибудь в вашем коде: A- в первом сценарии (до изменения, без использования «static»), он делал бы новые часы каждый раз, когда вызывается «new Hello», но B- во втором сценарии (после изменения, используя «static»), каждый «новый Hello» экземпляр по-прежнему будет совместно использовать и использовать начальную и ту же самую ссылку «clock», которая была впервые создана.
Если вам не нужны «часы» где-то за пределами основного, это будет работать так же хорошо:
источник
main()
Процедура должна быть самодостаточной.main
метод только потому, что это сделал OP. Если вместо этого это был публичный метод, который вызывался из другого места, и класс Hello создавался более одного раза, то он мог бы создать экземпляр Clock для каждого экземпляра Hello, если только он неclock
был статическим.В
static
ключевом слове означает , что что - то (поле, метод или вложенный класс) относятся к типу , а не какому - либо конкретному экземпляру типа. Так, например, каждый вызываетMath.sin(...)
без какого-либо экземпляраMath
класса, и на самом деле вы не можете создать экземплярMath
класса.Для получения дополнительной информации см. Соответствующую часть Oracle Java Tutorial .
Примечание
К сожалению, Java позволяет вам получать доступ к статическим членам, как если бы они были членами экземпляра, например
Это делает его выглядеть так , как будто
sleep
это метод экземпляра, но это на самом деле статический метод - это всегда делает текущий сон нити. Лучше прояснить это в вызывающем коде:источник
System.out
не нравится имя типа.static
Ключевое слово в Java означает , что переменная или функция разделяется между всеми экземплярами этого класса , как он относится к типу , а не сами фактические объекты.Поэтому, если у вас есть переменная:
private static int i = 0;
и вы увеличиваете ее (i++
) в одном экземпляре, это изменение будет отражено во всех экземплярах.i
теперь будет 1 во всех случаях.Статические методы могут быть использованы без создания объекта.
источник
Основное использование статических членов ...
Таким образом, вы можете иметь общие значения для всех членов класса, не отправляя экземпляр класса Hello другому классу. И, кроме статики, вам не нужно создавать экземпляр класса.
Вы можете просто вызывать статические значения или методы по имени класса:
источник
Статический означает, что вам не нужно создавать экземпляр класса, чтобы использовать методы или переменные, связанные с классом. В вашем примере вы могли бы позвонить:
напрямую, вместо:
Внутри статического метода (который принадлежит классу) вы не можете получить доступ к любым элементам, которые не являются статическими, так как их значения зависят от вашего экземпляра класса. Нестатический объект Clock, который является членом экземпляра, будет иметь различное значение / ссылку для каждого экземпляра вашего класса Hello, и поэтому вы не сможете получить к нему доступ из статической части класса.
источник
Статика в Java:
Static - это не модификатор доступа. Ключевое слово static относится к классу, а не к экземпляру класса. может использоваться для присоединения переменной или метода к классу.
Статическое ключевое слово МОЖЕТ использоваться с:
метод
переменная
Класс, вложенный в другой класс
Блок инициализации
НЕ МОЖЕТ использоваться с:
Класс (не вложенный)
Конструктор
Интерфейсы
Метод Local Inner Class (отличие от вложенного класса)
Методы внутреннего класса
Переменные экземпляра
Локальные переменные
Пример:
Представьте себе следующий пример, в котором есть переменная экземпляра с именем count, которая увеличивается в конструкторе:
Вывод:
Поскольку переменная экземпляра получает память во время создания объекта, у каждого объекта будет копия переменной экземпляра, если она увеличивается, она не будет отражаться для других объектов.
Теперь, если мы изменим значение переменной экземпляра на статическое, программа выдаст другой результат:
Вывод:
В этом случае статическая переменная получит память только один раз, если какой-либо объект изменит значение статической переменной, он сохранит свое значение.
Статика с финалом:
Глобальная переменная, объявленная как final и static, остается неизменной на протяжении всего выполнения. Потому что статические члены хранятся в памяти классов и загружаются только один раз за все выполнение. Они являются общими для всех объектов класса. Если вы объявите статические переменные как окончательные, ни один из объектов не сможет изменить их значение, поскольку оно является окончательным. Поэтому переменные, объявленные как final и static, иногда называют константами. Все поля интерфейсов называются константами, потому что они являются окончательными и статическими по умолчанию.
Ресурс изображения: Final Static
источник
Чтобы добавить к существующим ответам, позвольте мне попробовать с изображением:
Процентная ставка 2% применяется ко ВСЕМ сберегательным счетам. Следовательно это статично .
Баланс должен быть индивидуальным , чтобы он не был статичным.
источник
Это обсуждение до сих пор игнорировало соображения загрузчика классов. Строго говоря, статические поля Java совместно используются всеми экземплярами класса для данного загрузчика классов .
источник
Поле может быть назначено либо классу, либо экземпляру класса. По умолчанию поля являются переменными экземпляра. При использовании
static
поля становится переменной класса, таким образом, есть один и только одинclock
. Если вы вносите изменения в одном месте, это видно везде. Varables экземпляра изменяются независимо друг от друга.источник
Ключевое слово
static
используется для обозначения поля или метода как принадлежащих самому классу, а не экземпляру. Используя ваш код, если объектClock
статический, все экземплярыHello
класса будут совместно использовать этотClock
элемент данных (поле) совместно. Если вы сделаете его нестатичным, каждый отдельный экземплярHello
может иметь уникальныйClock
поле.Проблема в том, что вы добавили метод main в свой класс,
Hello
чтобы вы могли запустить код. Проблема здесь в том, что метод main является статическим и поэтому не может ссылаться на нестатические поля или методы внутри него. Вы можете решить это двумя способами:Hello
класса статическими, чтобы их можно было ссылаться внутри основного метода. Это действительно не очень хорошая вещь (или неправильная причина, по которой поле и / или метод становятся статическими)Hello
класса внутри метода main и получите доступ ко всем его полям и методам так, как они были предназначены в первую очередь.Для вас это означает следующее изменение вашего кода:
источник
В Java
static
ключевое слово можно просто рассматривать как указывающее на следующее:Если подумать
static
таким образом, станет легче понять его использование в различных контекстах, в которых оно встречается:static
Поле представляет собой поле , которое принадлежит к классу , а не к какой - либо конкретной инстанцииstatic
Способ представляет собой способ , который не имеет понятияthis
; он определен в классе и не знает ни о каком конкретном экземпляре этого класса, если на него не передана ссылкаstatic
Класс элемента представляет собой вложенный класс без какого - либо понятия или знания экземпляра его вмещающего класса (если ссылка на охватывающем экземпляр класса не передаются к нему)источник
Static делает член часов членом класса вместо члена экземпляра. Без ключевого слова static вам нужно было бы создать экземпляр класса Hello (который имеет переменную-член clock) - например,
источник
Статические методы не используют переменные экземпляра класса, в котором они определены. Очень хорошее объяснение различий можно найти на этой странице.
источник
Я разработал привязку к статическим методам (только, если это возможно) в «вспомогательных» классах.
Вызывающему классу не нужно создавать другую переменную-член (экземпляр) вспомогательного класса. Вы просто вызываете методы вспомогательного класса. Также улучшен вспомогательный класс, потому что вам больше не нужен конструктор и вам не нужны переменные-члены (экземпляры).
Есть, вероятно, другие преимущества.
источник
источник
Также можно думать о статических членах, не имеющих указателя «this». Они распределяются между всеми экземплярами.
источник
Понимание статических концепций
Второй класс
источник
main()
статический метод, имеющий два фундаментальных ограничения:this()
иsuper()
не может использоваться в статическом контексте.источник
Статические переменные могут быть доступны только в статических методах, поэтому, когда мы объявляем статические переменные, методы getter и setter будут статическими методами.
статические методы - это уровень класса, к которому мы можем получить доступ, используя имя класса
Ниже приведен пример для статических переменных Getter и Setters:
источник
Был задан вопрос здесь о выборе слова «статический» для этой концепции. Это был ответ на этот вопрос, но я не думаю, что этимология была четко рассмотрена. Так...
Это связано с повторным использованием ключевых слов, начиная с C.
Рассмотрим объявления данных в C (внутри тела функции):
Переменная foo создается в стеке при входе в функцию (и уничтожается при завершении функции). Напротив, бар всегда есть, поэтому он «статичен» в смысле обычного английского - он никуда не денется.
Java и подобные языки имеют одинаковую концепцию для данных. Данные могут быть выделены для каждого экземпляра класса (для объекта) или один раз для всего класса. Поскольку Java стремится иметь знакомый синтаксис для программистов на C / C ++, здесь уместно ключевое слово «static».
Наконец, мы приходим к методам.
Концептуально говоря, существует экземпляр функции foo () для каждого экземпляра класса C. Для всего класса C. существует только один экземпляр bar (). Это параллельно случаю, который мы обсуждали для данных, и, следовательно, с использованием 'static Это снова разумный выбор, особенно если вы не хотите добавлять больше зарезервированных ключевых слов на свой язык.
источник