Pojęcie static
ma związek z tym, czy coś jest częścią klasy lub obiektu (instancją).
W przypadku metody main
która została zgłoszona jako static
, to mówi, że metoda main
jest metoda klasy - metoda, która jest częścią klasy, nie jest częścią obiektu. Oznacza to, że inna klasa może wywołać metodę klasy innej klasy, odwołując się do ClassName.method
. Przykładowo, opierając się na sposób uruchomienie MyClass
to osiągnąć przez:
MyClass.main(new String[]{"parameter1", "parameter2"});
Z drugiej strony, metody lub terenie, bez modyfikatora static
oznacza, że jest częścią przedmiotu (lub zwany także „przykład”) i nie jest częścią klasy. Odnosi się ono pod nazwą konkretnego obiektu, do którego metoda lub pola należy, zamiast nazwy klasy:
MyClass c1 = new MyClass();
c1.getInfo() // "getInfo" is an instance method of the object "c1"
Jak każda instancja może mieć różne wartości, wartości metody lub pola z ta sama nazwa w różnych obiektach niekoniecznie musi być taka sama:
MyClass c1 = getAnotherInstance();
MyClass c2 = getAnotherInstance();
c1.value // The field "value" for "c1" contains 10.
c2.value // The field "value" for "c2" contains 12.
// Because "c1" and "c2" are different instances, and
// "value" is an instance field, they can contain different
// values.
Łączenie dwóch pojęć zmiennych instancji i klas. Powiedzmy, że możemy zadeklarować nową klasę, która zawiera zarówno instancji i zmiennych klasy i metody:
class AnotherClass {
private int instanceVariable;
private static int classVariable = 42;
public int getInstanceVariable() {
return instanceVariable;
}
public static int getClassVariable() {
return classVariable;
}
public AnotherClass(int i) {
instanceVariable = i;
}
}
Powyższa klasa ma instancję zmiennej instanceVariable
i klasę zmiennej classVariable
który jest zadeklarowany z static
modyfikatora. Podobnie istnieje instancja i metoda klasy do pobierania wartości.
Konstruktor dla instancji przyjmuje wartość, aby przypisać do zmiennej instancji jako argument. Zmienna klasy zostaje zainicjowana jako 42
i nigdy się nie zmienia.
Niech faktycznie korzysta powyższą klasę i zobaczyć, co się dzieje: Metody
AnotherClass ac1 = new AnotherClass(10);
ac1.getInstanceVariable(); // Returns "10"
AnotherClass.getClassVariable(); // Returns "42"
Wskazówka różne sposoby klasy i instancji są nazywane. Sposób, w jaki odnoszą się one do klasy pod nazwą AnotherClass
, lub instancja o nazwie ac1
. Chodźmy dalej i zobaczyć behawioralne różnice metod:
AnotherClass ac1 = new AnotherClass(10);
AnotherClass ac2 = new AnotherClass(20);
ac1.getInstanceVariable(); // Returns "10"
AnotherClass.getClassVariable(); // Returns "42"
ac2.getInstanceVariable(); // Returns "20"
AnotherClass.getClassVariable(); // Returns "42"
Jak widać, zmienna instancji jest jeden, który jest w posiadaniu przedmiotu (lub „wystąpienie”), dlatego wyjątkowy w tym konkretnym przypadku, który w tym przykładzie są to obiekty wymienione przez ac1
i ac2
.
Z drugiej strony zmienna klasy jest unikalna tylko dla całej klasy. Aby dostać się do tego punktu po drugiej nawet lepiej, dodajmy nową metodę do AnotherClass
:
public int getClassVariableFromInstance() {
return classVariable;
}
Następnie uruchom następujące:
AnotherClass ac1 = new AnotherClass(10);
AnotherClass ac2 = new AnotherClass(20);
ac1.getInstanceVariable(); // Returns "10"
ac1.getClassVariableFromInstance(); // Returns "42"
ac2.getInstanceVariable(); // Returns "20"
ac2.getClassVariableFromInstance(); // Returns "42"
Chociaż getClassVariableFromInstance
jest metoda instancji, jak widać, będąc wywoływane przez odwołanie do instancji ac1
i ac2
, zwracają tę samą wartość, 42
. Dzieje się tak dlatego, że w metodach obu instancji odnoszą się one do metody klasy classVariable
, która jest unikalna dla klasy, a nie dla instancji - istnieje tylko jedna kopia classVariable
dla klasy AnotherClass
.
Mam nadzieję, że niektóre z nich wyjaśniają, do czego służy modyfikator static
.
The Java Tutorials od Sun ma sekcję o nazwie Understanding Instance and Class Members, która również przechodzi do dwóch typów zmiennych i metod.
bardzo dobre wyjaśnienie. – Zaki
Dziękuję SOO Wiele za to, że słowo kluczowe statystyka świeci w mojej głowie;) – Dayan