Не удается получить доступ к нестатическому полю в статическом методе main
Итак, я изменил объявление clock на это:
staticClockclock=newClock();
И это сработало. Что значит поместить это ключевое слово перед объявлением? Что именно это будет делать и / или ограничивать с точки зрения того, что можно сделать с этим объектом?
Переведено автоматически
Ответ 1
static члены принадлежат классу, а не конкретному экземпляру.
Это означает, что существует только один экземпляр static поля[1], даже если вы создадите миллион экземпляров класса или не создадите ни одного. Оно будет общим для всех экземпляров.
Поскольку static методы также не принадлежат определенному экземпляру, они не могут ссылаться на члены экземпляра. В приведенном примере main не знает, на какой экземпляр Hello класса (и, следовательно, на какой экземпляр Clock класса) оно должно ссылаться. static Члены могут ссылаться только на static члены. Члены экземпляра, конечно, могут обращаться к static членам.
Примечание: Конечно, static участники могут обращаться к элементам экземпляра через ссылку на объект.
Пример:
publicclassExample { privatestaticboolean staticField; privateboolean instanceField; publicstaticvoidmain(String[] args) { // a static method can access static fields staticField = true;
// a static method can access instance fields through an object reference Exampleinstance=newExample(); instance.instanceField = true; }
[1]: В зависимости от характеристик среды выполнения, оно может быть по одному на загрузчик классов, домен приложения или поток, но это не относится к делу.
Ответ 2
Это означает, что в Hello есть только один экземпляр "clock", а не по одному на каждый отдельный экземпляр класса "Hello" или больше - таким образом, это означает, что среди всех экземпляров класса "Hello" будет одна общая ссылка на "clock".
Итак, если бы вы выполняли "новое приветствие" в любом месте вашего кода: A- в первом сценарии (до изменения, без использования "static") это создавало бы новые часы каждый раз, когда вызывается "new Hello", но B- во втором сценарии (после изменения, с использованием "static") каждый экземпляр "new Hello" по-прежнему использовал бы исходную и ту же самую ссылку на "clock", созданную первым.
Если вам не нужен "clock" где-то за пределами main , это сработало бы так же хорошо:
static Ключевое слово означает, что что-то (поле, метод или вложенный класс) связано с типом, а не с каким-либо конкретным экземпляром этого типа. Итак, например, выполняется вызов Math.sin(...) без какого-либо экземпляра Math класса, и действительно, вы не можете создать экземпляр Math класса.
Java, к сожалению, позволяет вам обращаться к статическим членам, как если бы они были членами экземпляра, например
// Bad code! Thread.currentThread().sleep(5000); someOtherThread.sleep(5000);
Из-за этого это выглядит так, как будто sleep является методом экземпляра, но на самом деле это статический метод - он всегда переводит текущий поток в спящий режим. Лучше прояснить это в вызывающем коде:
// Clearer Thread.sleep(5000);
Ответ 4
static Ключевое слово в Java означает, что переменная или функция является общей для всех экземпляров этого класса, поскольку она принадлежит к типу, а не для самих реальных объектов.
Итак, если у вас есть переменная: private static int i = 0; и вы увеличиваете ее (i++) в одном экземпляре, изменение будет отражено во всех экземплярах. i теперь во всех экземплярах будет равно 1.
Статические методы можно использовать без создания экземпляра объекта.