Okładka artykułu: Klasa abstrakcyjna

Klasa abstrakcyjna

Różnice między klasą abstrakcyjną a interfejsem w języku Java oraz słowo kluczowe final.

Klasa abstrakcyjna a Interfejs - porównanie

CechaKlasa abstrakcyjnaInterfejs
Pola✔️
Pola - wyjątekfinalpublic static final
Konstruktor✔️
Dziedziczenie / Implementacja1 (extends)∞ (implements)
Instancja
Metodyabstract + innepublic abstract
Metoda abstrakcyjna - ciałobrakbrak
Metoda abstrakcyjna - ciało - wyjątekbrakdefault

abstract class

  • Tworzą warstwę abstrakcji, która jest mało precyzyjna.
  • Mają upraszczać rzeczywistość.
  • Nie można stworzyć instancji klasy abstrakcyjnej.

Przykład

Mamy w programie taką oto klasę abstrakcyjną:

abstract class MySwingWorker<T, V> extends SwingWorker<T, V> {
    public final void myPublish(V... args) {
    publish(args);
  }
}

Wewnątrz klasy uruchomieniowej nie uda się stworzyć instancji takiego obiektu:

MySwingWorker worker = new MySwingWorker(); // Error:(6, 25) java: org.path.MySwingWorker is abstract; cannot be instantiated

Możesz utworzyć konkretną implementację:

worker = new MySwingWorker<Void, Integer>() {
  @Override 
  protected Void doInBackground() {
    TextArea.append("Performing checks..."); 
    CheckEntryAndStay(); TextArea.append("Processing terminated");

    return null;
  } 
};

Jest to “anonimowa” implementacja MySwingWorker, gdzie (jedyna, jak z tego wynika) abstrakcyjna metoda doInBackground została zaimplementowana.

  • Nie może istnieć klasa abstrakcyjna finalna (final).
  • Każda klasa jest abstrakcyjna, jeśli posiada chociaż jedną metodę abstrakcyjną, która:
    • posiada nazwę,
    • posiada typ zwracany,
    • może posiadać przyjmowane argumenty,
    • posiada modyfikator dostępu,
    • nie posiada ciała metody, czyli robi nic.
  • Jeżeli klasy dziedziczą (extends) po klasie abstrakcyjnej, to klasa abstrakcyjna wymusza na nich implementację metod abstrakcyjnych.
  • Mogą posiadać metody nieabstrakcyjne.
  • Mogą posiadać pola.
  • Można dziedziczyć tylko po jednej klasie.

interface

  • Nie mogą posiadać pól (wyjątkiem jest pole public static final).
  • Nie ma konstruktora i nie można go stworzyć.
  • Wszystkie metody w interfejsach są domyślnie publiczne i abstrakcyjne (brak innych opcji poza metodami statycznymi i domyślnymi).
  • Metody nie posiadają ciała (wyjątkiem jest metoda default).
  • Interfejsy się implementuje, a nie dziedziczy.
  • Można implementować nieskończenie wiele interfejsów.

final

  • Jeżeli pole jest finalne, to nie można go zmienić.
  • Jeżeli pole jest finalne, to musi być zainicjalizowane.
  • Jeżeli metoda jest finalna, to nie można jej nadpisać.
  • Jeżeli klasa jest finalna, to nie można po niej dziedziczyć.