2009-05-27 27 views
9

Zaczynam programować w Javie.Co to jest "statyczny"?

public static void main(String[]args) 

Książka powiedział, że powinienem użyć statycznej w tym przypadku, ale nie wyraźnie powiedzieć, dlaczego powinien lub, co to znaczy.

Czy możesz to wyjaśnić?

Odpowiedz

22

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.

+0

bardzo dobre wyjaśnienie. – Zaki

+0

Dziękuję SOO Wiele za to, że słowo kluczowe statystyka świeci w mojej głowie;) – Dayan

10

proszę zobaczyć piękny opis na Wikipedia

Na przykład, zauważyć, jak w klasie Math, można powiedzieć takie rzeczy jak

Math.Abs(x); 

bez konieczności powiedzieć

Math m = new Math(); 

te są statyczne metody, ponieważ nie potrzebujesz instancji. Metody instancji to metody, które wymagają obecności instancji klasy.

2

Metoda statyczna to taka, która odnosi się do klasy, a nie do konkretnego elementu. Metoda .goExtinct() byłaby metodą całej populacji kaczek, a nie konkretnej kaczki. main jest publiczny i statyczny, ponieważ musi być zawsze dostępny i nie jest częścią żadnej konkretnej klasy.

0

W każdym zorientowanym obiektowo języku programowania, takim jak Java lub C++, tworzysz klasy, które na bardzo podstawowym poziomie są podobne do BluePrints budynku. Możesz spojrzeć na plan i określić, jak różne elementy są połączone, ale nie możesz w nim mieszkać. Tak samo jest z klasami i obiektami. Klasy są projektem i tworzysz instancję klasy, która nazywa się Obiektem. W tym samym projekcie możesz mieć wiele budynków, tak samo dla jednej klasy możesz mieć wiele obiektów. Obiekt jest instancją klasy. Każda metoda w klasie może być wywołana na obiekcie lub instancji klasy, podczas gdy do wywoływania metod statycznych nie potrzebujesz instancji, możesz bezpośrednio wywołać ClassName.method() bez tworzenia instancji klasy.

1

Zazwyczaj trzeba mieć obiekt, instancję klasy, w celu wywołania metod na to, na co najmniej dwóch powodów:

  1. To zależy od przedmiotu, który klasa implementuje metodę jest wywoływany. Na przykład, jeśli masz instancję podklasy, metoda w podklasie zostanie wywołana, mimo że kod wywołujący metodę jest taki sam.
  2. Obiekty mają zazwyczaj wewnętrzny stan (pola), do których mogą się odnosić metody. To nie działa, jeśli nie ma instancji obiektu.

tworzyć instancje obiektów poprzez wywołanie konstruktora klasy:

MyObject a = new MyObject(); 

metody statyczne są metody, które nie są dołączone do sprzeciwu instancji. Można je nazwać, po prostu nazywając klasę. Wskutek tego ich

  1. nie może być dynamicznie wysyłane do podklasy (dlatego masz warning when you try to call it on object instances, że jest po prostu mylące składnia)
  2. one cannot refer to instance state (nie-statyczne pola i inne metody non-statyczne) .

Wiele osób uważa, metody statyczne złą wzorca projektowego i radzą, aby nie je (za wyjątkiem public static void main) Spójrz w górę używać instancji singleton wzorca alternatywy.

1

W tym szczególnym przypadku główna metoda musi być statyczna ze względu na sposób, w jaki JVM rozpocznie ładowanie klas i tworzenie obiektów. Po uruchomieniu programu Java JVM będzie szukać definicji klasy, która została mu przekazana i załadować. Zatem java MyClass spowoduje załadowanie definicji klasy MyClass.

Z definicji program Java rozpocznie wykonywanie w metodzie main() klasy, która została przekazana do maszyny JVM jako klasa do załadowania na początku. W tym momencie nie utworzono żadnej instancji (obiektu) typu MyClass, dlatego główna metoda musi być statyczna, aby umożliwić rozpoczęcie wykonywania programu.

Jeśli chcesz zobaczyć, które klasy są ładowane podczas wykonywania programu Java, możesz użyć opcji wiersza polecenia -verbose: class.

0

Będą momenty, w których będziesz chciał zdefiniować członka klasy, który będzie używany niezależnie od dowolnego obiektu tej klasy. Normalnie członek klasy musi być dostępny tylko w połączeniu z obiektem swojej klasy. Możliwe jest jednak utworzenie elementu, który może być używany samodzielnie, bez odniesienia do określonej instancji. Aby utworzyć takiego członka, poprzedzaj jego deklarację słowem kluczowym static. Gdy element członkowski jest zadeklarowany jako statyczny, można uzyskać do niego dostęp przed utworzeniem jakichkolwiek obiektów jego klasy i bez odniesienia do żadnego obiektu. Możesz zadeklarować zarówno metody, jak i zmienne, które mają być statyczne. Najczęstszym przykładem statycznego elementu jest main(). main() jest zadeklarowany jako statyczny , ponieważ musi zostać wywołany, zanim jakiekolwiek obiekty istnieją. Oba typy elementów statycznych są pola statyczne i metody statyczne:

Static field: 

Pole która jest zadeklarowana ze słowem kluczowym statycznego, jak poniżej:

private static int ballCount: 

Stanowisko hasła statycznego jest zamiennie z pozycje słów kluczowych widoczności (prywatnych i publicznych, a także chronionych). W rezultacie, następujące oświadczenie działa zbyt:

static private int ballCount; 

jako konwencji, większość programistów wydają się umieścić słowa kluczowego widoczność pierwszy.

Wartość pola statycznego jest taka sama we wszystkich instancjach klasy. Innymi słowy, jeśli klasa ma statyczne pole o nazwie NazwaFirmy, wszystkie obiekty utworzone z klasy będą miały tę samą wartość dla NazwaFirmy.

Pola statyczne są tworzone i inicjalizowane po załadowaniu pierwszej klasy. Dzieje się tak, gdy zostanie odwołany do statycznego członka klasy lub gdy zostanie utworzona instancja klasy, w zależności od tego, co nastąpi wcześniej.

Static method: 

Metoda zadeklarowana za pomocą słowa kluczowego static. Podobnie jak w przypadku pól statycznych, metody statyczne są powiązane z samą klasą, a nie z żadnym określonym obiektem utworzonym z klasy. W rezultacie nie trzeba tworzyć obiektu z klasy, zanim będzie można korzystać ze statycznych metod zdefiniowanych przez klasę.

Najbardziej znaną metodą statyczną jest główna, która jest wywoływana przez środowisko wykonawcze Java w celu uruchomienia aplikacji Główna metoda musi być statyczna, co oznacza, że ​​aplikacje działają domyślnie w kontekście statycznym.

Jedną z podstawowych zasad pracy ze statycznymi metodami jest to, że nie można uzyskać dostępu do niestatycznej metody lub pola z metody statycznej, ponieważ metoda statyczna nie ma instancji klasy, która będzie używana do odwoływania się do metod instancji lub pola.