v4.x/Vererbung: Unterschied zwischen den Versionen
Mike (Diskussion | Beiträge) K (→Konstruktor-Methode) |
Mike (Diskussion | Beiträge) K (→Konstruktor mit Parametern) |
||
(30 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 14: | Zeile 14: | ||
[[Datei:EduActor-Unterklassen.png|mini|Klassendiagramm der Vererbungs-Hierarchie: Unterklassen von EduActor und die Klasse Audio außerhalb dieser Hierarchie]] | [[Datei:EduActor-Unterklassen.png|mini|Klassendiagramm der Vererbungs-Hierarchie: Unterklassen von EduActor und die Klasse Audio außerhalb dieser Hierarchie]] | ||
− | Vererbung bedeutet beim Programmieren, man den Code eines anderen übernimmt und in einer "Ergänzungs-Datei" daran weiter | + | Vererbung bedeutet beim Programmieren, dass man den Code eines anderen übernimmt und in einer "Ergänzungs-Datei" daran weiter arbeitet. Danach kann man auf alle Methoden der Oberklasse(n) zugreifen. Der Sinn ist, dass man z.B. zusätzliche Methoden erstellt oder auf vorgegebene Mechanismen (Mausklick, Tastendruck, ...) mit eigenem Code reagiert. Das nennt man dann ''überschreiben von Methoden''. Man sagt auch, die '''Unterklasse''' ''erweitert'' die '''Oberklasse'''. In JAVA erstellst du eine Unterklasse einer vorgegebenen Oberklasse indem du von dieser ''erbst''. |
=== Vererbungs-Hierarchie der Grafik-Klassen === | === Vererbungs-Hierarchie der Grafik-Klassen === | ||
Zeile 23: | Zeile 23: | ||
=== Erste eigene Unterklasse === | === Erste eigene Unterklasse === | ||
− | Erstelle in deiner Entwicklungsumgebung eine neue Klasse <code>Boden</code>, die von der Klasse <code> | + | [[Datei:Vererbung Boden.png|mini|Boden erbt von (bzw. erweitert) RECHTECK]] |
+ | |||
+ | Erstelle in deiner Entwicklungsumgebung eine neue Klasse <code>Boden</code>, die von der Klasse <code>RECHTECK</code> erbt: | ||
<source lang="java"> | <source lang="java"> | ||
public class Boden | public class Boden | ||
− | extends | + | extends RECHTECK |
{ | { | ||
Zeile 34: | Zeile 36: | ||
Mit <code>public class</code> erstellst du ganz allgemein eine neue Klasse. Nach einem Leerzeichen folgt der Name der Klasse, den du frei wählen kannst. | Mit <code>public class</code> erstellst du ganz allgemein eine neue Klasse. Nach einem Leerzeichen folgt der Name der Klasse, den du frei wählen kannst. | ||
− | <code>extends</code> gibt an, dass diese Klasse von einer anderen Klasse (Oberklasse) erben soll. Nach einem Leerzeichen folgt der | + | <code>extends</code> gibt an, dass diese Klasse von einer anderen Klasse (Oberklasse) erben soll. Nach einem Leerzeichen folgt der exakte Name der Oberklasse. Hier ist Groß- und Kleinschreibung wichtig! |
Innerhalb der geschweiften Klammern wirst du später deinen eigenen Code unterbringen. | Innerhalb der geschweiften Klammern wirst du später deinen eigenen Code unterbringen. | ||
− | Übersetze deine Klasse und erzeuge ein Objekt davon. Rufe einige Methoden auf, die du von KREIS geerbt hast und versichere dich, dass dein Ball nun alles hat | + | Übersetze deine Klasse und erzeuge ein Objekt davon. Rufe einige Methoden auf, die du von KREIS geerbt hast und versichere dich, dass dein Ball nun alles hat bzw. kann, was auch der KREIS hat bzw. kann. Du hast übrigens nicht nur von <code>KREIS</code> geerbt. Da <code>KREIS</code> wiederum von <code>EduActor</code> erbt, verfügt dein Objekt auch über dessen Methoden wie z.B. <code>macheDynamisch()</code>. |
+ | |||
+ | ==== Konstruktor-Methode ==== | ||
− | + | [[Datei:Boden v1.gif|mini|Ergebnis in BlueJ]] | |
− | Der Konstruktor einer Klasse ist eine Methode, die später die Objekte erzeugt. Du kennst die Konstruktoren | + | Der Konstruktor einer Klasse ist eine Methode, die später die Objekte erzeugt. Du kennst die Konstruktoren von <code>RECHTECK</code> und <code>KREIS</code> bereits. Du hast damit im vorigen Tutorial die Objekte erzeugt. In BlueJ hast du dazu mit rechts auf die Klassenkarte geklickt und z.B. <code>new Ball()</code> oder <code>new KREIS()</code> aufgerufen. |
Bei deiner Klasse <code>Boden</code> hast du gerade einen Konstruktor benutzt, ohne einen geschrieben zu haben. BLueJ hat hier für dich stillschweigend den geerbten Konstruktor aufgerufen. In deinem eigenen Konstruktor kannst du aber selbst entscheiden, wie neue Objekte aussehen: | Bei deiner Klasse <code>Boden</code> hast du gerade einen Konstruktor benutzt, ohne einen geschrieben zu haben. BLueJ hat hier für dich stillschweigend den geerbten Konstruktor aufgerufen. In deinem eigenen Konstruktor kannst du aber selbst entscheiden, wie neue Objekte aussehen: | ||
− | < | + | <source lang="java"> |
public class Boden | public class Boden | ||
extends RECHTECK | extends RECHTECK | ||
Zeile 57: | Zeile 61: | ||
} | } | ||
} | } | ||
− | </code> | + | </source> |
+ | |||
+ | Mit <code>public Boden()</code> erstellst du einen Konstruktor, der keine Parameter entgegen nimmt. Der Konstruktor muss immer genau so heißen wie die Klasse. Als Methode bekommt er jedoch runde Klammern. In seinem ''Rumpf'' richtest du dein Objekt so ein, wie du es haben möchtest, wenn es neu erzeugt wird. | ||
+ | <code>super()</code> bewirkt, dass der geerbte Konstruktor erst einmal all das tut, was du kennst: Ein kleines rotes Rechteck oben rechts im Fenster. | ||
+ | Danach wird die Größe angepasst, der Mittelpunkt gesetzt, die Reibung eingestellt und der Boden statisch gemacht. | ||
+ | |||
+ | Übersetze deine Klasse und erzeuge ein Objekt davon. Funktioniert alles? | ||
+ | |||
+ | ==== Konstruktor mit Parametern ==== | ||
+ | |||
+ | [[Datei:Boden v2.gif|mini|Ergebnis in BlueJ]] | ||
+ | |||
+ | Du kennst von den Klassen <code>KREIS</code> und <code>RECHTECK</code> bereits Konstruktoren mit Parametern: <code>new KREIS(double radius)</code> oder <code>new RECHTECK(double breite, double hoehe)</code>. Solche Konstruktoren sollst du nun in deiner Klasse erstellen: | ||
+ | |||
+ | <source lang="java"> | ||
+ | public class Boden | ||
+ | extends RECHTECK | ||
+ | { | ||
+ | public Boden() | ||
+ | { | ||
+ | . . . | ||
+ | } | ||
+ | |||
+ | public Boden(String anfangsFarbe) | ||
+ | { | ||
+ | super(20,0.5); | ||
+ | super.setzeFarbe(anfangsFarbe); | ||
+ | super.macheStatisch(); | ||
+ | } | ||
+ | |||
+ | public Boden(double x, double y) | ||
+ | { | ||
+ | super(20,0.5); | ||
+ | super.setzeMittelpunkt(x,y); | ||
+ | super.macheStatisch(); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | Mit <code>public Boden(String anfangsFarbe)</code> erstellst du einen neuen Konstruktor, der einen Text als Parameter entgegen nimmt. Dem Parameter <code>anfangsFarbe</code> übergibst du später den gewünschten Farbnamen. | ||
+ | Diesmal wird gleich der geerbte Konstruktor von <code>RECHTECK</code> aufgerufen, dem man Breite und Höhe übergeben kann. Das verkürzt den eigenen Code. | ||
+ | Die geerbte Methode <code>setzeFarbe(...)</code> wird nun aufgerufen und ihr der Parameter des Konstruktors übergeben. Beachte, dass <code>anfangsFarbe</code> hier nicht in Anführungszeichen steht, da es ja nur eine Variable (immer ohne Anführungszeichen) und kein konkreter Farbname (immer mit Anführungszeichen) ist. | ||
+ | Der dritte Konstruktor <code>public Boden(double x, double y)</code> nimmt dann zwei Kommazahlen als künftige Koordinaten entgegen. | ||
+ | Die Parameter <code>x</code> und <code>y</code> werden nun in der Methode <code>setzeMittelpunkt(...)</code> eingesetzt. | ||
+ | |||
+ | == Anregungen zum Experimentieren == | ||
+ | |||
+ | [[Datei:Ball v1.gif|mini|Ergebnis in BlueJ]] | ||
+ | |||
+ | * Schreibe eine Unterklasse von <code>KREIS</code> und nenne sie <code>Ball</code>. Ein neuer Ball soll den Radius 1 haben, eine Elastizität von 0.7, einen Reibungskoeffizienten von 0.3. Er soll bei den Koordinaten (0|8) erscheinen und dynamisch sein. Übersetze deine Klasse und erzeuge ein Objekt davon. Funktioniert alles? | ||
+ | * Schreibe einen zweiten Konstruktor, der die Farbe des Balls entgegen nimmt. Übersetze deine Klasse und teste diesen Konstruktor. | ||
+ | * Schreibe einen dritten Konstruktor, der die Mittelpunkt-Koordinaten entgegen nimmt. Übersetze deine Klasse und teste diesen Konstruktor. | ||
+ | |||
− | |||
− | + | {{4.xTutorialFooter| | |
+ | [[v4.x/Attrbute_und_Referenzen|Attribute und Referenzen]] | ||
+ | }} |
Aktuelle Version vom 12. Juni 2023, 08:15 Uhr
Dies ist ein Tutorial für die Edu-Variante der Engine Alpha 4.x. Eine Übersicht aller Edu-Tutorials siehst du hier.
Inhaltsverzeichnis
Inhalt
In diesem Tutorial:
- Lernst du die grundlegende Vererbungs-Hierarchie der Edu-Engine kennen
- Schreibst du deine erste eigene Klasse
Vererbung
Vererbung bedeutet beim Programmieren, dass man den Code eines anderen übernimmt und in einer "Ergänzungs-Datei" daran weiter arbeitet. Danach kann man auf alle Methoden der Oberklasse(n) zugreifen. Der Sinn ist, dass man z.B. zusätzliche Methoden erstellt oder auf vorgegebene Mechanismen (Mausklick, Tastendruck, ...) mit eigenem Code reagiert. Das nennt man dann überschreiben von Methoden. Man sagt auch, die Unterklasse erweitert die Oberklasse. In JAVA erstellst du eine Unterklasse einer vorgegebenen Oberklasse indem du von dieser erbst.
Vererbungs-Hierarchie der Grafik-Klassen
In der Edu-Engine gibt es bereits vorhandene Vererbung. So sind alle grafisch darstellbaren Klassen Unterklassen der Oberklasse EduActor
.
Vererbung stellt man im Klassendiagramm durch einen Pfeil mit durchgezogener Linie und geschlossener Pfeilspitze dar.
Erste eigene Unterklasse
Erstelle in deiner Entwicklungsumgebung eine neue Klasse Boden
, die von der Klasse RECHTECK
erbt:
public class Boden
extends RECHTECK
{
}
Mit public class
erstellst du ganz allgemein eine neue Klasse. Nach einem Leerzeichen folgt der Name der Klasse, den du frei wählen kannst.
extends
gibt an, dass diese Klasse von einer anderen Klasse (Oberklasse) erben soll. Nach einem Leerzeichen folgt der exakte Name der Oberklasse. Hier ist Groß- und Kleinschreibung wichtig!
Innerhalb der geschweiften Klammern wirst du später deinen eigenen Code unterbringen.
Übersetze deine Klasse und erzeuge ein Objekt davon. Rufe einige Methoden auf, die du von KREIS geerbt hast und versichere dich, dass dein Ball nun alles hat bzw. kann, was auch der KREIS hat bzw. kann. Du hast übrigens nicht nur von KREIS
geerbt. Da KREIS
wiederum von EduActor
erbt, verfügt dein Objekt auch über dessen Methoden wie z.B. macheDynamisch()
.
Konstruktor-Methode
Der Konstruktor einer Klasse ist eine Methode, die später die Objekte erzeugt. Du kennst die Konstruktoren von RECHTECK
und KREIS
bereits. Du hast damit im vorigen Tutorial die Objekte erzeugt. In BlueJ hast du dazu mit rechts auf die Klassenkarte geklickt und z.B. new Ball()
oder new KREIS()
aufgerufen.
Bei deiner Klasse Boden
hast du gerade einen Konstruktor benutzt, ohne einen geschrieben zu haben. BLueJ hat hier für dich stillschweigend den geerbten Konstruktor aufgerufen. In deinem eigenen Konstruktor kannst du aber selbst entscheiden, wie neue Objekte aussehen:
public class Boden
extends RECHTECK
{
public Boden()
{
super();
super.setzeGroesse(20,0.5);
super.setzeMittelpunkt(0,-8);
super.setzeReibung(0.2);
super.macheStatisch();
}
}
Mit public Boden()
erstellst du einen Konstruktor, der keine Parameter entgegen nimmt. Der Konstruktor muss immer genau so heißen wie die Klasse. Als Methode bekommt er jedoch runde Klammern. In seinem Rumpf richtest du dein Objekt so ein, wie du es haben möchtest, wenn es neu erzeugt wird.
super()
bewirkt, dass der geerbte Konstruktor erst einmal all das tut, was du kennst: Ein kleines rotes Rechteck oben rechts im Fenster.
Danach wird die Größe angepasst, der Mittelpunkt gesetzt, die Reibung eingestellt und der Boden statisch gemacht.
Übersetze deine Klasse und erzeuge ein Objekt davon. Funktioniert alles?
Konstruktor mit Parametern
Du kennst von den Klassen KREIS
und RECHTECK
bereits Konstruktoren mit Parametern: new KREIS(double radius)
oder new RECHTECK(double breite, double hoehe)
. Solche Konstruktoren sollst du nun in deiner Klasse erstellen:
public class Boden
extends RECHTECK
{
public Boden()
{
. . .
}
public Boden(String anfangsFarbe)
{
super(20,0.5);
super.setzeFarbe(anfangsFarbe);
super.macheStatisch();
}
public Boden(double x, double y)
{
super(20,0.5);
super.setzeMittelpunkt(x,y);
super.macheStatisch();
}
}
Mit public Boden(String anfangsFarbe)
erstellst du einen neuen Konstruktor, der einen Text als Parameter entgegen nimmt. Dem Parameter anfangsFarbe
übergibst du später den gewünschten Farbnamen.
Diesmal wird gleich der geerbte Konstruktor von RECHTECK
aufgerufen, dem man Breite und Höhe übergeben kann. Das verkürzt den eigenen Code.
Die geerbte Methode setzeFarbe(...)
wird nun aufgerufen und ihr der Parameter des Konstruktors übergeben. Beachte, dass anfangsFarbe
hier nicht in Anführungszeichen steht, da es ja nur eine Variable (immer ohne Anführungszeichen) und kein konkreter Farbname (immer mit Anführungszeichen) ist.
Der dritte Konstruktor public Boden(double x, double y)
nimmt dann zwei Kommazahlen als künftige Koordinaten entgegen.
Die Parameter x
und y
werden nun in der Methode setzeMittelpunkt(...)
eingesetzt.
Anregungen zum Experimentieren
- Schreibe eine Unterklasse von
KREIS
und nenne sieBall
. Ein neuer Ball soll den Radius 1 haben, eine Elastizität von 0.7, einen Reibungskoeffizienten von 0.3. Er soll bei den Koordinaten (0|8) erscheinen und dynamisch sein. Übersetze deine Klasse und erzeuge ein Objekt davon. Funktioniert alles? - Schreibe einen zweiten Konstruktor, der die Farbe des Balls entgegen nimmt. Übersetze deine Klasse und teste diesen Konstruktor.
- Schreibe einen dritten Konstruktor, der die Mittelpunkt-Koordinaten entgegen nimmt. Übersetze deine Klasse und teste diesen Konstruktor.
Das Tutorial ist beendet. Das nächste ist Attribute und Referenzen . Wenn du Feedback für uns hast, melde dich gerne.