Klassen und Objekte
In dieser Lerneinheit verstehst du die fundamentalen Konzepte von Klassen und Objekten als Grundbausteine der objektorientierten Programmierung. Du lernst, wie Klassen als Blaupausen für Objekte fungieren und wie du eigene Klassen mit Attributen und Methoden definierst. Diese Grundlagen wendest du direkt in der Softwareentwicklung an, um Code strukturiert und wiederverwendbar zu gestalten.
Einführung
Wenn du anfängst zu programmieren, arbeitest du oft mit einzelnen Variablen: eine Variable für den Namen, eine für das Alter, eine für die Adresse. Bei wenigen Daten funktioniert das noch gut. Doch was passiert, wenn du nicht eine Person, sondern hundert Personen verwalten musst?

Du hättest hunderte einzelne Variablen: name1, name2, name3, alter1, alter2, alter3 - ein Chaos, das schnell unübersichtlich und fehleranfällig wird.
Genau hier kommen Klassen und Objekte ins Spiel. Sie ermöglichen es dir, zusammengehörige Daten und Funktionalität in einer strukturierten Einheit zu bündeln. Statt hunderte einzelner Variablen zu verwalten, erstellst du eine Klasse “Person” und erzeugst daraus so viele Objekte wie du benötigst.
In dieser Lerneinheit lernst du, wie Klassen als Blaupausen für Objekte fungieren, wie du Attribute und Methoden definierst und wie du aus Klassen konkrete Objekte erstellst. Diese Grundlagen sind das Fundament der objektorientierten Programmierung.
Lernziele
Nach dieser Lerneinheit kannst du:
- Den Unterschied zwischen Klassen und Objekten erklären
- Die Bestandteile einer Klasse (Attribute, Methoden, Konstruktoren) benennen und verwenden
- Zugriffsmodifikatoren (public, private, protected) korrekt einsetzen
- Objekte aus Klassen instanziieren und mit ihnen arbeiten
- Einfache Klassen mit Attributen und Methoden selbst erstellen
Überblick
Um diese Ziele zu erreichen, schauen wir uns zunächst an, was Klassen sind und wie sie aufgebaut sind.
Danach lernst du, wie du aus diesen Klassen konkrete Objekte erstellst und mit ihnen arbeitest.
Was ist eine Klasse?
Eine Klasse ist eine Vorlage oder ein Bauplan für Objekte. Sie definiert, welche Eigenschaften (Attribute) und Fähigkeiten (Methoden) Objekte dieser Klasse haben sollen.
Denke an eine Klasse wie an einen Bauplan für ein Haus: Der Bauplan beschreibt, wie das Haus aussehen soll, welche Räume es hat und wie sie angeordnet sind. Aus einem Bauplan können viele verschiedene Häuser gebaut werden, die alle dieselbe Grundstruktur haben, aber unterschiedliche konkrete Eigenschaften besitzen können.
Genauso beschreibt eine Klasse “Person”, dass jede Person einen Namen und ein Alter hat und sich vorstellen kann - aber jedes konkrete Person-Objekt hat dann seinen eigenen spezifischen Namen und sein eigenes Alter.
Anatomie einer Klasse
Schauen wir uns an, wie eine Klasse in Java aufgebaut ist. Eine vollständige Klasse besteht aus drei Hauptbestandteilen: Attribute (speichern Daten), ein Konstruktor (initialisiert neue Objekte) und Methoden (definieren Verhalten). Wir bauen die Klasse Schritt für Schritt auf.
Schritt 1: Die Klasse und ihre Attribute
public class Person {
private String name;
private int alter;
}Die Klasse Person wird mit public class Person deklariert. Die Attribute name und alter speichern den Zustand eines Person-Objekts. Das Schlüsselwort private bedeutet, dass diese Attribute nur innerhalb der Klasse selbst zugänglich sind - das ist wichtig für die Kapselung.
Schritt 2: Der Konstruktor hinzufügen
public class Person {
private String name;
private int alter;
// Konstruktor
public Person(String name, int alter) { // ← NEU
this.name = name;
this.alter = alter;
}
}Der Konstruktor wird aufgerufen, wenn ein neues Person-Objekt erstellt wird. Er nimmt die Werte für Name und Alter entgegen. Mit this.name = name weisen wir den übergebenen Parameter name dem Attribut this.name zu. Das Schlüsselwort this unterscheidet das Attribut vom Parameter.
Schritt 3: Eine Methode hinzufügen
public class Person {
private String name;
private int alter;
// Konstruktor
public Person(String name, int alter) {
this.name = name;
this.alter = alter;
}
// Methode
public void stelleDichVor() { // ← NEU
System.out.println("Ich bin " + name + " und " + alter + " Jahre alt.");
}
}Die Methode stelleDichVor() definiert ein Verhalten der Person. Sie greift auf die Attribute name und alter zu und gibt eine formatierte Vorstellung auf der Konsole aus. Das Schlüsselwort public bedeutet, dass diese Methode von außen aufgerufen werden kann. Jetzt haben wir eine vollständige Klasse!
Attribute (Fields)
Attribute, auch als Fields oder Eigenschaften bezeichnet, speichern den Zustand eines Objekts. Sie sind Variablen innerhalb einer Klasse.
In unserem Person-Beispiel sind name und alter Attribute. Jedes Person-Objekt hat seine eigenen Werte für diese Attribute. Person1 kann “Anna” und 25 Jahre alt sein, während Person2 “Max” und 30 Jahre alt ist.
Attribute werden typischerweise als private deklariert, um die Kapselung zu gewährleisten - dazu mehr in der nächsten Lerneinheit.
Methoden (Methods)
Methoden definieren das Verhalten und die Fähigkeiten eines Objekts. Sie sind Funktionen innerhalb einer Klasse, die auf die Attribute des Objekts zugreifen oder diese verändern können.
In unserem Person-Beispiel ist stelleDichVor() eine Methode. Sie beschreibt, was eine Person tun kann - nämlich sich vorstellen. Dabei greift die Methode auf die Attribute name und alter zu und gibt diese formatiert aus.
Methoden können auch Parameter entgegennehmen und Werte zurückgeben, genau wie normale Funktionen.
Zugriffsmodifikatoren (Access Modifiers)
Zugriffsmodifikatoren steuern, wer auf Attribute und Methoden einer Klasse zugreifen darf. Sie sind ein zentrales Werkzeug für die Kapselung und helfen dir, deine Daten zu schützen.
Java kennt drei Hauptmodifikatoren:
| Modifikator | Zugriff | Verwendung |
|---|---|---|
| public | Von überall zugänglich | Für Methoden, die von außen aufgerufen werden sollen |
| private | Nur innerhalb der eigenen Klasse | Für Attribute und interne Hilfsmethoden |
| protected | Innerhalb des Pakets und in abgeleiteten Klassen | Für Vererbung (dazu mehr in späteren Lerneinheiten) |
Wenn kein Modifikator angegeben wird, gilt package-private (nur innerhalb des Pakets zugänglich).
Best Practices für Zugriffsmodifikatoren
Grundregel: Wähle immer den restriktivsten Zugriffsmodifikator, der noch funktioniert.
Für Attribute: Fast immer private. Dadurch schützt du die internen Daten deiner Klasse und verhinderst unkontrollierte Änderungen von außen.
Für Methoden:
publicfür Methoden, die von außen aufgerufen werden sollen (die öffentliche Schnittstelle deiner Klasse)privatefür Hilfsmethoden, die nur intern verwendet werden
Für Konstruktoren: Meist public, damit Objekte von außen erstellt werden können.
Konstruktoren (Constructors)
Ein Konstruktor ist eine spezielle Methode, die automatisch aufgerufen wird, wenn ein neues Objekt erstellt wird. Seine Aufgabe ist es, das Objekt zu initialisieren und seinen Anfangszustand festzulegen.
Besonderheiten von Konstruktoren:
- Haben denselben Namen wie die Klasse
- Haben keinen Rückgabetyp (auch nicht
void) - Werden mit dem
new-Keyword aufgerufen
In unserem Person-Beispiel initialisiert der Konstruktor die Attribute name und alter mit den übergebenen Werten. So wird sichergestellt, dass jedes neu erstellte Person-Objekt von Anfang an einen Namen und ein Alter hat.
Konstruktor-Überladung
Eine Klasse kann mehrere Konstruktoren haben, die sich in ihren Parametern unterscheiden. Das nennt man Konstruktor-Überladung. Dadurch kannst du Objekte auf verschiedene Arten erstellen - je nachdem, welche Informationen du beim Erstellen zur Verfügung hast. Schauen wir uns an, wie das funktioniert.
Schritt 1: Klasse mit erstem Konstruktor
public class Person {
private String name;
private int alter;
// Konstruktor mit beiden Parametern
public Person(String name, int alter) {
this.name = name;
this.alter = alter;
}
}Die Person-Klasse speichert Name und Alter als private Attribute. Der erste Konstruktor nimmt beide Werte entgegen und setzt die Attribute. Das verwendest du, wenn du alle Informationen hast.
Schritt 2: Zweiten Konstruktor hinzufügen
public class Person {
private String name;
private int alter;
// Konstruktor mit beiden Parametern
public Person(String name, int alter) {
this.name = name;
this.alter = alter;
}
// Konstruktor nur mit Name
public Person(String name) { // ← NEU
this.name = name;
this.alter = 0;
}
}Der zweite Konstruktor nimmt nur den Namen entgegen und setzt das Alter automatisch auf 0. Das ist praktisch, wenn das Alter noch nicht bekannt ist. Java erkennt automatisch, welcher Konstruktor gemeint ist, basierend auf den übergebenen Parametern - das ist die Überladung!
Objekte instanziieren
Instanziierung ist der Vorgang, bei dem aus einer Klasse (dem Bauplan) ein konkretes Objekt erstellt wird. In Java verwendest du dafür das new-Keyword. Schauen wir uns Schritt für Schritt an, wie das funktioniert.
Schritt 1: Objekte erstellen
Person anna = new Person("Anna", 25);
Person max = new Person("Max", 30);Mit Person anna deklarierst du eine Variable vom Typ Person. Mit new Person("Anna", 25) erstellst du ein neues Person-Objekt und rufst den Konstruktor mit den Werten “Anna” und 25 auf. Das Objekt wird dann in der Variable anna gespeichert. Genauso erstellen wir ein zweites Objekt max mit anderen Werten.
Schritt 2: Methoden auf den Objekten aufrufen
Person anna = new Person("Anna", 25);
Person max = new Person("Max", 30);
// Methoden aufrufen
anna.stelleDichVor(); // ← NEU
max.stelleDichVor(); // ← NEUMit anna.stelleDichVor() rufst du die Methode auf dem Objekt anna auf. Die Ausgabe ist: “Ich bin Anna und 25 Jahre alt.” Genauso gibt max.stelleDichVor() aus: “Ich bin Max und 30 Jahre alt.” Jedes Objekt hat seine eigenen Attributwerte, aber alle Objekte derselben Klasse teilen dieselben Methoden.
Praxisbeispiel: BankKonto-Klasse
Schauen wir uns ein praktisches Beispiel an: eine Klasse für Bankkonten. Hier siehst du, wie alle gelernten Konzepte (Attribute, Konstruktor, Methoden) zusammenspielen. Wir bauen die Klasse Schritt für Schritt auf.
Schritt 1: Die Attribute
public class BankKonto {
private String kontoinhaber;
private double kontostand;
}Die BankKonto-Klasse hat zwei private Attribute: kontoinhaber (wem gehört das Konto) und kontostand (wie viel Geld ist drauf). Beide sind private, damit niemand von außen direkt den Kontostand ändern kann.
Schritt 2: Der Konstruktor
public class BankKonto {
private String kontoinhaber;
private double kontostand;
// Konstruktor
public BankKonto(String kontoinhaber, double startguthaben) { // ← NEU
this.kontoinhaber = kontoinhaber;
this.kontostand = startguthaben;
}
}Der Konstruktor initialisiert ein neues Konto mit dem Namen des Inhabers und einem Startguthaben. Mit this.kontostand = startguthaben setzen wir das Attribut kontostand auf den übergebenen Wert.
Schritt 3: Geld einzahlen
public class BankKonto {
private String kontoinhaber;
private double kontostand;
public BankKonto(String kontoinhaber, double startguthaben) {
this.kontoinhaber = kontoinhaber;
this.kontostand = startguthaben;
}
// Einzahlen
public void einzahlen(double betrag) { // ← NEU
kontostand += betrag;
}
}Die Methode einzahlen() erhöht den Kontostand um den übergebenen Betrag. kontostand += betrag ist eine Kurzform für kontostand = kontostand + betrag.
Schritt 4: Geld abheben
public class BankKonto {
private String kontoinhaber;
private double kontostand;
public BankKonto(String kontoinhaber, double startguthaben) {
this.kontoinhaber = kontoinhaber;
this.kontostand = startguthaben;
}
public void einzahlen(double betrag) {
kontostand += betrag;
}
// Abheben
public void abheben(double betrag) { // ← NEU
kontostand -= betrag;
}
}Die Methode abheben() verringert den Kontostand um den Betrag. Hier sehen wir noch keine Validierung (wie “Ist genug Geld da?“) - das kommt in der nächsten Lerneinheit über Kapselung.
Schritt 5: Kontostand abfragen
public class BankKonto {
private String kontoinhaber;
private double kontostand;
public BankKonto(String kontoinhaber, double startguthaben) {
this.kontoinhaber = kontoinhaber;
this.kontostand = startguthaben;
}
public void einzahlen(double betrag) {
kontostand += betrag;
}
public void abheben(double betrag) {
kontostand -= betrag;
}
// Kontostand abrufen
public double getKontostand() { // ← NEU
return kontostand;
}
}Die Methode getKontostand() gibt den aktuellen Kontostand zurück, ohne ihn zu verändern. Sie ermöglicht es, den Wert des privaten Attributs kontostand von außen zu lesen. Jetzt haben wir eine vollständige BankKonto-Klasse!
Zusammenfassung und Ausblick
Zusammenfassung
In dieser Lerneinheit hast du die Grundlagen von Klassen und Objekten gelernt - das Fundament der objektorientierten Programmierung.
Klassen und Objekte: Eine Klasse ist ein Bauplan, der definiert, welche Eigenschaften (Attribute) und Fähigkeiten (Methoden) Objekte haben. Aus einer Klasse kannst du beliebig viele Objekte erstellen, die alle dieselbe Struktur haben, aber unterschiedliche Werte speichern.
Attribute: Speichern den Zustand eines Objekts. Sie sind typischerweise private, damit sie von außen nicht direkt verändert werden können. Beispiel:
private String name;
private int alter;Methoden: Definieren das Verhalten eines Objekts und können auf die Attribute zugreifen. Sie sind meist public, wenn sie von außen aufgerufen werden sollen. Beispiel:
public void stelleDichVor() {
System.out.println("Ich bin " + name + " und " + alter + " Jahre alt.");
}Konstruktoren: Spezielle Methoden, die beim Erstellen eines Objekts aufgerufen werden. Sie haben denselben Namen wie die Klasse und keinen Rückgabetyp. Sie initialisieren die Attribute mit Startwerten. Beispiel:
public Person(String name, int alter) {
this.name = name;
this.alter = alter;
}Zugriffsmodifikatoren: Mit public, private und protected steuerst du, wer auf Attribute und Methoden zugreifen darf. Grundregel: Attribute sind private, Methoden für die öffentliche Schnittstelle sind public.
Objekte instanziieren: Mit dem new-Keyword erstellst du ein Objekt aus einer Klasse. Beispiel:
Person anna = new Person("Anna", 25);Jedes Objekt hat seine eigenen Attributwerte.
Ausblick
In der nächsten Lerneinheit “Kapselung” vertiefst du, wie du deine Daten schützt und kontrolliert zugänglich machst. Du lernst, wie du mit Getter- und Setter-Methoden arbeitest, Validierung in deine Klassen einbaust und das BankKonto-Beispiel erweiterst, um negative Kontostände zu verhindern.