Поиск…


Синтаксис

  • 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
    }
    
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow