Klassen und Objekte
Am Ende des letzten Kapitels standen Name und Punktzahl in zwei getrennten Feldern – und nichts im Programm sicherte, dass sie zusammenblieben. Das ist der Moment, in dem man aufhört, Abläufe zu programmieren, und anfängt, die Dinge selbst zu modellieren.
Objekte in der Welt und im Programm
Du hast längst mit Objekten gearbeitet: hase war ein Sprite-Objekt, stift ein Pen-Objekt. Beide hatten Eigenschaften (Position, Farbe, Größe) und Fähigkeiten (setPosition, down, say).
Eine Klasse ist der Bauplan. Sie legt fest, welche Eigenschaften und Fähigkeiten alle Objekte dieser Art haben.
Ein Objekt ist ein konkretes Exemplar nach diesem Bauplan. Es hat eigene Werte für die Eigenschaften.
Die Eigenschaften heißen Attribute, die Fähigkeiten Methoden.
Ein Bauplan „Auto“ legt fest, dass jedes Auto eine Marke, einen Kilometerstand und einen Preis hat. Das rote Auto vor der Tür und das blaue in der Garage sind zwei Objekte derselben Klasse – mit unterschiedlichen Werten.
Die erste eigene Klasse
Zuerst der Bauplan als Diagramm. So ein Implementationsdiagramm liest man von oben nach unten: Name, Attribute, Methoden.
classDiagram
class Auto {
-String marke
-int kilometerstand
-double preis
+Auto(String pMarke, int pKm, double pPreis)
+void macheProbefahrt(int pKm)
+void aenderePreisUm(double pBetrag)
+void schreibeInfos()
}
Und jetzt derselbe Bauplan in Java:
| Begriff | im Beispiel |
|---|---|
| Klasse | Auto – steht in einer eigenen Datei Auto.java |
| Attribut | marke, kilometerstand, preis |
| Konstruktor | public Auto(...) – heißt genau wie die Klasse und hat keinen Rückgabetyp |
| Methode | macheProbefahrt, aenderePreisUm, schreibeInfos |
| Objekt erzeugen | new Auto("VW", 84000, 7500.0) |
| Methode aufrufen | ersterWagen.macheProbefahrt(35) |
Der Klassenname beginnt groß, der Dateiname muss damit übereinstimmen.
Jedes Objekt hat eigene Werte
Im Programm oben wird nur ersterWagen verändert.
a) Sage voraus, was nach der Probefahrt für beide Autos ausgegeben wird.
b) Erkläre, warum sich zweiterWagen nicht mitverändert – obwohl beide dieselben Attribute haben.
Auflösung
a)
VW, 84035 km, 7000.0 Euro
Fiat, 12000 km, 14900.0 Euro
b) Die Klasse legt fest, dass es ein Attribut kilometerstand gibt. Die Werte gehören aber jedem Objekt einzeln. ersterWagen und zweiterWagen haben je einen eigenen Satz Attributwerte.
Genau das ist der Fortschritt gegenüber den parallelen Feldern: Marke, Kilometerstand und Preis eines Autos können gar nicht mehr auseinanderlaufen, weil sie in einem Objekt stecken.
Objekte im Feld
new Auto[3] legt ein Feld für drei Verweise an – aber noch kein einziges Auto. Auf allen drei Plätzen steht zunächst null, das heißt „kein Objekt“.
Erst flotte[0] = new Auto(...) erzeugt ein Auto und trägt den Verweis ein. Wer das vergisst und trotzdem flotte[0].schreibeInfos() aufruft, bekommt einen Laufzeitfehler.
Aufgabe 1: Klasse Schueler
Modelliere eine Klasse Schueler.
a) Zeichne zuerst auf Papier das Implementationsdiagramm: Welche Attribute braucht ein Schüler-Objekt, welche Methoden?
b) Setze es dann um, sodass alle Tests grün werden.
Tipp: Attribut und Parameter unterscheiden
Im Konstruktor stehen zwei Dinge mit ähnlicher Bedeutung nebeneinander: der Parameter pName (kommt von außen) und das Attribut name (gehört zum Objekt).
Deshalb das p vor den Parametern: name = pName; ist eindeutig lesbar.
Aufgabe 2: Eine eigene Klasse modellieren
Such dir einen Gegenstand aus deiner Umgebung aus – ein Smartphone, ein Fahrrad, ein Buch, ein Getränkeautomat.
a) Ermittle bei der Analyse: Welche Eigenschaften hat er? Welche Operationen kann man mit ihm ausführen?
b) Zeichne das Implementationsdiagramm.
c) Setze die Klasse um und erzeuge im Hauptprogramm mindestens zwei Objekte davon.
d) Beurteile deinen eigenen Entwurf: Hast du Eigenschaften aufgenommen, die man gar nicht braucht? Fehlt etwas?
Zusatzaufgabe
Die Klasse Auto hat eine Schwachstelle: macheProbefahrt(-100) verringert den Kilometerstand. Das wäre in der Praxis Betrug.
a) Probiere es aus und überzeuge dich, dass es tatsächlich funktioniert.
b) Ändere die Methode so, dass negative Angaben wirkungslos bleiben.
c) Überlege: Reicht das? Kann man den Kilometerstand jetzt noch auf anderem Weg manipulieren?
Die Antwort auf c) führt direkt in die nächste Lektion.