Szukaj…


Składnia

  • public static int myVariable; // Deklaracja zmiennej statycznej
  • public static myMethod () {} // Deklaracja metody statycznej
  • publiczne statyczne końcowe podwójne MY_CONSTANT; // Deklaracja stałej zmiennej, która jest wspólna dla wszystkich instancji klasy
  • finał publiczny podwójny MY_CONSTANT; // Deklaracja zmiennej stałej specyficznej dla tego wystąpienia klasy (najlepiej użyć w konstruktorze, który generuje inną stałą dla każdego wystąpienia)

Używanie statycznego do deklarowania stałych

Ponieważ słowo kluczowe static służy do uzyskiwania dostępu do pól i metod bez klasy instancji, można go używać do deklarowania stałych do użycia w innych klasach. Zmienne te pozostaną stałe w każdym wystąpieniu klasy. Zgodnie z konwencją zmiennymi static są zawsze ALL_CAPS i zamiast podkreślenia wielbłąda są używane podkreślenia. dawny:

 static E STATIC_VARIABLE_NAME

Ponieważ stałe nie mogą się zmieniać, static może być również używany z final modyfikatorem:

Na przykład, aby zdefiniować matematyczną stałą pi:

public class MathUtilities {
    
    static final double PI = 3.14159265358

}

Które mogą być używane w dowolnej klasie jako stała, na przykład:

public class MathCalculations {
   
    //Calculates the circumference of a circle
    public double calculateCircumference(double radius) {
        return (2 * radius * MathUtilities.PI);
    }

}

Używanie statycznego z tym

Statyczny daje metodę lub zmienną pamięć, która nie jest przydzielana dla każdej instancji klasy. Zmienna statyczna jest raczej wspólna dla wszystkich członków klasy. Nawiasem mówiąc, próba traktowania zmiennej statycznej jak członka instancji klasy spowoduje wyświetlenie ostrzeżenia:

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

Metody deklarowane jako statyczne zachowują się w podobny sposób, ale z dodatkowym ograniczeniem:

Nie możesz w nich użyć this słowa kluczowego!

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
    }

}

Zasadniczo najlepiej jest deklarować metody ogólne, które mają zastosowanie do różnych instancji klasy (takich jak metody klonowania), static , przy jednoczesnym zachowaniu metod takich jak equals() jako niestatycznych. main metodą programu Java jest zawsze statyczne, co oznacza, że słowo kluczowe this nie może być używany wewnątrz main() .

Odniesienie do elementu niestatycznego z kontekstu statycznego

Zmienne statyczne i metody nie są częścią instancji, zawsze będzie jedna kopia tej zmiennej, bez względu na to, ile obiektów utworzysz dla określonej klasy.

Na przykład możesz chcieć mieć niezmienną listę stałych, dobrym pomysłem byłoby pozostawienie jej statycznej i zainicjowanie jej tylko raz w metodzie statycznej. Zapewniłoby to znaczny wzrost wydajności, jeśli regularnie tworzysz kilka wystąpień określonej klasy.

Ponadto możesz również mieć blok statyczny w klasie. Możesz go użyć do przypisania wartości domyślnej do zmiennej statycznej. Są one wykonywane tylko raz, gdy klasa jest ładowana do pamięci.

Zmienna instancji, jak sugeruje nazwa, jest zależna od instancji określonego obiektu, żyje, aby służyć kaprysom tego obiektu. Możesz się nimi bawić podczas określonego cyklu życia obiektu.

Wszystkie pola i metody klasy używane w metodzie statycznej tej klasy muszą być statyczne lub lokalne. Jeśli spróbujesz użyć zmiennych lub metod instancji (niestatycznych), kod nie zostanie skompilowany.

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow