Dlaczego nie możesz zadeklarować klasy jako statycznej w Javie?
java
static-class
Mariselvam
źródło
źródło
static
?static
klasy jakoabstract final
, tzn. Nie można ich tworzyć i nie można przedłużać. Oznacza to, że mogą zawierać tylko elementy statyczne, co jest przydatne w przypadku klas zawierających tylko metody pomocnicze.Odpowiedzi:
Tylko zagnieżdżone klasy mogą być statyczne. W ten sposób możesz użyć zagnieżdżonej klasy bez instancji klasy zewnętrznej.
Źródła:
Na ten sam temat:
źródło
Klasy najwyższego poziomu są domyślnie statyczne. Klasy wewnętrzne są domyślnie niestatyczne. Możesz zmienić domyślne dla klas wewnętrznych, jawnie zaznaczając je jako statyczne. Klasy najwyższego poziomu, ze względu na to, że są najwyższego poziomu, nie mogą mieć niestatycznej semantyki, ponieważ nie ma klasy nadrzędnej, do której można by się odwoływać. Dlatego nie ma możliwości zmiany wartości domyślnej dla klas najwyższego poziomu.
źródło
static
słowu kluczowemu klasy najwyższego poziomu na oznaczenie i wymuszenie, że może on zawierać tylko elementy statyczne, a nie być tworzone; mogło to jednak pomylić ludzi, ponieważstatic
ma to inne znaczenie dla klas zagnieżdżonych.Spóźniam się więc na przyjęcie, ale oto moje dwa centy - filozoficznie uzupełniające odpowiedź Colina Heberta.
Na wysokim poziomie twoje pytanie dotyczy różnicy między obiektami i typami. Chociaż istnieje wiele samochodów (obiektów), istnieje tylko jedna klasa samochodów (typ). Deklaracja czegoś jako statycznego oznacza, że operujesz w przestrzeni „typowej”. Tam jest tylko jeden. Słowo kluczowe klasy najwyższego poziomu już definiuje typ w przestrzeni „type”. W rezultacie „publiczny samochód klasy statycznej” jest zbędny.
źródło
Klasa z prywatnym konstruktorem jest statyczna.
Zadeklaruj swoją klasę w ten sposób:
i możesz używać bez inicjalizacji:
źródło
static class
deklaracji w języku C #), kompilator nawet nie pozwoli kodowi deklarować zmiennych tego typu, ani nie użyje go jako parametru typu ogólnego. Sam brak dostępnych konstruktorów w klasie, które w innym przypadku byłyby tworzone lub dziedziczone, nie wykluczałby deklaracji zmiennych tego typu ani ich zastosowania jako parametru typu ogólnego.Pewnie, że mogą, ale tylko
wewnętrzneklasy zagnieżdżone. Oznacza to, że instancje zagnieżdżonej klasy nie wymagają obejmującej instancji klasy zewnętrznej.Ale w przypadku klas najwyższego poziomu projektanci języków nie mogli wymyślić nic użytecznego ze słowem kluczowym, więc jest to niedozwolone.
źródło
static
, czasem warto mieć taką możliwość. Na przykład klasa zawierająca tylko statyczne metody pomocnicze nie ma sensu tworzyć instancji, ale język Java nie powstrzymuje cię przed zrobieniem tego. Możesz sprawić, by klasa nie była możliwa do utworzenia (i praktycznie „statyczna”) z innymi klasami, deklarując domyślny konstruktorprivate
, który zabrania tworzenia instancji, ponieważ żaden konstruktor nie jest widoczny.Możesz utworzyć klasę narzędzia (w której nie można utworzyć instancji), deklarując typ wyliczenia bez instancji. tzn. w szczególności deklarujesz, że nie ma żadnych instancji.
źródło
... można go uznać za statyczny - pod warunkiem, że jest klasą członkowską.
Z JLS:
i tu:
Statyczne słowo kluczowe nie miałoby sensu dla klasy najwyższego poziomu, tylko dlatego, że klasa najwyższego poziomu nie ma typu otaczającego.
źródło
Inner
?Nested
byłby mniej mylący wybór.Jak wyjaśniono powyżej, klasa nie może być statyczna, chyba że jest członkiem innej klasy.
Jeśli chcesz zaprojektować klasę „której nie może być wiele instancji”, możesz przyjrzeć się wzorowi projektowemu „Singleton”.
Informacje dla początkujących Singletona tutaj .
Zastrzeżenie:
źródło
Oprócz tego, jak Java definiuje statyczne klasy wewnętrzne, istnieje jeszcze inna definicja klas statycznych w świecie C # [1] . Klasa statyczna to taka, która ma wyłącznie metody statyczne (funkcje) i ma na celu wsparcie programowania proceduralnego. Takie klasy nie są tak naprawdę klasami, ponieważ użytkownik klasy jest zainteresowany jedynie funkcjami pomocniczymi, a nie tworzeniem instancji klasy. Podczas gdy klasy statyczne są obsługiwane w języku C #, nie ma takiej bezpośredniej obsługi w Javie. Możesz jednak użyć wyliczeń, aby naśladować klasy statyczne w języku C # w Javie, dzięki czemu użytkownik nigdy nie będzie mógł tworzyć wystąpień danej klasy (nawet używając odbicia) [2] :
źródło
Wszystko, co kodujemy w Javie, należy do klasy. Ilekroć uruchamiamy klasę, JVM tworzy obiekt. JVM może tworzyć wiele obiektów, z definicji Statyczny oznacza, że masz ten sam zestaw kopii dla wszystkich obiektów.
Tak więc, jeśli Java pozwoliłaby, aby najwyższa klasa była statyczna za każdym razem, gdy uruchamiasz program, tworzy obiekt i przesuwa się do tej samej lokalizacji pamięci.
Jeśli po prostu wymieniasz obiekt za każdym razem, gdy go uruchamiasz, jaki jest sens jego tworzenia?
Dlatego właśnie Java pozbyła się statyczności dla klasy najwyższego poziomu.
Mogą istnieć bardziej konkretne powody, ale ma to dla mnie logiczny sens.
źródło
Jedynymi klasami, które mogą być statyczne, są klasy wewnętrzne. Poniższy kod działa dobrze:
Istotą statycznych klas wewnętrznych jest to, że nie mają one odniesienia do obiektu klasy zewnętrznej.
źródło
Myślę, że jest to możliwe tak łatwo, jak wypicie szklanki kawy !. Spójrz na to. Nie używamy statycznego słowa kluczowego jawnie podczas definiowania klasy.
Czy to nie jest definicja klasy statycznej? Po prostu używamy funkcji powiązanej tylko z klasą. Uważaj, aby w tym przypadku użyć innej klasy w tym zagnieżdżonym. Spójrz na to:
źródło
new StaticClass()
a to nie ma większego sensu. W przypadku prywatnego konstruktora nie zezwalałby na jego wystąpienia.W
PlatformUI
Eclipse można spojrzeć na klasę z metodami statycznymi i prywatnym konstruktorem, która sama jest ostateczna.źródło
jeśli korzyść z zastosowania klasy statycznej nie polegała na utworzeniu instancji obiektu i użyciu metody, wystarczy zadeklarować klasę jako publiczną, a tę metodę jako statyczną.
źródło