|
(Lizenz) |
9.6.1 Aufruf von überschriebenen MethodenImplementieren sie die Klasse TopClass mit den folgenden Eigenschaften
|
|
Implementieren Sie die Klasse LowClass welche aus TopClass abgeleitet mit den folgenden Eigenschaften
Implementieren Sie ein Hauptprogramm, dass folgende Befehle ausführt
|
![]() |
Zu beobachten:
- Wieviel Instanzen welcher Klasse (TopClass, LowClass) wurden erzeugt?
- Wieviel Instanzen wurden insgesamt erzeugt?
- Was geschieht wenn das Attribut zaehler der Klasse LowClass gelöscht wird?
Klasse MainTop zum Testen
package block9;
/**
*
* @author sschneid
*/
public class MainTop {
private static int size = 3;
public static void main(String[] args) {
TopClass[] feldT = new TopClass[size];
LowClass[] feldL = new LowClass[size]; for ( int i=0; i<size; i++) feldT[i]= new TopClass(); for ( int i=0; i<size; i++) {feldL[i]= new LowClass();
feldL[i].test();
}
System.out.println(TopClass.getZaehler() + " Instanzen TopClass generiert, "+
LowClass.getZaehler() + " Instanzen LowClass generiert");
}
}
9.6.2 Vererbung und Assoziation
Implementieren Sie eine Klasse Point mit den folgenden Eigenschaften:
- private Fliesskommaattribute für x und y Koordinate
- öffentlicher Konstruktor mit x und x als Parameter
- öffentliche setXY(x,y) Methode
- Auslesemethoden getX(), getY()
- print() Methode die eine Zeichenkette mit allen Werten liefert
- überschreiben die die toString() Methode von Object so das sie alle Werte für Point ausgibt.
Implementieren Sie eine Klasse CircleIsPoint die die Eigenschaften der Klasse Point hat und zusätzlich einen Radius verwalten kann mit folgenden Eigenschaften:
- erbt von Point
- das des Zentrum des Kreises sind die (x,y) Koordinaten von Point
- privates Fliesskomma Attribut für den Radius radius
- getRadius() und setRadius(r) Methoden zum Pflegen des Attributs
- öffentlicher Konstruktor für (x,y) Zentrum und Radius
- print() Methode die eine Zeichenkette mit allen Werten liefert
- überschreiben die die toString() Methode von Object so das sie alle Werte für Point ausgibt.
Implementieren Sie eine Klasse CircleHasPoint die die Eigenschaften der Klasse Point hat und zusätzlich einen Radius verwalten kann mit folgenden Eigenschaften:
- erbt nicht von Point
- benutzt privates Attribut vom Referenztyp auf Point
- das des Zentrum des Kreises sind die (x,y) Koordinaten von Point
- alle öffentlichen Methoden sind identisch zu CircleIsPoint!
Was unterscheidet beide Implementierungen? Welche ist die bessere Implementierung?

Klasse Main
Die drei obigen Klassen sollten mit der folgenden main() Methode funktionieren:
package block9;
public class Main {
public static void main(String[] args) {
Point p1 = new Point (2.2, 3.3);
Point p2 = new Point (2.22, 3.33);
CircleIsPoint cip1 = new CircleIsPoint(4.4,5.5,6.6);
p1.print();
cip1.print();
CircleHasPoint chp1 = new CircleHasPoint(44.4,55.5,66.6);
chp1.print();
}
}
9.6.3 Schrittweise Überführung in die Vererbung
Dieses Programmierbeispiel wird in der Vorlesung schrittweise entwickelt. Die Arbeitsanweisungen sind als Kommentare im Programmcode eingefügt.
Die Ausgangssituation:

