1. Metody statyczne
Oprócz zmiennych statycznych klasy mogą również zawierać metody statyczne.
Zwykłe metody są powiązane z obiektami (instancjami) klasy i mogą uzyskiwać dostęp do zwykłych zmiennych klasy (jak również zmiennych statycznych i metod ). Metody statyczne są powiązane z obiektem klasy statycznej i mają dostęp tylko do zmiennych statycznych i/lub innych metod klasy statycznej.
Aby wywołać zwykłą metodę na klasie, należy najpierw utworzyć obiekt tej klasy , a dopiero potem wywołać metodę na obiekcie. Nie można wywołać zwykłej metody nie na obiekcie, ale na klasie.
Przykład:
Nie możesz wywołać metody niestatycznej w klasie! |
---|
|
A żeby wywołać metodę statyczną wystarczy, że statyczny obiekt klasy po prostu istnieje (który zawsze istnieje po załadowaniu klasy do pamięci). Dlatego metoda main() jest statyczna. Jest powiązany z obiektem klasy statycznej, nie trzeba tworzyć żadnych obiektów, aby go wywołać.
Aby zadeklarować metodę jako statyczną, poprzedź nagłówek metody słowem kluczowym static. Ogólny widok tego projektu jest następujący:
static тип Nazwa(параметры)
{
kod метода
}
Przykłady:
Kod | Notatka |
---|---|
|
Metoda main jest wywoływana przez maszynę Java za pomocą polecenia w postaci: Solution.main() ; Metoda statyczna test() jest wywoływana w metodzie statycznej main() . |
Aby wywołać metodę statyczną z innej klasy, musisz podać nazwę klasy przed nazwą metody statycznej. Ogólny widok tego projektu jest następujący:
Тип Nazwa = NazwaКласса.nazwa metody(параметры)
Przykłady:
Kod | Metoda statyczna |
---|---|
|
|
|
|
|
|
2. Metody statyczne a zwykłe
Jaka jest różnica między metodami statycznymi a zwykłymi?
Zwykła metoda ma powiązanie z obiektem - instancją klasy, podczas gdy metoda statyczna nie ma takiego powiązania. Zwykła metoda może uzyskać dostęp do zmiennych w swojej instancji klasy, metoda statyczna nie może: po prostu nie ma z nią powiązanej żadnej instancji klasy.
Różnice między tymi dwoma rodzajami metod można wyrazić w tabeli:
Umiejętność | Metoda konwencjonalna | Metoda statyczna |
---|---|---|
Istnieje powiązanie z instancją klasy | Tak | NIE |
Może wywoływać normalne metody klasowe | Tak | NIE |
Może wywoływać statyczne metody klasy | Tak | Tak |
Może uzyskiwać dostęp do zwykłych zmiennych klasy | Tak | NIE |
Może uzyskiwać dostęp do zmiennych klasy statycznej | Tak | Tak |
Można wywołać na obiekcie | Tak | Tak |
Można wywołać na zajęciach | NIE | Tak |
Dlaczego takie metody są potrzebne, skoro są tak ograniczone? Rzecz w tym, że takie podejście ma również swoje zalety.
Po pierwsze, aby uzyskać dostęp do statycznych metod i zmiennych, nie trzeba przekazywać żadnego odwołania do obiektu.
Po drugie, czasami konieczne jest, aby zmienna znajdowała się w jednej kopii. Jak na przykład zmienna System.out
( zmienna statyczna spoza klasy System ).
I po trzecie, czasami trzeba wywołać metodę, zanim będzie można utworzyć jakiekolwiek obiekty. Na przykład wywołanie metody main(), która rozpoczyna wykonywanie programu: jest wywoływana przez maszynę Java przed utworzeniem instancji klasy.
Istnieje powiązanie z instancją klasy
Kiedy wywoływana jest zwykła metoda, przekazywany jest do niej ukryty parametr - obiekt, na którym została wywołana . To ustawienie nosi nazwę this
. To właśnie ten ukryty parametr – odniesienie do obiektu, na którym metoda została wywołana – odróżnia metody zwykłe od statycznych.
Metody statyczne nie mają takiego ukrytego parametru, więc słowa kluczowego nie można używać wewnątrz metod statycznych this
, a metody niestatycznej nie można wywołać z metody statycznej: po prostu nie ma miejsca na odwołanie do instancji klasy.
Może wywoływać normalne metody klasowe
Zwykła metoda klasowa ma zawsze ukryty parametr - this
odniesienie do obiektu klasy, na którym metoda została wywołana. Za każdym razem, gdy wywołujesz zwykłą metodę wewnątrz innej zwykłej metody, dla tego wywołania używany jest ukryty parametr this
. Przykład
Kod | Jak to działa |
---|---|
|
|
Dlatego nie można wywołać zwykłej metody ze statycznej. Wewnątrz metody statycznej po prostu nie ma ukrytej zmiennej o nazwie this
.
Cóż, albo wyobraź sobie inny przypadek: w programie nie powstał jeszcze ani jeden obiekt naszej klasy. Czy można wywołać metodę klasy statycznej? Tak. Czy ta metoda statyczna może wywołać metodę normalną?
A na jakim obiekcie to wywoła? W końcu nie ma jeszcze ani jednej instancji naszej klasy!
Może wywoływać statyczne metody klasy
Metody statyczne można wywoływać z dowolnego miejsca - z dowolnego miejsca w programie. Oznacza to, że można je wywoływać zarówno z metod statycznych, jak i zwykłych. Nie ma tu żadnych ograniczeń.
Może uzyskiwać dostęp do zwykłych zmiennych klasy
Ze zwykłej metody możesz uzyskać dostęp do zwykłych zmiennych klasy, ponieważ spowoduje to dostęp do zmiennych instancji klasy, które można łatwo uzyskać z ukrytego parametru this
.
Metoda statyczna nie wie, z której instancji klasy powinna pobierać wartości zwykłych zmiennych. Generalnie możemy łatwo dojść do sytuacji, w której wywoływana jest metoda statyczna, ale w programie nie powstała jeszcze ani jedna instancja klasy.
Dlatego metody statyczne nie mogą uzyskiwać dostępu do zwykłych zmiennych klas.
Metoda statyczna wywołuje zwykłą metodę, ale na jakim obiekcie powinna być wywoływana?
Nieznany ! Dlatego nie możesz wywołać zwykłej metody ze statycznej bez podania referencji do obiektu!
Może uzyskiwać dostęp do zmiennych klasy statycznej
Sytuacja z dostępem do zmiennych statycznych jest taka sama jak z dostępem do metod statycznych. Dostęp do zmiennych statycznych można uzyskać z dowolnego miejsca w programie. Tak więc możliwe jest adresowanie metodami statycznymi i normalnymi.
Można wywołać na obiekcie
Na obiekcie można wywoływać zarówno metody statyczne, jak i zwykłe. Możliwa jest zwykła metoda, ponieważ można ją wywołać tylko na obiekcie. Metodę statyczną można również wywołać na obiekcie: w tym przypadku kompilator sam określi typ zmiennej i wywoła metodę statyczną zgodnie z jej typem:
Kod | Jak kompilator to widzi |
---|---|
|
|
|
|
|
|
Można wywołać na zajęciach
Klasa może wywoływać tylko metodę statyczną; aby wywołać zwykłą metodę, potrzebne jest odwołanie do instancji klasy. Dlatego nie można wywołać zwykłej metody z konstrukcją formularzaNazwaКласса.nazwa metody(параметры)
GO TO FULL VERSION