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!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // тут будет ошибка!
   }
}

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
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


Metoda mainjest 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
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


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 - thisodniesienie 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
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

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?

Metody statyczne

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
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

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(параметры)