Jeśli zmienna jest zadeklarowana jako public static varName;
, mogę uzyskać do niej dostęp z dowolnego miejsca, jako ClassName.varName
. Mam również świadomość, że statyczne elementy członkowskie są współużytkowane przez wszystkie wystąpienia klasy i nie są ponownie przydzielane w każdej instancji.
Czy deklarowanie zmiennej private static varName;
różni się od deklarowania zmiennej private varName;
?
W obu przypadkach nie można uzyskać do niego dostępu jako ClassName.varName
lub ClassInstance.varName
z żadnej innej klasy.
Czy zadeklarowanie zmiennej jako statycznej nadaje jej inne specjalne właściwości?
Odpowiedzi:
Oczywiście można uzyskać do niego dostęp jako
ClassName.var_name
, ale tylko z wnętrza klasy, w której jest zdefiniowany - to dlatego, że jest zdefiniowany jakoprivate
.public static
lubprivate static
zmienne są często używane jako stałe. Na przykład, wiele osób nie lubi „na stałe zakodować” stałych w swoim kodzie; lubią tworzyć zmiennąpublic static
lubprivate static
o znaczącej nazwie i używać jej w swoim kodzie, co powinno uczynić kod bardziej czytelnym. (Powinieneś także zrobić takie stałefinal
).Na przykład:
Czy to zrobisz,
public
czyprivate
zależy od tego, czy chcesz, aby zmienne były widoczne poza klasą, czy nie.źródło
ClassName.var_nam
? Gdzie mogę uzyskać do niego bezpośredni dostęp:var_nam
w klasieZmienne statyczne mają jedną wartość dla wszystkich instancji klasy.
Gdybyś miał zrobić coś takiego:
a potem chciałeś zmienić swoje imię, to dobrze, moje imię pozostaje takie samo. Gdybyś jednak chciał to zmienić, aby mieć 17 oczu, to każdy na świecie również miałby 17 oczu.
źródło
Prywatne zmienne statyczne są użyteczne w taki sam sposób, jak prywatne zmienne instancji są użyteczne: przechowują stan, do którego można uzyskać dostęp tylko przez kod w tej samej klasie. Dostępność (prywatna / publiczna / itp.) I instancja / statyczny charakter zmiennej to pojęcia całkowicie ortogonalne.
Unikałbym myślenia o zmiennych statycznych jako o wspólnych dla „wszystkich instancji” klasy - to sugeruje, że musi istnieć przynajmniej jedna instancja, aby stan był obecny. Nie - zmienna statyczna jest skojarzona z samym typem zamiast z jakimikolwiek wystąpieniami typu.
Więc za każdym razem, gdy chcesz mieć jakiś stan, który jest powiązany z typem, a nie z jakąś konkretną instancją, i chcesz zachować ten stan jako prywatny (na przykład umożliwiając kontrolowany dostęp za pośrednictwem właściwości), sensowne jest posiadanie prywatnej zmiennej statycznej.
Na marginesie, zdecydowanie zalecałbym, aby jedynym typem zmiennych, które upubliczniasz (lub nawet nieprywatnymi), były stałe - statyczne zmienne końcowe niezmiennych typów. Wszystko inne powinno być prywatne ze względu na oddzielenie API i implementację (między innymi).
źródło
Cóż, masz rację, publiczne zmienne statyczne są używane bez tworzenia instancji klasy, ale prywatne zmienne statyczne nie. Główna różnica między nimi a miejscem, w którym używam prywatnych zmiennych statycznych, polega na tym, że trzeba użyć zmiennej w funkcji statycznej. W przypadku funkcji statycznych możesz używać tylko zmiennych statycznych, więc ustawiasz je jako prywatne, aby nie miały do nich dostępu z innych klas. To jedyny przypadek, w którym używam prywatnego statycznego.
Oto przykład:
źródło
Person
, prawdopodobnie byłby to błąd, ponieważ nie można mieć wielu osób w różnym wieku (jeśli byłby to zamierzony przypadek użycia).Cóż,
private static
zmienne mogą służyć do udostępniania danych między instancjami tej klasy. Chociaż masz rację, nie możemy uzyskać dostępu doprivate static
zmiennych za pomocą konstrukcji takich jakClassName.member
lub,ClassInstance.member
ale element członkowski będzie zawsze widoczny z metod tej klasy lub instancji tej klasy. W efekcie instancje tej klasy zawsze będą mogły odwoływać się do elementu członkowskiego.źródło
Jaki jest pożytek z prywatnej zmiennej klasy statycznej?
Załóżmy, że masz książkę w bibliotece Class. Za każdym razem, gdy tworzysz nową książkę, chcesz przypisać jej unikalny identyfikator. Jednym ze sposobów jest po prostu rozpoczęcie od 0 i zwiększenie numeru identyfikacyjnego. Ale skąd wszystkie inne książki znają ostatnio utworzony numer identyfikacyjny? Proste, zapisz to jako zmienną statyczną. Czy klienci muszą wiedzieć, że rzeczywisty wewnętrzny numer identyfikacyjny dotyczy każdej książki? Nie. Ta informacja jest prywatna.
To wymyślony przykład, ale jestem pewien, że możesz łatwo wymyślić przypadki, w których chcesz, aby wszystkie instancje klas miały dostęp do wspólnych informacji, które powinny być poufne dla wszystkich innych. A nawet jeśli nie możesz, dobrą praktyką programistyczną jest uczynienie rzeczy tak prywatnymi, jak to tylko możliwe. Co by się stało, gdybyś przypadkowo upublicznił to pole numBooks, mimo że użytkownicy Book nie powinni nic z nim robić. Wtedy ktoś mógłby zmienić liczbę książek bez tworzenia nowej książki.
Bardzo podstępne!
źródło
Tak, oba są różne. Pierwsza jest nazywana,
class variable
ponieważ ma jedną wartość dla tego,class
podczas gdy druga jest nazywana,instance variable
ponieważ może mieć różne wartości dla różnychinstances(Objects)
. Pierwsza jest tworzona tylko raz w jvm, a druga jest tworzona raz na instancję, tzn. Jeśli masz 10 instancji, będziesz mieć 10 różnychprivate varName;
w jvm.Tak, zmienne statyczne mają inne właściwości niż zwykłe zmienne instancji. Wspomniałem już o kilku i zobaczmy kilka tutaj:
class variables
(zmienne instancji, które są zadeklarowane jako statyczne) można uzyskać bezpośrednio za pomocą nazwy klasy, takiej jakClassName.varName
. Każdy obiekt tej klasy może uzyskiwać dostęp i modyfikować swoją wartość, w przeciwieństwie do zmiennych instancji, do których dostęp mają tylko odpowiednie obiekty. Zmienne klas mogą być używane w metodach statycznych.Logicznie rzecz biorąc,
private static variable
nie różni się od tegopublic static variable
, że pierwszy daje większą kontrolę. IMO można dosłownie zastąpićpublic static variable
zaprivate static variable
pomocą metodpublic static
pobierających i ustawiających.Jednym z szeroko używanych obszarów
private static variable
jest implementacja prostegoSingleton
wzorca, w którym będziesz mieć tylko jedną instancję tej klasy na całym świecie. Tutajstatic
identyfikator odgrywa kluczową rolę, aby to pojedynczy przypadek jest przystosowany światem zewnętrznym (metody Oczywiście publicznej pochłaniacza statycznych odgrywa również główną rolę).źródło
Prywatne słowo kluczowe będzie używane do dostępu do zmiennej w klasie i zachowania statyczności w tym sensie, że możemy uzyskać dostęp do zmiennej również w metodzie statycznej, ale zmienna referencyjna nie ma dostępu w metodzie statycznej.
źródło
Inna perspektywa:
źródło
Gdy w metodzie statycznej używasz zmiennej, na przykład zmienna musi być statyczna:
źródło
Zmienne statyczne to te zmienne, które są wspólne dla wszystkich instancji klasy .. jeśli jedna instancja ją zmieni .. wtedy wartość zmiennej statycznej zostanie zaktualizowana dla wszystkich innych instancji
źródło
Dla niektórych ludzi ma to większy sens, jeśli widzą to w kilku różnych językach, więc napisałem przykład w Javie i PHP na mojej stronie, gdzie wyjaśniam niektóre z tych modyfikatorów. Być może myślisz o tym niepoprawnie.
Powinieneś spojrzeć na moje przykłady, jeśli nie ma to sensu poniżej. Przejdź tutaj http://www.siteconsortium.com/h/D0000D.php
Najważniejsze jest jednak to, że jest dokładnie tym, o czym mówi. Jest to statyczna zmienna składowa, która jest prywatna. Na przykład, jeśli chcesz utworzyć obiekt Singleton, dlaczego miałbyś chcieć ustawić zmienną SingletonExample.instance jako publiczną. Jeśli zrobiłeś, osoba korzystająca z klasy mogłaby łatwo nadpisać wartość.
To wszystko, czym jest.
źródło
Jeśli używasz prywatnych zmiennych statycznych w swojej klasie, statyczne wewnętrzne klasy w Twojej klasie mogą dotrzeć do Twoich zmiennych. Jest to bardzo dobre dla bezpieczeństwa kontekstu.
źródło
Jeśli zmienna jest zdefiniowana jako public static, można uzyskać do niej dostęp poprzez nazwę klasy z dowolnej klasy.
Zwykle funkcje są definiowane jako public static, do których można uzyskać dostęp, po prostu wywołując nazwę klasy implementującej.
Bardzo dobrym tego przykładem jest
sleep()
metoda z klasy ThreadJeśli zmienna jest zdefiniowana jako prywatna statyczna, dostęp do niej można uzyskać tylko w ramach tej klasy, więc nazwa klasy nie jest potrzebna lub nadal możesz używać nazwy klasy (do Ciebie). Różnica między prywatną nazwą zmiennej a prywatną statyczną nazwa_zmiennej polega na tym, że do prywatnych zmiennych statycznych można uzyskać dostęp tylko za pomocą statycznych metod klasy, natomiast do zmiennych prywatnych można uzyskać dostęp za pomocą dowolnej metody tej klasy (z wyjątkiem metod statycznych)
Bardzo dobrym przykładem jest definiowanie połączeń z bazą danych lub stałych, które wymagają zadeklarowania zmiennej jako prywatnej statycznej.
Innym typowym przykładem jest
źródło
Jestem nowy w Javie, ale jednym ze sposobów, w jaki używam zmiennych statycznych, jak zakładam, jest wiele osób, jest liczenie liczby wystąpień klasy. na przykład:
Następnie możesz sysout:
Możesz także uzyskać dostęp do numCompanies z każdej instancji klasy (czego nie do końca rozumiem), ale nie będzie to „statyczne”. Nie mam pojęcia, czy to najlepsza praktyka, czy nie, ale dla mnie ma to sens.
źródło
*) Jeśli zmienna jest zadeklarowana jako prywatna, to nie jest widoczna poza klasą. Nazywa się to ukrywaniem danych.
*) Jeśli zmienna jest zadeklarowana jako statyczna, wówczas wartość zmiennej jest taka sama dla wszystkich instancji i nie ma potrzeby tworzenia obiektu do wywołania tej zmiennej. Możemy wywołać tę zmienną po prostu
classname.variablename;
źródło
prywatna zmienna statyczna będzie również udostępniana w podklasie. Jeśli zmieniłeś jedną podklasę, a druga podklasa otrzyma zmienioną wartość, w takim przypadku może nie być to, czego oczekujesz.
źródło
ThreadLocal
zmienne są zwykle implementowane jakoprivate static
. W ten sposób nie są one związane z klasą, a każdy wątek ma swoje własne odniesienie do własnego obiektu „ThreadLocal”.źródło
W poniższym przykładzie
eye
jest zmieniana przez PersonB, aleleg
pozostaje taka sama. Dzieje się tak, ponieważ zmienna prywatna tworzy kopię siebie do metody, tak że jej oryginalna wartość pozostaje taka sama; podczas gdy prywatna wartość statyczna ma tylko jedną kopię dla wszystkich metod do udostępnienia, więc edycja jej wartości spowoduje zmianę jej oryginalnej wartości.}
źródło