Вопрос-ответ

What does the 'static' keyword do in a class?

Что делает ключевое слово 'static' в классе?

Если быть точным, я пробовал этот код:

package hello;

public class Hello {

Clock clock = new Clock();

public static void main(String args[]) {
clock.sayTime();
}
}

Но это выдало ошибку


Не удается получить доступ к нестатическому полю в статическом методе main


Итак, я изменил объявление clock на это:

static Clock clock = new Clock();

И это сработало. Что значит поместить это ключевое слово перед объявлением? Что именно это будет делать и / или ограничивать с точки зрения того, что можно сделать с этим объектом?

Переведено автоматически
Ответ 1

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

Это означает, что существует только один экземпляр static поля[1], даже если вы создадите миллион экземпляров класса или не создадите ни одного. Оно будет общим для всех экземпляров.

Поскольку static методы также не принадлежат определенному экземпляру, они не могут ссылаться на члены экземпляра. В приведенном примере main не знает, на какой экземпляр Hello класса (и, следовательно, на какой экземпляр Clock класса) оно должно ссылаться. static Члены могут ссылаться только на static члены. Члены экземпляра, конечно, могут обращаться к static членам.

Примечание: Конечно, static участники могут обращаться к элементам экземпляра через ссылку на объект.

Пример:

public class Example {
private static boolean staticField;
private boolean instanceField;
public static void main(String[] args) {
// a static method can access static fields
staticField = true;

// a static method can access instance fields through an object reference
Example instance = new Example();
instance.instanceField = true;
}

[1]: В зависимости от характеристик среды выполнения, оно может быть по одному на загрузчик классов, домен приложения или поток, но это не относится к делу.

Ответ 2

Это означает, что в Hello есть только один экземпляр "clock", а не по одному на каждый отдельный экземпляр класса "Hello" или больше - таким образом, это означает, что среди всех экземпляров класса "Hello" будет одна общая ссылка на "clock".

Итак, если бы вы выполняли "новое приветствие" в любом месте вашего кода: A- в первом сценарии (до изменения, без использования "static") это создавало бы новые часы каждый раз, когда вызывается "new Hello", но B- во втором сценарии (после изменения, с использованием "static") каждый экземпляр "new Hello" по-прежнему использовал бы исходную и ту же самую ссылку на "clock", созданную первым.

Если вам не нужен "clock" где-то за пределами main , это сработало бы так же хорошо:

package hello;
public class Hello
{
public static void main(String args[])
{
Clock clock=new Clock();
clock.sayTime();
}
}
Ответ 3

static Ключевое слово означает, что что-то (поле, метод или вложенный класс) связано с типом, а не с каким-либо конкретным экземпляром этого типа. Итак, например, выполняется вызов Math.sin(...) без какого-либо экземпляра Math класса, и действительно, вы не можете создать экземпляр Math класса.

Для получения дополнительной информации см. Соответствующую часть руководства Oracle по Java.


Примечание

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.

Статические методы можно использовать без создания экземпляра объекта.

java oop