Zmienne instancji a zmienne statyczne
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 15 z 87.
Jak dotąd każde pole, które utworzyliśmy, należy do konkretnego obiektu. Każde BankAccount ma własne balance, a każdy Product ma własne name. Są to zmienne instancji — istnieją oddzielnie dla każdej instancji klasy.
A co, jeśli potrzebujesz danych współdzielonych przez wszystkie obiekty? Właśnie do tego służą zmienne statyczne (nazywane także zmiennymi klasy). Zmienna statyczna należy do samej klasy, a nie do żadnego konkretnego obiektu.
public class Student {
private String name; // Zmienna instancji – osobna dla każdego studenta
private static int totalCount; // Zmienna statyczna – wspólna dla wszystkich studentów
public Student(String name) {
this.name = name;
totalCount++; // Zwiększa wartość wspólnego licznika
}
public static int getTotalCount() {
return totalCount;
}
}Gdy tworzysz wielu uczniów, każdy ma własne name, ale wszyscy współdzielą tę samą totalCount:
Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
System.out.println(Student.getTotalCount()); // Wynik: 2Zauważ, że uzyskujemy dostęp do zmiennej statycznej za pomocą nazwy klasy (Student.getTotalCount()), a nie za pomocą obiektu. Podkreśla to, że składowe statyczne należą do klasy, a nie do jej instancji.
Używaj zmiennych instancji do przechowywania danych, które różnią się między obiektami (na przykład imienia ucznia). Używaj zmiennych statycznych do przechowywania danych, które powinny być współdzielone (na przykład do zliczania istniejących obiektów).
Wyzwanie
ŁatwyZbudujmy system inwentaryzacji Book, który śledzi zarówno szczegóły poszczególnych książek, jak i łączną liczbę książek w całej kolekcji, używając zmiennych instancji i zmiennych statycznych.
Utworzysz dwa pliki, aby uporządkować swój kod:
Book.java: Utwórz klasę Book, która śledzi informacje o poszczególnych książkach, a także przechowuje liczbę wszystkich utworzonych książek:- Zmienna instancji
title(String) — unikalna dla każdej książki - Zmienna instancji
price(double) — unikalna dla każdej książki - Zmienna statyczna
totalBooks(int) — współdzielona przez wszystkie obiekty Book, śledząca liczbę utworzonych książek - Konstruktor, który przyjmuje tytuł i cenę oraz zwiększa łączną liczbę książek
- Getter
getTitle()dla tytułu - Getter
getPrice()dla ceny - Metoda statyczna
getTotalBooks(), która zwraca łączną liczbę utworzonych książek
- Zmienna instancji
Main.java: Utwórz wiele obiektów Book i pokaż, jak licznik statyczny śledzi wszystkie instancje. Otrzymasz trzy tytuły książek i trzy ceny jako dane wejściowe. Po utworzeniu wszystkich trzech książek wyświetl cztery wiersze:- Tytuł i cenę każdej książki w formacie:
[title]: $[price](cena sformatowana do 2 miejsc po przecinku) - Łączną liczbę książek przy użyciu metody statycznej:
Total books: [count]
- Tytuł i cenę każdej książki w formacie:
Otrzymasz sześć danych wejściowych w następującej kolejności: title1, price1, title2, price2, title3, price3.
Pamiętaj, aby wywołać metodę statyczną za pomocą nazwy klasy (Book.getTotalBooks()), a nie za pośrednictwem instancji obiektu. Do formatowania cen użyj String.format("%.2f", price).
Spróbuj swoich sił
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Wczytaj dane dla trzech książek
String title1 = scanner.nextLine();
double price1 = Double.parseDouble(scanner.nextLine());
String title2 = scanner.nextLine();
double price2 = Double.parseDouble(scanner.nextLine());
String title3 = scanner.nextLine();
double price3 = Double.parseDouble(scanner.nextLine());
// TODO: Utwórz trzy obiekty Book, używając powyższych danych
// TODO: Wypisz tytuł i cenę każdej książki w formacie: [title]: $[price]
// Użyj String.format("%.2f", price), aby sformatować cenę do 2 miejsc po przecinku
// TODO: Wypisz łączną liczbę książek za pomocą metody statycznej
// Format: Total books: [count]
// Pamiętaj, aby wywołać metodę statyczną przez nazwę klasy: Book.getTotalBooks()
}
}
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