Bloki statyczne
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 17 z 87.
Czasami trzeba zainicjalizować zmienne statyczne za pomocą logiki bardziej złożonej niż proste przypisanie. Blok statyczny (nazywany też inicjalizatorem statycznym) wykonuje się raz, gdy klasa jest ładowana po raz pierwszy, zanim zostaną utworzone jakiekolwiek obiekty lub zostaną wywołane metody statyczne.
public class DatabaseConfig {
private static String connectionString;
private static int maxConnections;
static {
// Złożona logika inicjalizacji
connectionString = "jdbc:mysql://localhost:3306/mydb";
maxConnections = 10;
System.out.println("Database configuration loaded");
}
}Blok statyczny wykonuje się automatycznie, gdy klasa zostaje załadowana do pamięci. Dzieje się to tylko raz, niezależnie od tego, ile obiektów utworzysz. Doskonale nadaje się do inicjalizacji wymagającej wielu instrukcji, obliczeń lub logiki warunkowej.
W klasie możesz mieć wiele bloków statycznych, które wykonują się w kolejności, w jakiej występują:
public class AppSettings {
private static int[] values;
static {
values = new int[5];
}
static {
for (int i = 0; i < values.length; i++) {
values[i] = i * 10;
}
}
}Bloki statyczne są powszechnie używane do inicjalizowania statycznych tablic lub kolekcji, konfigurowania wartości konfiguracyjnych wymagających obliczeń oraz wykonywania jednorazowych zadań konfiguracyjnych na poziomie klasy.
Wyzwanie
ŁatwyZbudujmy system GameConfig, który używa bloków statycznych do inicjowania ustawień gry przy pierwszym wczytaniu klasy. To idealne rozwiązanie w przypadku konfiguracji, którą trzeba obliczyć lub przygotować raz, zanim zostaną utworzone jakiekolwiek obiekty gry.
Utworzysz dwa pliki, aby uporządkować kod:
GameConfig.java: Utwórz klasę konfiguracji, która inicjuje swoje ustawienia za pomocą bloków statycznych:- Prywatna tablica statyczna
levelThresholds(int[]), która przechowuje liczbę punktów potrzebną do osiągnięcia każdego poziomu - Prywatna zmienna statyczna
maxLevel(int), przechowująca łączną liczbę poziomów - Prywatna zmienna statyczna
configLoaded(boolean), która śledzi, czy inicjalizacja została wykonana - Użyj bloku statycznego, aby zainicjować
maxLevelwartością 5 i wypisać"Initializing game configuration..." - Użyj drugiego bloku statycznego, aby utworzyć tablicę
levelThresholdso rozmiarze równymmaxLevel, a następnie wypełnić ją tak, aby każdy poziom wymagałlevel * 100punktów (poziom 1 wymaga 100, poziom 2 wymaga 200 itd.) i ustawićconfigLoadednatrue - Metoda statyczna
getThreshold(int level), która zwraca próg punktowy dla danego poziomu (poziomy są numerowane od 1) - Metoda statyczna
getMaxLevel(), która zwraca maksymalny poziom - Metoda statyczna
isConfigLoaded(), która zwraca informację, czy konfiguracja została wczytana
- Prywatna tablica statyczna
Main.java: Pokaż, że bloki statyczne są wykonywane automatycznie, gdy klasa zostaje użyta. Otrzymasz jedno wejście: numer poziomu do sprawdzenia. Wypisz cztery wiersze:Config loaded: truelubConfig loaded: falseMax level: [maxLevel]Level [level] threshold: [threshold]Level 1 threshold: [threshold](zawsze pokaż również poziom 1)
Otrzymasz jedno wejście: numer poziomu (int) do sprawdzenia.
Zwróć uwagę, że komunikat inicjalizacyjny jest wypisywany, zanim wykona się jakikolwiek kod z klasy Main — to blok statyczny jest wykonywany przy pierwszym wczytaniu klasy!
Spróbuj swoich sił
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int level = scanner.nextInt();
// TODO: Uzyskaj dostęp do GameConfig, aby zademonstrować wykonanie bloku statycznego
// Bloki statyczne w GameConfig uruchomią się automatycznie przy pierwszym uzyskaniu dostępu do tej klasy
// TODO: Wyświetl, czy konfiguracja jest załadowana
// Format: "Config loaded: true" lub "Config loaded: false"
// TODO: Wyświetl maksymalny poziom
// Format: "Max level: [maxLevel]"
// TODO: Wyświetl próg dla podanego poziomu
// Format: "Level [level] threshold: [threshold]"
// TODO: Wyświetl próg dla poziomu 1
// Format: "Level 1 threshold: [threshold]"
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online