Klasse Main
Das Hauptprogramm wird zu Beginn die Klasse Buch noch nicht verwenden.
package block9;
/**
* Eine Hilfsklasse zur Implementierung eines Hauptprogramms
* @author sschneid
* @version 1.0
*/
public class Main {
/**
* Die Methode wareTesten testet die Implementierung der
* von Waren mit tiefem Kopieren, tiefem Vergleichen.
* Sie nutzt nicht die Vererbung aus.
*/
public static void warenTesten() {
Ware ware1, ware2;
Lager dasLager;
// Testen der Klasse Ware
ware1 = new Ware("Zeitung", 12.12, true);
ware1.drucken();
double p = ware1.getNettoPreis();
// Generieren von Empfehlungen
ware2 = new Ware("Potter Band 1", 31.12, false);
ware2.generiereEmpfehlungen(7);
// Abfrage des Lagers
dasLager = Lager.getLager();
dasLager.einlagern(ware1, 0);
dasLager.einlagern(ware2, 1);
// Prüfen der Lagerbestände mit tiefem Vergleichen
Ware testWare = dasLager.holen(0);
if (testWare == ware2)
System.out.println("testware und ware2 sind identisch (gut)");
if (testWare.equals(ware2))
System.out.println("testware und ware2 sind inhaltsgleich (gut)");
// vollständiges Befüllen des Lager
for (int i = 0; i < 1000; i++) {
ware2 = new Ware("Band" + i + "B", 12.12, true);
ware2.generiereEmpfehlungen(7);
dasLager.einlagern(ware2);
}
System.out.println("Lager vollständig gefüllt mit "
+ dasLager.lagerGroesse() + " Waren.");
for (int i = 0; i < 1000; i++) {
ware2 = new Ware("Volume" + i + "B", 12.12, true);
ware2.generiereEmpfehlungen(7);
dasLager.einlagern(ware2,i);
}
System.out.println("Lager erneut vollständig gefüllt mit "
+ dasLager.lagerGroesse() + " Waren.");
}
/**
* Diese Methode dient zum Testen der Klasse Buch.
* Sie nutzt die Veererbung in Java aus.
*/
public static void buecherTesten() {
/*
* 2. Testen: Anlegen einer Testmethode für Bücher
* Erzeugen von Büchern
* Anlegen einer Referenz auf eine alte Auflage
* Drucken zweier Bücher
* 3. Frage: Wie kann man Bücher in das Lager einfügen?
* 5. Einfügen der Bücher in das Lager
* 8. Anpassen der Hauptroutine
* 8.1 Alle Instanzen vom Typ Ware sollen MusikCDs werden da die Klasse
* Ware jetzt abstrakt ist.
*/
Lager dasLager;
dasLager = Lager.getLager();
//Buch buch1 = new Buch("Das Grauen",22.22,"9876543");
//Buch buch2 = new Buch("Das Kapital",33.33,"9876543");
//buch1.setAlteAuflage(buch2);
//buch1.drucken();
//dasLager.einlagern(buch1);
//dasLager.einlagern(buch2);
dasLager.drucken();
}
/**
* Das Hauptprogramm
*
* @param args
*/
public static void main(String[] args) {
warenTesten();
buecherTesten();
}
}
Klasse Lager
package block9;
/**
* Die Klasse Lager verwaltet eine bestimmte Anzahl von Waren
* @author sschneid
* @version 1.0
*/
public class Lager {
private static Lager instanz = null;
/**
* privates Feld zum Verwalten der Waren
*/
private Ware[] bestand;
/**
* * Groesse des Bestands
*/
private int initBestand = 20;
/**
* Standardkonstruktor der das Lager initialisiert
*/
private Lager() {
bestand = new Ware[initBestand];
}
/**
*
* @return Groesse des Lagers
*/
public int lagerGroesse() {return bestand.length;}
public static Lager getLager() {
if (instanz == null) {
instanz = new Lager();
}
return instanz;
}
/**
* Einlagern von Waren. Existierende Waren werden verdraengt.
* Lager wird dynamisch vergrößert
* @param ware1
* @param pos
*/
public void einlagern(Ware ware1,int pos) {
if (pos>=bestand.length) {
// Erzeuge neues Lager welches 2x größer als das geforderte
// Element ist und kopiere alles die das neue Feld
Ware[] tempBestand = new Ware[pos*2];
System.arraycopy(bestand,0,tempBestand,0,bestand.length);
bestand = tempBestand;
}
bestand[pos] = ware1;
}
/**
* Einlagern von Waren. Es wird die erste freie Position gesucht.
* Lager wird dynamisch vergrößert
* @param ware1
* @return eingelagerte Position
*/
public int einlagern(Ware ware1) {
int freiePosition=0;
while ((freiePosition<bestand.length) && (bestand[freiePosition]!=null))
freiePosition++;
einlagern(ware1,freiePosition);
return freiePosition;
}
/**
*
* @param pos die Position der Ware im Lager
* @return eine Referenz auf die Ware. Der Zeiger kann ein null Zeiger sein.
*/
public Ware holen(int pos) {
return bestand[pos];
} /**** drucken des Lagerbestands. Es werden nur die Namen der Produkte
* ausgegeben
*/
public void drucken() {
System.out.println("*** Lagerbestand ***");
for (int i=0; i < bestand.length; i++) {
if (bestand[i]== null)
System.out.println("bestand[" +i + "]: leer");
else
System.out.println("bestand[" +i + "]: " +
bestand[i].getName());
}
System.out.println("*** Lagerbestand (Ende)***");
}
}
Klasse Ware
package block9;
/**
* Dies ist die Dokumentation der Klasse Ware. Ware dient zum Verwalten von Gütern
* mit Preisen und Namen in einem Lager.
* @author Stefan Schneider
* @version 1.0
* @see Lager
*/
public class Ware {
/*
* 1. Erzeugen Sie eine Klasse Buch in dem Sie die Klasse
* Ware mit Ihrem Inhalt kopieren
* 1.1 Anpassen Name
* 1.2 Anpassen Konstruktoren
* 1.3 Anpassen equals Methode
* 1.4 Anlegen einer ISBN Nummer
* 1.5 Anlegen einer hardcodierten halben Mehrwertsteuer
* 1.6 Referenz auf eine private, optionale (ältere) Auflage
* Zugriffsmethoden anlegen
* 1.7 Anpassen der Druckenmethode
* 4. Ableiten der Klasse aus der Klasse aus der Klasse Ware
* 4.1 extends Schlüsselwort benutzen
* 4.2 Löschen von allem redundanten Code
* 6. Erzeugen er Klasse MusikCD durch Kopieren der Klasse Ware
* 6.1 Mehrwertsteuer auf vollen Mehrwertsteuer hart kodieren
* 7. Die Klasse Ware soll nicht mehr instanziiert werden. Sie soll
* abstrakt werden
*/
/**
* Der aktuelle Mehrwertsteuersatz 2010.
* Er liegt zur Zeit bei {@value}.
*
* @since 1.0
*/
public static final double mws = 0.19;
private double nettoPreis; //Deklaration
private boolean halbeMws;
private String name;
public Ware empfehlung;
/**
* Konstruktor fuer die Klasse Ware
* @param n der Name der Ware
* @param np der Nettorpreis
* @param hmws halber Mehrwertsteuersatz für Ware gueltig
*/
public Ware(String n, double np, boolean hmws) {
name = n;
nettoPreis = np;
halbeMws = hmws;
// zusätzliche Initialiserungen....
}
/**
* tiefes Vergleichen. Berücksichtigt beim Namen nicht
* die Groß/kleinschreinung. Berücksichtigt rekursiv die
* Empfehlungen
* @param dieAndereWare
* @return wahr wenn beide Waren dem Vergleich entsprechen.
*/
public boolean equals(Ware dieAndereWare) {
boolean result;
result = getName().equalsIgnoreCase(dieAndereWare.getName())
&& (getNettoPreis() == dieAndereWare.getNettoPreis())
&& (getHalbeMws() == dieAndereWare.getHalbeMws())
&& (((getEmpfehlung() == null) && (dieAndereWare.getEmpfehlung() == null))
|| ((getEmpfehlung() != null)
&& (dieAndereWare.getEmpfehlung() != null)
&& (getEmpfehlung().equals(dieAndereWare.getEmpfehlung()))
)
);
return result;
}
/**
* Liefert den Namen einer Ware zurueck.
* @return Name der Ware
*/
public String getName() {
return name;
} /** * Setzen eines neuen Nettopreis * @param npr der neue Nettopreis */public void setNettoPreis(double npr) {
nettoPreis = npr;
}
/**
* liefere wahr zurück wenn Mwssatz reduziert ist
* @return
*/
public boolean getHalbeMws() {return halbeMws;}public Ware getEmpfehlung() { return empfehlung; }
public void setEmpfehlung(Ware empfehlung) {
this.empfehlung = empfehlung;
}
/**
* Ausdrucken aller Werte auf der Konsole
*/
public void drucken() { drucken(0); }
/**
* Ausdrucken aller Werte auf der Konsole mit vorgebener Einrueckung
* für Empfehlungen
* @param einruecken eingerueckte Stellen für Empfehlungen
*/
protected void drucken(int einruecken) {
String leerStellen = "";
for (int i = 0; i < einruecken; i++) {
leerStellen = leerStellen + " ";
}System.out.print(leerStellen + "Name: " + getName());
System.out.print(" ;Netto: " + getNettoPreis());
System.out.print(" ;Brutto: " + getBruttoPreis());
if (halbeMws)
System.out.println(" (Halbe Mws)");
else
System.out.println(" (Volle Mws)");
if (empfehlung != null) {
System.out.println(leerStellen + "Empfehlung:");
empfehlung.drucken(einruecken + 2);
}
}
/**
* Ausgabe des Nettopreis
* @return der Nettopreis
*/
public double getNettoPreis() {
return nettoPreis;
}
/**
* Ausgabe des Bruttopreis
* @return der Bruttopreis
*/
public double getBruttoPreis() {
double bp; //temporaere Variable; keine Klassenvariable
if (halbeMws) {
bp = Math.round(nettoPreis * (mws / 2 + 1) * 100) / 100;
} else {
bp = Math.round(nettoPreis * (mws + 1) * 100) / 100;
}
return bp;
}
/**
* Erzeugt verkette Liste einer Ware
* @param Anzahl der zu verkettenden Waren
*/
public void generiereEmpfehlungen(int empf) {
Ware ware1 = this;
Ware ware2;
for (int i = 1; i <= empf; i++) {
ware2 =
new Ware(ware1.getName() + " " + i, 31.12, false);
ware1.setEmpfehlung(ware2);
ware1 = ware2;
}
}
}


