- 1 Section
- 10 Lessons
- unbegrenzt
- Objektorientierte Programmierung (OOP)10
Klassen und Objekte
In L1 hast du gesehen warum es OOP gibt. Jetzt geht's um die zwei zentralen Begriffe, die du in jeder OOP-Lektion wieder antreffen wirst: Klasse und Objekt. Sie werden oft synonym gebraucht und doch beschreiben sie etwas Verschiedenes. Wer den Unterschied klar im Kopf hat, hat 50% der OOP-Theorie schon verstanden.
Wir bauen das Mentalmodell mit konkreten Analogien auf, schauen uns die Lebenszyklen an, vergleichen die Syntax in Python und Java, und enden mit den Begriffen die in Klausuren wichtig sind: Instanziierung, Referenz, Identität.
1) Die Schlüsselanalogie: Bauplan und Bauwerk
Stell dir einen Architekten-Bauplan für ein Einfamilienhaus vor. Der Bauplan ist nicht das Haus – er beschreibt nur, wie das Haus aussehen soll. Mit einem Bauplan kannst du beliebig viele tatsächliche Häuser bauen. Jedes davon hat die gleiche Grundstruktur (4 Wände, 1 Dach, 1 Tür) – aber konkrete eigene Werte: Farbe der Wände, Hausnummer, Bewohner.
- Bauplan = Klasse: abstrakte Beschreibung, existiert nur als Konzept
- Tatsächliches Haus = Objekt: konkrete Instanz, existiert real im Speicher
Eine andere beliebte Analogie: Ausstecher und Plätzchen. Der Ausstecher ist die Klasse – die Form. Jedes Plätzchen ist ein Objekt – eine Instanz dieser Form. Aus einem Ausstecher entstehen viele Plätzchen, aber jedes ist ein eigenes physisches Objekt:
stern_1.farbe und stern_2 bleibt unberührt.2) Klassen-Definition vs. Objekt-Erzeugung
Schauen wir den Code-Unterschied genauer an. Eine Klassen-Definition sagt nur wie etwas auszusehen hat – sie erzeugt selbst nichts. Eine Instanziierung erschafft tatsächlich ein Objekt im Speicher:
Zeilen 2-8: Klassen-Definition. Bis hier ist noch kein Hund erschaffen. Zeile 11: Hund("Rex", 5) ist die Instanziierung – jetzt entsteht ein Objekt namens Rex. Zeile 12: ein zweites Objekt entsteht. Beide haben unabhängige Daten, aber teilen sich den Code der Methoden.
3) Vergleich: Java, Python, JavaScript
Die Syntax variiert, das Konzept bleibt gleich. Wer eine Sprache versteht, versteht auch die anderen mit minimalem Aufwand:
Drei Sprachen, dasselbe Konzept. Java verlangt new, Python nicht, JavaScript schon. Python nutzt self, Java und JS this – beides bezeichnet dasselbe: das aktuelle Objekt. Java verlangt Typdeklarationen, Python ist dynamisch typisiert.
4) Klassen-Anatomie: Blueprint visualisiert
Schau dir eine Klasse als Bauplan an, mit Attributen (Daten) und Methoden (Verhalten). Aus dem einen Bauplan entstehen mehrere Instanzen – jede mit eigenen Daten:
5) Lebenszyklus eines Objekts
Ein Objekt lebt nicht ewig. Es durchläuft mehrere Phasen, die du als Entwickler beeinflussen kannst:
__init__, in Java derselbe Name wie die Klasse. Mehr in L3.rex = None oder Variable verlässt den Scope. Das Objekt existiert noch, ist aber „unerreichbar".__del__, C++ Destruktoren). Selten genutzt, oft heikel in Garbage-collected Sprachen.finalize(), das aber seit Java 9 deprecated ist. Stattdessen nutzt man try-with-resources oder das AutoCloseable-Interface für Ressourcen-Bereinigung. In Python ist __del__ möglich, aber unzuverlässig. Best Practice: with-Statement nutzen für Files, Datenbankverbindungen usw.6) Identität, Gleichheit, Referenz
Ein subtil-wichtiges Thema das in fast jeder Klausur drankommt: der Unterschied zwischen Identität und Gleichheit. Klingt philosophisch, ist aber Code-relevant.
==, Python is. Vergleicht die Speicheradresse..equals(), Python ==. Kann selbst definiert werden.Dieses Verhalten ist auch in K46 L10 Bug-Hunt #3 als typischer Java-Anfänger-Fehler aufgetaucht: str1 == str2 mit Strings gibt oft false zurück, weil == in Java die Identität prüft. Richtig wäre str1.equals(str2).
7) Eingebaute Klassen sind auch Klassen
Eine wichtige Erkenntnis für Anfänger: auch eingebaute Typen sind Klassen. String in Java, str in Python, Array in JavaScript – alle Klassen. Du arbeitest mit ihren Objekten ständig, ohne sie als „OOP" wahrzunehmen:
Wenn du Strings, Listen, Dictionaries nutzt und ihre Methoden aufrufst – machst du bereits OOP. Du hast es nur nicht gemerkt. Genau diese Mächtigkeit ist der Grund, warum OOP-Sprachen so weit verbreitet sind: das Konzept ist überall.
8) Häufige Anfänger-Verwirrungen
Wenn du am Anfang strugglest, du bist nicht allein. Hier die typischen Stolperfallen die alle Lernenden treffen:
- Klasse und Objekt verwechseln:
Hundist die Klasse,rexein Objekt davon. NiemalsHund.bellen()ohne Instanz aufrufen – außer es ist eine statische Methode (Thema L3). - Self/this vergessen: in Python ist
selfder erste Parameter jeder Methode. Vergisst du es, bekommst du verwirrende Fehler. Java/JS fügenthisimplizit hinzu. - Konstruktor vs. Klassen-Definition: die Klasse wird einmal definiert (Code-Datei). Der Konstruktor läuft jedes Mal wenn ein Objekt erzeugt wird.
- Referenz vs. Kopie: in Python und Java enthalten Variablen Referenzen, keine Werte.
a = bmacht keinen Klon! - Daten zwischen Instanzen vermischen: jede Instanz hat ihre eigenen Attribute. Wenn du nicht aufpasst, definierst du aus Versehen Klassen-Attribute (für alle gleich) statt Instanz-Attribute – kommt in L3.
9) Wann eine Klasse, wann nicht?
Junge Entwickler neigen dazu, für alles Klassen zu erfinden. Erfahrenere wissen: nicht jedes Problem braucht OOP. Gute Indikatoren für eine eigene Klasse:
Ja, Klasse:
- Du modellierst eine Sache der echten Welt (Kunde, Bestellung, Auto)
- Du hast mehrere Instanzen mit unterschiedlichen Werten gleicher Struktur
- Daten und Logik gehören eng zusammen
- Du erwartest spätere Erweiterungen oder Sub-Typen
Eher nicht:
- Nur ein einzelnes Datenpaket → tuple oder dict reicht
- Reine Berechnungs-Funktion → einfach eine Funktion
- Du hast eine Klasse mit nur einer Methode → das ist meist eine Funktion in Verkleidung
- Zwei Datenfelder → vielleicht ein Tupel oder Named Tuple
10) Klassen sind ein Namensraum
Eine oft übersehene Funktion von Klassen: sie sind ein Namensraum. Methoden in verschiedenen Klassen können denselben Namen haben, ohne dass es Konflikte gibt:
Im prozeduralen Code müsstest du sie datei_oeffnen() und fenster_oeffnen() nennen, um Verwechslung zu vermeiden. OOP gibt dir das geschenkt. Polymorphismus (kommende L6) baut sogar gezielt auf diesem Konzept auf: gleicher Methodenname, verschiedene Implementierung pro Klasse.
Zusammenfassung
Eine Klasse ist ein Bauplan, ein Objekt eine konkrete Instanz davon. Aus einer Klasse entstehen beliebig viele Objekte mit eigenen Attribut-Werten, aber geteiltem Methoden-Code. Instanziierung mit new ClassName(...) in Java/JS, ohne new in Python. Identität (selbes Objekt) ist nicht Gleichheit (gleicher Wert). Auch eingebaute Typen wie String und list sind Klassen – OOP ist überall. Nutze Klassen wenn du echte Entitäten modellierst, nicht für jede triviale Berechnung.
