Menu
Coddy logo textTech

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: 2

Zauważ, ż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).

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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
  • 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]

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()
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Java online