Java Language
Использование ключевого слова static
Поиск…
Синтаксис
- public static int myVariable; // Объявление статической переменной
- public static myMethod () {} // Объявление статического метода
- публичный статический окончательный двойной MY_CONSTANT; // Объявление константной переменной, которая разделяется между всеми экземплярами класса
- публичный финальный двойной MY_CONSTANT; // Объявление константной переменной, специфичной для этого экземпляра класса (наилучшим образом используемого в конструкторе, который генерирует другую константу для каждого экземпляра)
Использование static для объявления констант
Поскольку ключевое слово static
используется для доступа к полям и методам без инстанцированного класса, его можно использовать для объявления констант для использования в других классах. Эти переменные останутся постоянными во всех экземплярах класса. По соглашению, static
переменные всегда ALL_CAPS
и используют ALL_CAPS
подчеркивания, а не случай верблюда. например:
static E STATIC_VARIABLE_NAME
Поскольку константы не могут измениться, static
могут также использоваться с final
модификатором:
Например, чтобы определить математическую константу pi:
public class MathUtilities {
static final double PI = 3.14159265358
}
Который может использоваться в любом классе как константа, например:
public class MathCalculations {
//Calculates the circumference of a circle
public double calculateCircumference(double radius) {
return (2 * radius * MathUtilities.PI);
}
}
Использование static с этим
Static предоставляет метод или переменную память, которая не выделяется для каждого экземпляра класса. Скорее, статическая переменная распределяется между всеми членами класса. Кстати, попытка рассматривать статическую переменную как члена экземпляра класса приведет к предупреждению:
public class Apple {
public static int test;
public int test2;
}
Apple a = new Apple();
a.test = 1; // Warning
Apple.test = 1; // OK
Apple.test2 = 1; // Illegal: test2 is not static
a.test2 = 1; // OK
Методы, объявленные статическими, ведут себя одинаково, но с дополнительным ограничением:
Вы не можете использовать
this
ключевое слово в них!
public class Pineapple {
private static int numberOfSpikes;
private int age;
public static getNumberOfSpikes() {
return this.numberOfSpikes; // This doesn't compile
}
public static getNumberOfSpikes() {
return numberOfSpikes; // This compiles
}
}
В общем, лучше всего объявить общие методы, которые применяются к различным экземплярам класса (например, клонов) static
, сохраняя при этом методы, подобные equals()
как нестатические. main
метод Java-программы всегда статичен, что означает, что ключевое слово this
не может использоваться внутри main()
.
Ссылка на нестатический элемент из статического контекста
Статические переменные и методы не являются частью экземпляра. Всегда будет одна копия этой переменной независимо от того, сколько объектов вы создадите для определенного класса.
Например, вы можете иметь неизменный список констант, было бы неплохо сохранить его статическим и инициализировать его только один раз внутри статического метода. Это даст вам значительное увеличение производительности, если вы регулярно создаете несколько экземпляров определенного класса.
Кроме того, вы также можете иметь статический блок в классе. Вы можете использовать его для назначения значения по умолчанию статической переменной. Они выполняются только один раз, когда класс загружается в память.
Переменная экземпляра, как подсказывает название, зависит от экземпляра конкретного объекта, и они живут, чтобы служить прихотям. Вы можете играть с ними в течение определенного жизненного цикла объекта.
Все поля и методы класса, используемые внутри статического метода этого класса, должны быть статическими или локальными. Если вы попытаетесь использовать переменные или методы экземпляра (нестатические), ваш код не будет компилироваться.
public class Week {
static int daysOfTheWeek = 7; // static variable
int dayOfTheWeek; // instance variable
public static int getDaysLeftInWeek(){
return Week.daysOfTheWeek-dayOfTheWeek; // this will cause errors
}
public int getDaysLeftInWeek(){
return Week.daysOfTheWeek-dayOfTheWeek; // this is valid
}
public static int getDaysLeftInTheWeek(int today){
return Week.daysOfTheWeek-today; // this is valid
}
}