Moje pytanie dotyczy jednego konkretnego użycia statycznego słowa kluczowego. Można użyć static
słowa kluczowego, aby zakryć blok kodu w klasie, która nie należy do żadnej funkcji. Na przykład kompiluje następujący kod:
public class Test {
private static final int a;
static {
a = 5;
doSomething(a);
}
private static int doSomething(int x) {
return (x+5);
}
}
Jeśli usuniesz static
słowo kluczowe, narzeka, ponieważ zmienną a
jest final
. Jednak możliwe jest, aby usunąć oba final
i static
słowa kluczowe i uczynić go skompilować.
Jest to dla mnie mylące na dwa sposoby. Jak mam mieć sekcję kodu, która nie należy do żadnej metody? Jak można to wywołać? Zasadniczo jaki jest cel tego użycia? Lub lepiej, gdzie mogę znaleźć dokumentację na ten temat?
źródło
public static void staticMethod(){}
, jeśli wykonaszTestStatic.class.getMethod("staticMethod");
. Inicjator statyczny nie zostanie wywołany. Więcej informacji tutaj docs.oracle.com/javase/specs/jvms/se10/html/…Uff! co to jest inicjalizator statyczny?
Inicjator statyczny jest
static {}
blokiem kodu wewnątrz klasy java i działa tylko jeden raz przed wywołaniem konstruktora lub metody głównej.OK! Powiedz mi więcej...
static { ... }
wewnątrz dowolnej klasy java. i wykonywane przez maszynę wirtualną po wywołaniu klasy.return
instrukcje nie są obsługiwane.this
lubsuper
są obsługiwane.Hmm, gdzie mogę go użyć?
Można go używać wszędzie tam, gdzie czujesz się dobrze :) tak prosto. Widzę jednak, że przez większość czasu jest on używany podczas połączenia z bazą danych, inicjowania interfejsu API, rejestrowania itp.
Nie szczekaj! gdzie jest przykład
Wynik???
Mam nadzieję że to pomoże!
źródło
afterPropertiesSet()
zInitializingBean
?static
Blok jest „static inicjator”.Jest on automatycznie wywoływany, gdy klasa jest załadowana, i nie ma innego sposobu, aby ją wywołać (nawet poprzez Odbicie).
Osobiście używałem go tylko podczas pisania kodu JNI:
źródło
Method
instancję, ale wywoływany jest tylko przez maszynę wirtualną Java.Jest to bezpośrednio z http://www.programcreek.com/2011/10/java-class-instance-initializers/
1. Polecenie wykonania
Spójrz na następującą klasę, czy wiesz, która zostanie najpierw wykonana?
Wynik:
2. Jak działa inicjalizator instancji Java?
Inicjator instancji powyżej zawiera instrukcję println. Aby zrozumieć, jak to działa, możemy potraktować to jako zmienną instrukcję przypisania, np
b = 0
. Może to uczynić bardziej oczywistym zrozumienie.Zamiast
int b = 0
, mógłbyś pisaćDlatego inicjalizatory instancji i inicjatory zmiennych instancji są prawie takie same.
3. Kiedy inicjalizatory instancji są przydatne?
Stosowanie inicjatorów instancji jest rzadkie, ale nadal może być przydatną alternatywą dla inicjatorów zmiennych instancji, jeśli:
Oczywiście taki kod mógłby zostać napisany w konstruktorach. Ale jeśli klasa ma wiele konstruktorów, musisz powtórzyć kod w każdym konstruktorze.
Za pomocą inicjatora instancji możesz po prostu napisać kod raz i zostanie on wykonany bez względu na to, jakiego konstruktora użyto do utworzenia obiektu. (Myślę, że to tylko koncepcja i nie jest często używana).
Innym przypadkiem, w którym użyteczne są inicjalizatory instancji, są anonimowe klasy wewnętrzne, które w ogóle nie mogą zadeklarować żadnych konstruktorów. (Czy będzie to dobre miejsce do umieszczenia funkcji logowania?)
Dzięki Derhein.
Zauważ też, że klasy Anonimowe implementujące interfejsy [1] nie mają konstruktorów. Dlatego inicjatory instancji są potrzebne do wykonania dowolnego rodzaju wyrażeń w czasie budowy.
źródło
„final” gwarantuje, że zmienna musi zostać zainicjowana przed kodem inicjującym koniec obiektu. Podobnie „statyczny końcowy” gwarantuje, że zmienna zostanie zainicjowana do końca kodu inicjalizacji klasy. Pominięcie „statycznego” w kodzie inicjalizacji zamienia go w kod inicjujący obiekt; dlatego twoja zmienna nie spełnia już swoich gwarancji.
źródło
Nie będziesz pisać kodu w bloku statycznym, który należy wywołać w dowolnym miejscu w programie. Jeśli chcesz wywołać cel kodu, musisz umieścić go w metodzie.
Możesz pisać statyczne bloki inicjujące, aby inicjalizować zmienne statyczne, gdy klasa jest załadowana, ale ten kod może być bardziej złożony.
Blok inicjalizatora statycznego wygląda jak metoda bez nazwy, bez argumentów i bez typu zwracanego. Ponieważ nigdy go nie nazywasz, nie wymaga nazwy. Wywoływany jest tylko wtedy, gdy maszyna wirtualna ładuje klasę.
źródło
gdy programista korzysta z bloku inicjalizującego, kompilator Java kopiuje inicjalizator do każdego konstruktora bieżącej klasy.
Przykład:
następujący kod:
jest równa:
Mam nadzieję, że mój przykład zostanie zrozumiany przez programistów.
źródło
Blok kodu statycznego może być użyty do utworzenia lub zainicjowania zmiennych klas (w przeciwieństwie do zmiennych obiektowych). Dlatego zadeklarowanie „a” statycznego oznacza, że jest to tylko jeden wspólny dla wszystkich obiektów Test, a blok kodu statycznego inicjuje „a” tylko raz, gdy klasa Test jest ładowana po raz pierwszy, bez względu na to, ile obiektów Testowych zostanie utworzonych.
źródło