Java ist seit Jahrzehnten eine der meistgenutzten Programmiersprachen der Welt – in Unternehmenssoftware, Android-Apps und großen Backend-Systemen. Ihr Herzstück ist die objektorientierte Programmierung (OOP). Wer Java wirklich verstehen will, muss die vier Säulen der Objektorientierung beherrschen: Kapselung, Vererbung, Polymorphie und Abstraktion. Dieser Artikel erklärt sie an konkreten Beispielen, ohne dich mit Theorie zu erschlagen.
Klasse und Objekt: der Bauplan und das Haus
Der wichtigste Begriff zuerst: Eine Klasse ist ein Bauplan, ein Objekt ist eine konkrete Ausprägung davon. Die Klasse Auto beschreibt, welche Eigenschaften (Felder) und Fähigkeiten (Methoden) jedes Auto hat. Ein konkretes Objekt – etwa ein roter Kombi – entsteht erst, wenn du die Klasse mit new instanziierst: Auto meinAuto = new Auto();.
Eine Klasse besteht typischerweise aus drei Teilen: Feldern, die den Zustand speichern, einem Konstruktor, der ein Objekt beim Erzeugen initialisiert, und Methoden, die das Verhalten definieren. Der Konstruktor trägt denselben Namen wie die Klasse und wird automatisch beim new-Aufruf ausgeführt.
Kapselung: Daten schützen
Kapselung bedeutet, dass die internen Daten einer Klasse vor direktem Zugriff von außen geschützt werden. In Java erreichst du das mit Zugriffsmodifikatoren. Felder werden in der Regel als private deklariert, sodass kein anderer Code sie direkt verändern kann. Der Zugriff läuft über öffentliche Methoden – die klassischen Getter und Setter.
Der Vorteil ist mehr als kosmetisch: Du kontrollierst, wie auf Daten zugegriffen wird. Ein Setter kann prüfen, ob ein Wert gültig ist, bevor er gespeichert wird – etwa dass ein Alter nicht negativ sein darf. Die Außenwelt muss nichts über die interne Struktur wissen, was dir erlaubt, die Implementierung später zu ändern, ohne anderen Code zu brechen. Die wichtigsten Modifikatoren sind public (überall sichtbar), private (nur in der eigenen Klasse), protected (Klasse und Unterklassen) und der paketweite Standardzugriff.
Vererbung: vom Allgemeinen zum Speziellen
Vererbung erlaubt es, eine neue Klasse auf Basis einer bestehenden zu bauen. Die Unterklasse übernimmt alle Felder und Methoden der Oberklasse und kann sie ergänzen oder anpassen. In Java geschieht das mit dem Schlüsselwort extends: class Elektroauto extends Auto bedeutet, dass Elektroauto alles kann, was ein Auto kann, plus eigene Erweiterungen wie eine Batterieanzeige.
Vererbung modelliert eine "ist-ein"-Beziehung: Ein Elektroauto ist ein Auto. Mit super rufst du den Konstruktor oder Methoden der Oberklasse auf. Ein wichtiger Punkt: Java erlaubt keine Mehrfachvererbung von Klassen – eine Klasse kann nur von einer einzigen Oberklasse erben. Das vermeidet das berüchtigte Diamantproblem, bei dem unklar wäre, welche von mehreren geerbten Methoden gilt.
Überschreiben von Methoden
Eine Unterklasse kann geerbte Methoden überschreiben, um ein eigenes Verhalten zu definieren. Wenn ein Elektroauto die Methode tanken() erbt, kann es sie mit einer eigenen Implementierung "laden()" ersetzen. Die Annotation @Override über der Methode signalisiert dem Compiler, dass du bewusst überschreibst – ein wertvolles Sicherheitsnetz, das Tippfehler im Methodennamen sofort aufdeckt.
Polymorphie: ein Aufruf, viele Formen
Polymorphie ist das eleganteste Konzept der OOP. Es bedeutet, dass derselbe Methodenaufruf je nach tatsächlichem Objekttyp unterschiedlich reagiert. Du kannst eine Liste vom Typ Auto haben, die in Wahrheit Benziner und Elektroautos enthält. Rufst du auf jedem Element fahren() auf, führt Java automatisch die passende Variante der jeweiligen Unterklasse aus – ohne dass dein Code wissen muss, um welchen konkreten Typ es sich handelt.
Diese Entkopplung ist der Schlüssel zu wartbarem Code. Du programmierst gegen die allgemeine Oberklasse oder ein Interface, und neue Unterklassen lassen sich hinzufügen, ohne den bestehenden Code anzufassen. Das ist das Fundament vieler Entwurfsmuster.
Abstrakte Klassen und Interfaces
Manchmal willst du eine gemeinsame Basis definieren, die selbst nie direkt instanziiert wird. Dafür gibt es zwei Werkzeuge:
- Abstrakte Klasse: Mit
abstractmarkiert, kann sie konkrete und abstrakte (noch nicht implementierte) Methoden enthalten. Unterklassen müssen die abstrakten Methoden ausfüllen. Eine abstrakte Klasse eignet sich, wenn die Unterklassen viel gemeinsamen Code teilen. - Interface: Ein Vertrag, der nur festlegt, welche Methoden eine Klasse anbieten muss, ohne sie zu implementieren (seit Java 8 sind auch Default-Methoden möglich). Eine Klasse kann mehrere Interfaces gleichzeitig implementieren – so umgeht Java die fehlende Mehrfachvererbung von Klassen.
Die Faustregel: Verwende ein Interface, wenn du nur eine Fähigkeit beschreiben willst ("kann fliegen", "ist vergleichbar"). Verwende eine abstrakte Klasse, wenn du eine gemeinsame Basis mit geteiltem Code brauchst.
Die JVM: warum Java überall läuft
Ein Wort zur Plattform: Java-Code wird nicht direkt in Maschinencode übersetzt, sondern in Bytecode, der auf der Java Virtual Machine (JVM) läuft. Daher das alte Motto "Write once, run anywhere" – derselbe Bytecode läuft auf Windows, Linux und macOS, solange eine JVM vorhanden ist. Das macht Java besonders attraktiv für plattformübergreifende Server- und Unternehmensanwendungen.
Werkzeuge für den Einstieg
Zum Lernen reicht ein kostenloses JDK und ein Editor; viele Einsteiger nutzen IntelliJ IDEA oder Eclipse. Für allgemeine Entwickleraufgaben rund um Formatierung und Konvertierung von Daten findest du im Webtools-Bereich praktische Helfer. Einen breiteren Überblick über die Sprache liefert unser Beitrag zu den Java Grundlagen. Wer Java für mobile Apps einsetzen will, findet im Artikel zur Android-App-Entwicklung einen verwandten Einstieg.
Häufige Fragen
Was ist der Unterschied zwischen Klasse und Objekt?
Die Klasse ist der Bauplan, das Objekt die konkrete Umsetzung. Aus einer Klasse Auto kannst du beliebig viele Auto-Objekte erzeugen, von denen jedes eigene Werte für seine Felder hat. Die Klasse existiert einmal, Objekte können in Vielzahl entstehen.
Wann nehme ich ein Interface, wann eine abstrakte Klasse?
Ein Interface beschreibt eine Fähigkeit und kann mehrfach implementiert werden – ideal, wenn unzusammenhängende Klassen dasselbe Verhalten anbieten sollen. Eine abstrakte Klasse teilt gemeinsamen Code unter verwandten Unterklassen. Im Zweifel beginne mit einem Interface, da es flexibler ist.
Warum erlaubt Java keine Mehrfachvererbung von Klassen?
Um das Diamantproblem zu vermeiden: Würde eine Klasse von zwei Oberklassen mit derselben Methode erben, wäre nicht eindeutig, welche gilt. Java löst das, indem Klassen nur einfach erben, aber beliebig viele Interfaces implementieren dürfen.
Was bedeutet @Override genau?
Die Annotation teilt dem Compiler mit, dass du absichtlich eine geerbte Methode überschreibst. Stimmt die Signatur nicht exakt mit der Oberklasse überein – etwa wegen eines Tippfehlers – meldet der Compiler einen Fehler, statt versehentlich eine neue, unverbundene Methode anzulegen.