Skip to Content

9.6 Übungen

Stefan Schneider's picture

Duke als Boxer

(Lizenz)

9.6.1 Aufruf von überschriebenen Methoden

Implementieren sie die Klasse TopClass mit den folgenden Eigenschaften

  • statische, geschütztes (protected) Attribut zaehlerTop zum Zählen der erzeugten Instanzen der Klasse TopClass
  • parameterlosen Konstruktor der den Instanzenzähler inkrementiert.
  • eine statische geschützte Methode getZaehler() die das Attribut zaehlerTop ausgibt.

Implementieren Sie die Klasse LowClass welche aus TopClass abgeleitet mit den folgenden Eigenschaften 

  • statische, geschütztes (protected) Attribut zaehler zum Zählen der erzeugten Instanzen der Klasse LowClass
  • parameterlosen Konstruktor der den Instanzenzähler inkrementiert
  • eine statische geschützte Methode getZaehler() die das Attribut zaehler ausgibt.
  • eine Methode test() die
    • die lokale Methode getZaehler() aufruft und das Ergebnis auf der Konsole ausgibt
    • die Methode getZaehler() der Oberklasse aufruft und das Ergebnis auf der Konsole ausgibt

Implementieren Sie ein Hauptprogramm, dass folgende Befehle ausführt

  • Anlegen eines Feldes der Klasse TopClass mit n Elementen
  • Anlegen eines Feldes der Klasse LowClass mit n Elementen
  • Erzeugen von jeweils n Elementen der Klasse TopClass und Einfügen in das zugehörige Feld
  • Aufruf der getZaehler() Methode der Klasse TopClass und Ausgabe des Wertes auf der Konsole
  • Erzeugen von jeweils n Elementen der Klasse LowClass und Einfügen in das zugehörige Feld
  • Aufruf der getZaehler() Methode der Klasse LowClass und Ausgabe des Wertes auf der Konsole
  • Aufruf der getZaehler() Methode der Klasse TopClass und Ausgabe des Wertes auf der Konsole
UML Diagramm TopClass, LowClass

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?

Point und Circle, Delegation versus Assoziation

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:

UML Diagramm Ware und Lager, 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;
}
}
}



about seo | book