8.7 Lösungen
8.7 Lösungen8.7.1 Vererbung und Überschreiben
Klasse TopClass
package s1.block8; public class TopClass { protected static int zaehler; public TopClass() {zaehler++;} protected static int getZaehler() {return zaehler;} }
Klasse LowClass
public class LowClass extends TopClass { protected static int zaehler; public LowClass() {zaehler++;} protected static int getZaehler() {return zaehler;} protected void test (){ System.out.println( getZaehler() + " Instanzen der Klasse LowClass erzeugt"); System.out.println( TopClass.getZaehler() + " Instanzen der Klasse TopClass erzeugt"); } public static void main(String[] args) { int size = 3; 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"); } // Ende Methode main() } // Ende Klasse LowClass
Ausgaben (mit Attribut zaehler in Klasse LowClass)
1 Instanzen der Klasse LowClass erzeugt 4 Instanzen der Klasse TopClass erzeugt 2 Instanzen der Klasse LowClass erzeugt 5 Instanzen der Klasse TopClass erzeugt 3 Instanzen der Klasse LowClass erzeugt 6 Instanzen der Klasse TopClass erzeugt 6 Instanzen TopClass generiert, 3 Instanzen LowClass generiert
Ausgaben (ohne Attribut zaehler in Klasse LowClass)
5 Instanzen der Klasse LowClass erzeugt 5 Instanzen der Klasse TopClass erzeugt 7 Instanzen der Klasse LowClass erzeugt 7 Instanzen der Klasse TopClass erzeugt 9 Instanzen der Klasse LowClass erzeugt 9 Instanzen der Klasse TopClass erzeugt 9 Instanzen TopClass generiert, 9 Instanzen LowClass generiert
8.7.2 Vererbung und Assoziation
Klasse Point
package s1.block8; public class Point { private double x; private double y; public Point(double xx, double yy) { x = xx; y = yy; } public void setXY(double xx, double yy) { x = xx; y = yy; } public double getX() { return x;} public double getY() { return y;} public void print() {System.out.println(toString());} public String toString() {return ("x: " + x + " y: " + y);} }
Klasse CircleIsPoint
package s1.block8; public class CircleIsPoint extends Point{ private double radius; public CircleIsPoint(double xx, double yy, double r) { super(xx,yy); radius=r; } public double getRadius() {return radius;} public void setRadius(double r) {radius=r;} public String toString() {return (super.toString() + " , r: " + radius);} }
Klasse CircleHasPoint
package s1.block8; public class CircleHasPoint { private double radius; private Point p; public CircleHasPoint(double xx, double yy, double r) { p = new Point(xx,yy); radius=r; } public double getRadius() {return radius;} public void setRadius(double r) {radius=r;} public void setXY(double xx, double yy) { p.setXY(xx,yy);} public double getX() { return p.getX();} public double getY() { return p.getY();} public void print() {System.out.println(toString());} public String toString() {return ("x: " + p.getX() + " y: " + p.getY() + " r: "+ radius);} }
Klasse Main
package s1.block8; 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(); } }
Ausgabe:
x: 2.2 y: 3.3 x: 4.4 y: 5.5 radius: 6.6 x: 44.4 y: 55.5 radius: 66.6
8.7.3 Beispiel der Vorlesung
Schritt 1: Klonen der Klasse Ware zu Buch und Anpassen
Klasse Buch (nicht von Ware abgeleitet!)
package s1.block8; /** * 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.2 * @see Lager */ public class Buch { /* * 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 Buch empfehlung; private String isbn; private Buch alteAuflage; /** * Referenz aus alte Auflage * @return */ public Buch getAlteAuflage() { return alteAuflage; } /** * zuweisen einer alten Auflage * @param alteAuflage */ public void setAlteAuflage(Buch alteAuflage) { this.alteAuflage = alteAuflage; } /** * Auslesen der ISBN-Nummer (eine Zeichenkette) * @return */ public String getISBN() { return isbn; } /** * Konstruktor fuer die Klasse Ware * @param n der Name der Ware * @param np der Nettopreis * @param myISBN die ISBN Nummer */ public Buch(String n, double np, String myISBN) { name = n; nettoPreis = np; halbeMws = true; //Bei Büchern immer der Fall isbn=myISBN; // 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(Buch 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())) ) && (isbn.equals(dieAndereWare.isbn)) && (((alteAuflage == null) && (dieAndereWare.alteAuflage == null)) || ((alteAuflage != null) && (dieAndereWare.alteAuflage != null) && (alteAuflage.equals(dieAndereWare.alteAuflage)) ) ) ); 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 Buch getEmpfehlung() { return empfehlung; } public void setEmpfehlung(Buch 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 */ private 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); } System.out.println(leerStellen + "ISBN:" +isbn); if (alteAuflage != null) { System.out.println(leerStellen + "Alte Auflage:"); alteAuflage.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 von Empfehlungen * @param empf Anzahl Empfehlungen */ public void generiereEmpfehlungen(int empf) { Buch ware1 = this; Buch ware2; for (int i = 1; i <= empf; i++) { ware2 = new Buch(ware1.getName() + " besser" + i, 31.12, isbn+"-1"); ware1.setEmpfehlung(ware2); ware1 = ware2; } } }
Klasse Main
package s1.block8; /** * Eine Hilfsklasse zur Implementierung eines Hauptprogramms * @author s@scalingbits.com * @version 1.1 */ public class MainWare { /** * 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(); } }
Schritt 2: Die Klasse Buch wird aus der Klasse Ware abgeleitet
Klasse Buch
package s1.block8; /** * 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.2 * @see Lager */ public class Buch extends 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 */ private String isbn; private Buch alteAuflage; /** * Referenz aus alte Auflage * @return */ public Buch getAlteAuflage() { return alteAuflage; } /** * zuweisen einer alten Auflage * @param alteAuflage */ public void setAlteAuflage(Buch alteAuflage) { this.alteAuflage = alteAuflage; } /** * Auslesen der ISBN-Nummer (eine Zeichenkette) * @return */ public String getISBN() { return isbn; } /** * Konstruktor fuer die Klasse Ware * @param n der Name der Ware * @param np der Nettorpreis * @param hmws halber Mehrwertsteuersatz für Ware gueltig */ public Buch(String n, double np, String myISBN) { super(n,np,true); isbn=myISBN; // 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(Buch dieAndereWare) { boolean result; result = super.equals((Ware)dieAndereWare) && (isbn.equals(dieAndereWare.isbn)) && (((alteAuflage == null) && (dieAndereWare.alteAuflage == null)) || ((alteAuflage != null) && (dieAndereWare.alteAuflage != null) && (alteAuflage.equals(dieAndereWare.alteAuflage)) ) ); return result; } /** * Ausdrucken aller Werte auf der Konsole mit vorgebener Einrueckung * für Empfehlungen * @param einruecken eingerueckte Stellen für Empfehlungen */ protected void drucken(int einruecken) { super.drucken(einruecken); String leerStellen = ""; for (int i = 0; i < einruecken; i++) { leerStellen = leerStellen + " "; } System.out.println(leerStellen + "ISBN:" +isbn); if (alteAuflage != null) { System.out.println(leerStellen + "Alte Auflage:"); alteAuflage.drucken(einruecken + 2); } } }
Klasse MainBuch
Die Instanzen der Klasse Buch können jetzt in das Lager eingefügt werden
package s1.block8; /** * Eine Hilfsklasse zur Implementierung eines Hauptprogramms * @author sschneid */ public class MainBuch { /** * 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(); } }
Stufe 3: Klasse MusikCD
Klasse MusikCD
package s1.block8; /** * Dies ist die Dokumentation der Klasse Ware. Ware dient zum Verwalten von Gütern * mit Preisen und Namen in einem Lager. * @author s@scalingbits.com * @version 1.3 * @see Lager */ public class MusikCD extends Ware { /* * 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 */ /** * Konstruktor fuer die Klasse Ware * @param n der Name der Ware * @param np der Nettorpreis * @param hmws halber Mehrwertsteuersatz für Ware gueltig */ public MusikCD(String n, double np) { super(n,np,false); } /** * 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(MusikCD dieAndereWare) { return super.equals((Ware)dieAndereWare); } }
Klasse MainCD
package s1.block8; /** * Eine Hilfsklasse zur Implementierung eines Hauptprogramms * @author s@scalingbits.com * @version 1.3 */ 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(); } /** * Diese Methode dient zum Testen der Klasse Buch. * Sie nutzt die Veererbung in Java aus. */ public static void CDsTesten() { /* * 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(); MusikCD cd1 = new MusikCD("Thriller",8.88); MusikCD cd2 = new MusikCD("Peter und der Wolf",9.99); cd1.setEmpfehlung(cd2); cd1.drucken(); dasLager.einlagern(cd1); dasLager.einlagern(cd2); dasLager.drucken(); } /** * Das Hauptprogramm * * @param args */ public static void main(String[] args) { //warenTesten(); buecherTesten(); CDsTesten(); } }
- 7536 views
die Zeile: public int
die Zeile:
public int price = 99;
in der Klasse CircleIsPoint ist dort sicher nur aus Versehen hineingeraten?
Yep
Copy und Paste Fehler. Wurde entfernt.