Aby być konkretnym, próbowałem tego kodu:
package hello;
public class Hello {
Clock clock = new Clock();
public static void main(String args[]) {
clock.sayTime();
}
}
Ale dał błąd
Nie można uzyskać dostępu do pola niestatycznego w metodzie statycznej main
Zmieniłem więc deklarację clock
na:
static Clock clock = new Clock();
I zadziałało. Co oznacza umieszczenie tego słowa kluczowego przed deklaracją? Co dokładnie zrobi i / lub ograniczy w zakresie tego, co można zrobić z tym obiektem?
java
static
oop
language-features
restriction
Kliknij opcję Upvote
źródło
źródło
Odpowiedzi:
static
członkowie należą do klasy zamiast określonej instancji.Oznacza to, że istnieje tylko jedna instancja
static
pola [1], nawet jeśli utworzysz milion instancji klasy lub nie utworzysz żadnej. Zostanie udostępniony przez wszystkie instancje.Ponieważ
static
metody również nie należą do określonej instancji, nie mogą odnosić się do członków instancji. W podanym przykładziemain
nie wie, do której instancjiHello
klasy (a zatem i do której instancjiClock
klasy) powinien się odnosić.static
członkowie mogą odnosić się tylko dostatic
członków. Członkowie instancji mogą oczywiście uzyskiwać dostęp dostatic
członków.Uwaga dodatkowa: Oczywiście
static
członkowie mogą uzyskać dostęp do elementów instancji poprzez odwołanie do obiektu .Przykład:
[1]: W zależności od właściwości środowiska wykonawczego może to być jeden na ClassLoader, AppDomain lub wątek, ale to nie ma sensu.
źródło
Oznacza to, że w Hello jest tylko jedna instancja „zegara”, a nie jedna na każdą oddzielną instancję klasy „Hello”, a co więcej, oznacza to, że pomiędzy wszystkimi instancjami będzie jedno wspólne odwołanie do „zegara”. klasa „Cześć”.
Więc jeśli miałbyś zrobić „nowe powitanie” w dowolnym miejscu kodu: A- w pierwszym scenariuszu (przed zmianą, bez użycia „statycznego”), tworzyłby nowy zegar za każdym razem, gdy wywoływane jest „nowe powitanie”, ale B - w drugim scenariuszu (po zmianie, używając „statycznego”), każda instancja „nowego Hello” nadal będzie współdzielić i używać początkowej i tej samej referencji „clock”, która została utworzona jako pierwsza.
O ile nie potrzebujesz „zegara” poza głównym obszarem, działałoby to równie dobrze:
źródło
main()
powinna być samodzielna.main
metody tylko dlatego, że OP. Jeśli zamiast tego była to metoda publiczna, która została wywołana z innego miejsca, a klasa Hello została utworzona instancja więcej niż raz, wówczas mogłaby utworzyć instancję Clock dla każdej instancji Hello, chyba żeclock
jest statyczna.Słowo
static
kluczowe oznacza, że coś (pole, metoda lub klasa zagnieżdżona) jest powiązane z typem, a nie z konkretną instancją typu. Na przykład, wywołuje sięMath.sin(...)
bez żadnej instancjiMath
klasy i rzeczywiście nie można utworzyć instancjiMath
klasy.Aby uzyskać więcej informacji, zobacz odpowiedni fragment samouczka Java firmy Oracle .
Dygresja
Java niestety pozwala na dostęp do elementów statycznych tak, jakby były członkami instancji, np
To sprawia, że wygląda na
sleep
metodę instancji, ale w rzeczywistości jest to metoda statyczna - zawsze uśpia bieżący wątek. Lepiej jest to wyjaśnić w kodzie wywołującym:źródło
System.out
nie podoba mi się nazwa typu.Słowo
static
kluczowe w Javie oznacza, że zmienna lub funkcja jest wspólna dla wszystkich instancji tej klasy, ponieważ należy do typu , a nie do samych obiektów.Więc jeśli masz zmienną:
private static int i = 0;
i zwiększasz ją (i++
) w jednym wystąpieniu, zmiana zostanie odzwierciedlona we wszystkich wystąpieniach.i
będzie teraz wynosić 1 we wszystkich przypadkach.Można stosować metody statyczne bez tworzenia obiektu.
źródło
Podstawowe użycie elementów statycznych ...
W ten sposób można udostępniać wartości wszystkim członkom klasy bez wysyłania instancji klasy Witaj w innej klasie. I odrobinę statyczne, nie musisz tworzyć instancji klasy.
Możesz po prostu wywoływać wartości statyczne lub metody według nazwy klasy:
źródło
Statyczny oznacza, że nie trzeba tworzyć instancji klasy, aby korzystać z metod lub zmiennych powiązanych z klasą. W twoim przykładzie możesz zadzwonić:
bezpośrednio, zamiast:
Z wnętrza metody statycznej (która należy do klasy) nie można uzyskać dostępu do żadnych elementów, które nie są statyczne, ponieważ ich wartości zależą od instancji klasy. Niestatyczny obiekt Clock, który jest członkiem instancji, miałby inną wartość / referencję dla każdej instancji klasy Hello, a zatem nie można uzyskać do niego dostępu ze statycznej części klasy.
źródło
Statyczne w Javie:
Statyczny jest modyfikatorem braku dostępu. Statyczne słowo kluczowe należy do klasy niż instancja klasy. może być użyty do dołączenia zmiennej lub metody do klasy.
Statyczne słowo kluczowe MOŻE być używane z:
metoda
Zmienna
Klasa zagnieżdżona w innej klasie
Blok inicjalizacji
NIE MOŻNA używać z:
Klasa (nie zagnieżdżona)
Konstruktor
Interfejsy
Metoda lokalna klasa wewnętrzna (różnica a klasa zagnieżdżona)
Metody klasy wewnętrznej
Zmienne instancji
Zmienne lokalne
Przykład:
Wyobraź sobie następujący przykład, który ma zmienną instancji o nazwie count, która jest zwiększana w konstruktorze:
Wynik:
Ponieważ zmienna instancji otrzymuje pamięć w momencie tworzenia obiektu, każdy obiekt będzie miał kopię zmiennej instancji, jeśli zostanie zwiększona, nie będzie odzwierciedlała innych obiektów.
Teraz, jeśli zmienimy liczbę zmiennych instancji na statyczną, wówczas program wygeneruje inne dane wyjściowe:
Wynik:
W takim przypadku zmienna statyczna pobierze pamięć tylko raz, jeśli dowolny obiekt zmieni wartość zmiennej statycznej, zachowa swoją wartość.
Statyczne z ostatecznym:
Zmienna globalna zadeklarowana jako ostateczna i statyczna pozostaje niezmieniona dla całego wykonania. Ponieważ elementy statyczne są przechowywane w pamięci klas i są ładowane tylko raz podczas całego wykonania. Są wspólne dla wszystkich obiektów klasy. Jeśli zadeklarujesz zmienne statyczne jako końcowe, żaden z obiektów nie będzie mógł zmienić ich wartości, ponieważ jest ona ostateczna. Dlatego zmienne zadeklarowane jako ostateczne i statyczne są czasami nazywane stałymi. Wszystkie pola interfejsów są nazywane stałymi, ponieważ domyślnie są one ostateczne i statyczne.
Zasób obrazu: Final Static
źródło
Aby dodać do istniejących odpowiedzi, pozwól mi spróbować ze zdjęciem:
Do WSZYSTKICH kont oszczędnościowych stosowana jest stopa procentowa w wysokości 2%. Dlatego jest statyczny .
Równowaga powinna być indywidualna , więc to nie statyczne.
źródło
W tej dyskusji dotychczas ignorowano uwagi dotyczące modułu ładującego klasy. Ściśle mówiąc, pola statyczne Java są wspólne dla wszystkich instancji klasy dla danego modułu ładującego klasy .
źródło
Pole może być przypisane do klasy lub instancji klasy. Domyślnie pola są zmiennymi instancji. Użycie
static
pola staje się zmienną klasową, a więc istnieje jedna i tylko jednaclock
. Jeśli dokonasz zmian w jednym miejscu, będzie to widoczne wszędzie. Zmienne instancji są zmieniane niezależnie od siebie.źródło
Słowo kluczowe
static
służy do oznaczenia pola lub metody jako należących do samej klasy, a nie do instancji. Używając kodu, jeśli obiektClock
jest statyczny, wszystkie instancjeHello
klasy będą współużytkować tenClock
element danych (pole). Jeśli uczynisz go niestatycznym, każda pojedyncza instancjaHello
może mieć unikalnyClock
pole.Problem polega na tym, że dodałeś główną metodę do swojej klasy
Hello
, abyś mógł uruchomić kod. Problem polega na tym, że główna metoda jest statyczna i jako taka nie może odnosić się do niestatystycznych pól lub metod w niej zawartych. Możesz rozwiązać ten problem na dwa sposoby:Hello
klasy w sposób statyczny, aby można było do nich odwoływać się w metodzie głównej . To naprawdę nie jest dobra rzecz (lub niewłaściwy powód, dla którego pole i / lub metoda stają się statyczne)Hello
klasy w głównej metodzie i uzyskaj dostęp do wszystkich jej pól i metod tak, jak powinny.Dla Ciebie oznacza to następującą zmianę w kodzie:
źródło
W Javie
static
słowo kluczowe można po prostu uznać za wskazujące:Jeśli myślisz o
static
tym w ten sposób, łatwiej jest zrozumieć jego zastosowanie w różnych kontekstach, w których się pojawia:static
Pole jest dziedziną, która należy do klasy, a nie do konkretnej instancjistatic
Metoda jest metodą, która nie ma pojęciathis
; jest zdefiniowany w klasie i nie wie o żadnym konkretnym wystąpieniu tej klasy, chyba że zostanie do niej przekazane odwołaniestatic
Klasy element jest zagnieżdżony klasy bez pojęciem lub wiedzy na przykład tej klasy okalającego (chyba, że odniesienie do otaczającej przykład klasy jest przekazywane do niego)źródło
Statyczny powoduje, że element zegarowy jest członkiem klasy zamiast członkiem instancji. Bez statycznego słowa kluczowego należy utworzyć instancję klasy Hello (która ma zmienną składową zegara) - np
źródło
metody statyczne nie używają żadnych zmiennych instancji klasy, w której są zdefiniowane. Bardzo dobre wyjaśnienie różnicy można znaleźć na tej stronie
źródło
Polubiłem metody statyczne (tylko, jeśli to możliwe) w klasach „pomocników”.
Klasa wywołująca nie musi tworzyć innej zmiennej członka (instancji) klasy pomocniczej. Po prostu wywołujesz metody klasy pomocniczej. Ulepszono także klasę pomocnika, ponieważ nie potrzebujesz już konstruktora i nie potrzebujesz zmiennych członka (instancji).
Są prawdopodobnie inne zalety.
źródło
źródło
Może również myśleć o elementach statycznych, które nie mają wskaźnika „ten”. Są one wspólne dla wszystkich instancji.
źródło
Zrozumienie pojęć statycznych
Druga klasa
źródło
main()
jest metodą statyczną, która ma dwa podstawowe ograniczenia:this()
isuper()
nie można go używać w kontekście statycznym.źródło
Zmienne statyczne Można uzyskać dostęp tylko w metodach statycznych, więc kiedy zadeklarujemy zmienne statyczne, te metody pobierające i ustawiające będą metodami statycznymi
metody statyczne to poziom klasy, do którego możemy uzyskać dostęp za pomocą nazwy klasy
Poniżej przedstawiono przykład dla zmiennych pobierających i ustawiających zmienne statyczne:
źródło
Zadano tutaj pytanie dotyczące wyboru słowa „statyczny” dla tej koncepcji. Zadano to pytanie w odpowiedzi na to pytanie, ale nie sądzę, aby etymologia została wyraźnie uwzględniona. Więc...
Jest to spowodowane ponownym użyciem słowa kluczowego, zaczynając od C.
Rozważ deklaracje danych w C (w ciele funkcji):
Zmienna foo jest tworzona na stosie, gdy funkcja jest wprowadzana (i niszczona, gdy funkcja się kończy). Natomiast pasek jest zawsze obecny, więc jest „statyczny” w znaczeniu zwykłego angielskiego - nigdzie się nie wybiera.
Java i podobne języki mają tę samą koncepcję danych. Dane można albo przydzielić na instancję klasy (na obiekt), albo raz dla całej klasy. Ponieważ Java chce mieć znaną składnię dla programistów C / C ++, właściwe jest tutaj słowo kluczowe „static”.
Wreszcie dochodzimy do metod.
Istnieje, pod względem koncepcyjnym, instancja foo () dla każdej instancji klasy C. Istnieje tylko jedna instancja bar () dla całej klasy C. Jest to równoległe z przypadkiem, który omawialiśmy dla danych, i dlatego używa „static „jest znowu rozsądnym wyborem, zwłaszcza jeśli nie chcesz dodawać do swojego języka bardziej zastrzeżonych słów kluczowych.
źródło