Jestem bardzo nowy w Javie i chcę zrozumieć różnicę między zmiennymi klas i zmiennymi instancji.
Na przykład:
class Bicycle {
static int cadence = 0;
int speed = 0;
int gear = 1;
}
W jaki sposób zmienne instancji i zmienne klas różnią się od siebie? Które zmienne tutaj są zmiennymi klasowymi, a które zmiennymi instancji? Jak to wpływa na zakres?
Odpowiedzi:
Obaj są członkami zmienne, co oznacza, że obie są związane z klasą. Oczywiście są między nimi różnice:
Zmienne instancji:
Te zmienne należą do instancji klasy , a więc obiektu. I każda instancja tej klasy (obiektu) ma własną kopię tej zmiennej. Zmiany wprowadzone w zmiennej nie odzwierciedlają się w innych instancjach tej klasy.
Zmienne klasowe:
Są one również znane jako statyczne zmienne składowe i istnieje tylko jedna kopia tej zmiennej, która jest współdzielona ze wszystkimi instancjami tej klasy. Jeśli zmiany zostaną wprowadzone w tej zmiennej, wszystkie inne wystąpienia zobaczą wpływ zmian.
Pełny przykład:
Dane wyjściowe będą:
Teraz zmień zmienną instancji na zmienną klasy, ustawiając ją na statyczną:
Użyłem metod niestatycznych, aby uzyskać i ustawić wartość,
Barcode
aby móc wywoływać ją z obiektu, a nie z klasy. Dane wyjściowe będą następujące:źródło
To wyjaśniono tutaj (z przykładu
Bicycle
klasie klasy zmiennejnumberOfBicycles
i instancji zmiennychcadence
,speed
,gear
iid
)Zmienna klasy (zadeklarowana
static
) to lokalizacja wspólna dla wszystkich instancji.W tym przykładzie
numberOfBicycles
jest zmienną klasową (ponieważ jest zadeklarowanastatic
). Jest tylko jedna taka zmienna (tj. Lokalizacja) wspólna dla wszystkich instancji i dla klasy. Więc jeśli zmodyfikujesznumberOfBicycles
jedną metodą, inne metody zobaczą nową wartość (nawet dla różnychBicycle
obiektów)Natomiast
gear
&id
są zmiennymi instancji (ponieważ ich deklaracja nie mastatic
modyfikatora). KażdyBicycle
przedmiot ma swój własny. Jeśli zmodyfikujeszgear
dlaBicycle
a , a b jest inną instancją, modyfikacjaa.gear
nie ma wpływu nab.gear
Każdy obiekt Java jest odrębną strefą pamięci z pewnymi metadanymi (np. Odniesieniem do swojej klasy) i własnymi zmiennymi instancji (być może odziedziczonymi z nadklasy). Ale zmienne klasy są wspólne dla klasy i wspólne dla wszystkich instancji.
Zobacz także Wikipedie zmienne dotyczące obiektów (informatyka) i instancji .
źródło
Zmienna wystąpienia:
Zmienna instancji ma osobną wartość dla każdej instancji klasy.
Zmienna klasy:
I najważniejsza zmienna klasowa utrzymuje jedną wspólną wartość dla wszystkich instancji klasy, nawet jeśli nie istnieje żaden obiekt klasy.
Krótka różnica między zmienną klasy a zmienną instancji:
źródło
Różnica pomiędzy
class variables
iinstance
zmienne, to po prostu kwestiawho knows what?
.instance variable
Jest jedynym znanym (= związany ) z tym konkretny przykład - stąd jego nazwa.Definicja klasy przypomina plan budowy konkretnych obiektów. Być może ten punkt nieco Cię myli . Ale pisząc to w ten sposób, każda zmienna byłaby przypisana do konkretnego obiektu: np. Każda osoba ma swoje imię
Z
class variable
drugiej strony - jak sama nazwa wskazuje - jest znana każdemu członkowi klasy; lub technicznie: jest znany / związany na poziomie klasy . Typowym przykładem jest licznik liczby obiektów, które utworzyłeś - chociaż jest to bardzo problematyczny przykład; ale to nie ma znaczenia na tym wczesnym etapie.numberOfPersons
jest zadeklarowanestatic
jako słowo kluczowe do rozróżnienia międzyclass variables
iinstance variabes
. Zmienna jest zadeklarowana tak jak inne w definicji klasy. Alestatic
słowo kluczowe sygnalizuje, że jest inaczej.firstName
,lastName
są zmiennymi instancji i są powiązane z tą konkretną instancjąnumberOfPersons
jest powiązany z klasą, aby każda instancja mogła uzyskać dostęp do tej zmiennej.tl; dr
Miejscem definiowania zmiennych jest definicja klasy.
Zmienne klasy są znane na poziomie klasy / powiązane z poziomem klasy, tj. Każda konkretna instancja ma do niego dostęp. Aby zdefiniować zmienną klasową, użyj słowa kluczowego
static
.Zmienne instancji są znane tylko na poziomie instancji. Zdefiniujesz je bez
static
słowa kluczowego.Dalsza dokumentacja dla Java jest tutaj
źródło