Java Language
Używanie statycznego słowa kluczowego
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
}
}