Sobes.tech
Junior

Jakie są typy klas w Java?

sobes.tech AI

Odpowiedź od AI

W Javie istnieją następujące główne typy klas:

  1. Klasa standardowa (Standard Class)

    • Może zawierać pola, metody, konstruktory.
    • Może być dziedziczona przez inne klasy, jeśli nie jest zadeklarowana jako final.
    • Może implementować interfejsy.
    • Deklarowana z modyfikatorami dostępu (public, protected, default, private).
  2. Klasa abstrakcyjna (Abstract Class)

    • Deklarowana słowem kluczowym abstract.
    • Nie można jej bezpośrednio zainicjować.
    • Może zawierać metody abstrakcyjne (bez implementacji) i zwykłe metody.
    • Przeznaczona do dziedziczenia; podklasy muszą zapewnić implementację metod abstrakcyjnych.
    // Klasa abstrakcyjna dla figury
    abstract class Shape {
        abstract double area(); // Metoda abstrakcyjna obliczająca pole
    
        void display() { // Metoda zwykła
            System.out.println("This is a shape.");
        }
    }
    
  3. Klasa final (Final Class)

    • Deklarowana słowem kluczowym final.
    • Nie może być dziedziczona przez inne klasy.
    • Używana do zapobiegania rozszerzaniu klasy, zapewnienia bezpieczeństwa lub niezmienności implementacji.
    // Klasa final, której nie można dziedziczyć
    final class ImmutableString {
        private final String value;
    
        public ImmutableString(String value) {
            this.value = value;
        }
    
        public String getValue() {
            return value;
        }
    }
    
  4. Wyliczenia (Enum)

    • Specjalny typ klasy, przeznaczony do reprezentowania stałego zestawu stałych.
    • Deklaruje się słowem kluczowym enum.
    • Stałe wyliczenia domyślnie są public static final.
    • Mogą mieć pola, metody i konstruktory (z modyfikatorem private).
    // Wyliczenie dni tygodnia
    enum DayOfWeek {
        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
    }
    
  5. Klasy anonimowe (Anonymous Class)

    • Klasa bez nazwy, tworzona i instancjonowana jednocześnie.
    • Często używana do implementacji interfejsów lub rozszerzania klas "na żywo", gdy potrzebne jest jednorazowe użycie.
    • Nie mogą mieć jawnych konstruktorów.
    // Tworzenie klasy anonimowej implementującej Runnable
    Runnable r = new Runnable() {
        @Override
        public void run() {
            System.out.println("Running in an anonymous class.");
        }
    };
    
  6. Klasy zagnieżdżone (Nested Class)

    • Klasy zadeklarowane wewnątrz innej klasy.
    • Istnieją dwa typy:
      • Statyczne klasy zagnieżdżone (Static Nested Class): deklarowane słowem kluczowym static. Nie mają bezpośredniego dostępu do nie-statycznych członków klasy zewnętrznej. Tworzone jak zwykłe klasy.
      • Klasy wewnętrzne (Inner Class): nie są zadeklarowane jako static. Mają dostęp do wszystkich członków klasy zewnętrznej, w tym private. Wymagają instancji klasy zewnętrznej do utworzenia własnej instancji.
    // Klasa zewnętrzna
    class OuterClass {
        private String outerField = "Outer";
    
        // Klasa statyczna zagnieżdżona
        static class StaticNestedClass {
            void display() {
                System.out.println("Inside StaticNestedClass.");
                // Brak bezpośredniego dostępu do outerField
            }
        }
    
        // Klasa wewnętrzna
        class InnerClass {
            void display() {
                System.out.println("Inside InnerClass. outerField: " + outerField); // Dostęp do outerField
            }
        }
    }
    
  7. Klasy rekordowe (Record - od Java 14)

    • Deklaruje się słowem kluczowym record.
    • Przeznaczone do przechowywania danych. Kompilator automatycznie generuje konstruktor, metody dostępu do pól (accessor methods), equals(), hashCode() i toString().
    • Pola rekordu są domyślnie final.
    // Rekord reprezentujący punkt w przestrzeni 2D
    record Point(int x, int y) {
        // Kompilator wygeneruje konstruktor, metody x(), y(), equals(), hashCode(), toString()
    }