#1 5. Mai 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 Klassen, Objekte, etc.. erstellen und ausgeben Hi, ich muss für die Uni eine Aufgabe machen in Java -.- Wir haben so ein UML-Diagramm bekommen: Die Aufgabenbeschreibung: Spoiler In dieser Aufgabe geht es darum, ein Portfolio zu simulieren: Der Kurs einer Aktie und den Kurs einer Anleihe werden zufällig geändert und der resultierende Gesamtwert des Portfolios betrachtet. Setzen Sie hierzu zunächst folgendes, nicht ganz vollständiges, Klassendiagramm in Java um. Beim Erstellen einer Aktie soll neben der WKN auch der letzte Kurs (letzter_kurs) festgelegt werden. Die Methode getSKurs() (SKurs steht für simulierter Kurs) der Aktie soll die Variable letzter_kurs mit einer zufälligen Zahl (Hinweis: Math.random()) aus dem Intervall [0.001, 1.999] multiplizieren, diesen Wert zurückgeben und damit den letzten Kurs aktualisieren. Bei einer Anleihe wird beim Erstellen der Einkaufskurs (ek_kurs) gesetzt. Die Methode getSKurs() verändert hier jedoch nicht den Einkaufskurs ek_kurs, sondern gibt lediglich das Produkt aus ek_kurs und einer zufälligen Zahl zwischen 0.8 und 1.3 zurück. Die Methode getSKurs() der Superklasse Wertpapier soll einen konstanten Wert 0 zurückgeben. Ein Portfolio muss mehrere Wertpapiere kennen. Mit aktieHinzu(..) und anleiheHinzu(..) können neue Wertpapiere in das Portfolio aufgenommen werden. (Hinweis: Sie können vereinfachend davon ausgehen, dass ein Portfolio nicht mehr als 10 Wertpapiere enthält). Die Methode print() aus dem Portfolio gibt auf der Kommandozeile den Namen des Portfolios, eine Auflistung aller Wertpapiere samt aktuellem Wert und WKN und den Gesamtwert des Portfolios aus. Um die Simulation zu testen, müssen Sie jetzt noch eine Klasse mit einer main()-Methode erstellen. Testweise legen Sie darin ein Portfolio an, dem mindestens eine Aktie und eine Anleihe hinzugefügt werden. Anschließend zeigen Sie die Funktionsweise durch (mindestens) zweimaligen Aufruf der print()-Methode des Portfolios. Mein bisheriger Quellcode: Portfolio: Code: class Portfolio{ private String namen; public static Aktie aktien; public Portfolio(String name){ this.namen = name; } public void print(){ } public static void aktieHinzu(Aktie aktie1){ aktien = aktie1; } } Wertpapier: Code: class Wertpapier { private String wkn; public void setWkn(String WKN) { this.wkn = WKN; } public String getWKN() { return wkn; } public double getSKurs(){ return 0; } } Aktie: Code: class Aktie extends Wertpapier { private double letzter_kurs; public Aktie(String WKN){ super.setWkn(WKN); this.letzter_kurs = getSKurs(); } public double getSKurs(){ double zufall = Math.round((Math.random()*( 1.999 - 0.001) + 0.001)*1000); zufall = zufall / 1000; letzter_kurs = letzter_kurs*zufall; return letzter_kurs; } } Anleihe: Code: class Anleihe extends Wertpapier { private double ek_kurs; private double produkt; public Anleihe(String WKN, double EK_KURS){ super.setWkn(WKN); this.ek_kurs = EK_KURS; this.produkt = getSKurs(); } public double getSKurs(){ double zufall = Math.round((Math.random()*( 1.3 - 0.8) + 0.8)*10); zufall = zufall/10; produkt = ek_kurs*zufall; return produkt; } } und die master: Code: public class Master { public static void main(String[] args) { Portfolio name = new Portfolio("Neues Portfolio"); Aktie aktie1 = new Aktie("A0JKYP"); Portfolio.aktieHinzu(aktie1); } } Was mir fehlt: Was soll in aktieHinz()u bzw. anleiheHinzu() stehn? Weil das was ich hab, kanns ja nicht so ganz sein... Was muss in print() steht, damit das entsprechende ausgegeben wird? Und wie und wo (in master?) muss ich die aufrufen? Wie kann ich einem Namen mehrere Wertpapiere zuordnen? Passt der Code sonst? Oder hab ich den total verhaun? ^^ gruß und schonmal besten dank, gl + Multi-Zitat Zitieren
#2 5. Mai 2010 AW: Klassen, Objekte, etc.. erstellen und ausgeben du musst die statische variable "aktien" als array deklarieren. so wie es aussieht mit dynamischer länge. kommt drauf an was du ausgeben willst. google mal nach "java-object-dump" oder so aufrufen musst du die methode im "master" mit ner hashmap + Multi-Zitat Zitieren
#3 6. Mai 2010 AW: Klassen, Objekte, etc.. erstellen und ausgeben jo, aktie muss eine liste sein, also so deklariert werden: List<Aktie> aktien; in aktieHinzu kannst du dann einfach folgendes aufrufen: aktien.add(aktie); die methode print soll meiner meinung nach das gesamte portfolio ausgeben. überlade dazu am besten toString() in aktie und anleihe, wo einfach alle member der klassen ausgegeben werden. print() durchläuft dann einfach die beiden listen von aktien und anleihen und ruft auf jedes objekt tostring() auf. + Multi-Zitat Zitieren
#4 7. Mai 2010 AW: Klassen, Objekte, etc.. erstellen und ausgeben Huhu, erstmal danke euch beiden. Wegen der HashMap... In dem Diagramm steht: Code: -namen : string Wir haben gelernt, dass man das so deklarieren muss: PHP: private String namen ; Gibt es das Diagramm her, daraus eine HashMap zu machen? Oder weiß sozusagen mein Programm automatisch, dass alle Wertpapiere dem selben Namen zugeordnet werden? Die Portfolio sieht bei mir jetzt so aus: PHP: import java . util . ArrayList ; import java . util .List; class Portfolio { private String namen ; static List< Aktie > aktien = new ArrayList < Aktie >(); static List< Anleihe > anleihen = new ArrayList < Anleihe >(); public Portfolio ( String name ){ this . namen = name ; } public void print(){ } public String getNamen () { return this . namen ; } public static void aktieHinzu ( Aktie aktie ){ aktien . add ( aktie ); } public static void anleiheHinzu ( Anleihe anleihe ){ anleihen . add ( anleihe ); }} und die master: PHP: public class Master { public static void main ( String [] args ) { Portfolio name = new Portfolio ( "Neues Portfolio" ); Aktie aktie1 = new Aktie ( "A0JKYP" ); Anleihe anleihe1 = new Anleihe ( "A0JKYP" , 40.34 ); Portfolio . aktieHinzu ( aktie1 ); Portfolio . anleiheHinzu ( anleihe1 ); }} Das klappt soweit. Aber beim Ausgeben haperts noch: Wenn ich z.b. in anleiheHinzu den übergeben Wert ausgebe, kommt: Code: [Anleihe@a90653] naca7 hat gemeint ich soll toString() verwenden, aber das versteh ich nicht so ganz -.- Dass er mir etwas bei print() ausgibt, hab ich bisher eher schlecht als recht geschafft. Sobal ich in der master print aufrufe, kommt, daß ich static vor print schreiben soll. Schreib ich es davor, kann ich zwar z.b. anleihe ausgeben. Aber wenn ich namen mit "this.namen" namen ausgeben lassen will, geht das nicht. mit nem getter auf namen klappt es auch nicht, weil er bei beiden will, dass ich auch namen auf static setzen soll... Nochmal zusammengfasst: 1. Reicht es namen als normale Variable zu definieren oder muss es eine HashMap sein? 2. Wie schaffe ich es alles auf print(); auszugeben? (in der Angabe steht: "Die Methode print() aus dem Portfolio gibt auf der Kommandozeile den Namen des Portfolios, eine Auflistung aller Wertpapiere samt aktuellem wert und WKN und den Gesamtwert des Portfolios aus.") Besten Dank! gl + Multi-Zitat Zitieren
#5 7. Mai 2010 AW: Klassen, Objekte, etc.. erstellen und ausgeben Du musst in der print()-Methode über die enthaltenen Aktien und Anleihen iterieren und dabei dann immer den Wert der Aktie addieren. PHP: double gesamtwert = 0 ; for( Aktie a : aktien ) { System . out . println ( a . getWKN () + "\t" + a . getSKurs ()); gesamtwert += a . getSKurs (); } for( Anleihe a : anleihen ) { System . out . println ( a . getWKN () + "\t" + a . getSKurs ()); gesamtwert += a . getSKurs (); } System . out . println ( "Gesamtwert: " + gesamtwert ); Aber: Wieso benutzt du eigentlich zwei verschiedene Listen für Aktien und Anleihen, da doch beide Wertpapier erweitern. Es ist folgendermaßen viel einfacher: PHP: import java . util . ArrayList ; import java . util .List; class Portfolio { private String name ; List< Wertpapier > papiere = new ArrayList < Wertpapier >(); public Portfolio ( String name ){ this . name = name ; } public void print(){ System . out . println ( "Portfolio: " + this . getName ()); double gesamtwert = 0 ; for( Wertpapier a : papiere ) { System . out . println ( a . getWKN () + "\t" + a . getSKurs ()); gesamtwert += a . getSKurs (); } System . out . println ( "Gesamtwert: " + gesamtwert ); } public String getName () { return this . name ; } public static void papierHinzu ( Wertpapier papier ){ papiere . add ( papier ); } } Weiterhin habe ich mal das static vor der Liste entfernt, da es doch keinen Sinn macht, dass alle Portfolios (--> neues Objekt) die selben Wertpapiere beinhalten. Ich hoffe mal, dass ich die Aufgabe jetzt richtig verstanden habe, aber so in etwa sollte man das lösen können. Chillikid + Multi-Zitat Zitieren
#6 8. Mai 2010 AW: Klassen, Objekte, etc.. erstellen und ausgeben dankeschön euch 3en Habs jetzt komplett hinbekommen. Naja, steht so in diesem Diagramm, dass wir Anleihe und Aktie getrennt behandeln sollen. Aber jetzt läuft es und ich hab ne Menge dazugelernt =) gruß gl + Multi-Zitat Zitieren