Andere Klassen als Attribute verwenden



  • Hallo,

    ich sitze mal wieder an einer Hausarbeit für das Studium und hänge an dem letzten Teil, ich zitiere mal:

    Die Klasse "Reservierung" soll die Reservierung eines Hotelzimmers für einen bestimmten Kunden abbilden. Dazu soll die Klasse folgende Bestandteile haben:
    Attribute: Kunden, Hotelzimmer, Beginn, Ende, Reservierungsnummer

    Nun habe ich folgenden code erstmal geschrieben:

    public class Reservierung {
    
    	private Kunde kunde_res;
    	private Zimmer zimmer_res;
    	private Datum datum_beginn;
    	private Datum datum_ende;
    	private int res_nummer;
    
    	public Kunde getKunde_res() {
    		return kunde_res;
    	}
    	public void setKunde_res(Kunde kunde_res) {
    		this.kunde_res = kunde_res;
    	}
    	public Zimmer getZimmer_res() {
    		return zimmer_res;
    	}
    	public void setZimmer_res(Zimmer zimmer_res) {
    		this.zimmer_res = zimmer_res;
    	}
    	public Datum getDatum_beginn() {
    		return datum_beginn;
    	}
    	public void setDatum_beginn(Datum datum_beginn) {
    		this.datum_beginn = datum_beginn;
    	}
    	public Datum getDatum_ende() {
    		return datum_ende;
    	}
    	public void setDatum_ende(Datum datum_ende) {
    		this.datum_ende = datum_ende;
    	}
    	public int getRes_nummer() {
    		return res_nummer;
    	}
    	public void setRes_nummer(int res_nummer) {
    		this.res_nummer = res_nummer;
    	}
    

    Die Klassen "Kunde", "Zimmer", "Datum" existieren (und funktionieren auch), nur weiss ich nicht so recht wie hier nun der Konstruktor aussehen muss. In dem Teil davor habe ich einfach eine Unterklasse geschrieben.
    Kann man irgendwie für eine Klasse mehrere Oberklassen definieren und wie würde dann der Konstruktor aussehen.
    Mein default-Konstruktor sieht derzeit so aus:

    public Reservierung() {
    		super();
    		this.kunde_res = kunde_res;
    		this.zimmer_res = zimmer_res;
    		this.datum_beginn = datum_beginn;
    		this.datum_ende = datum_ende;
    		this.res_nummer = res_nummer;
    	}
    

    Wenn ich damit allerdings im main-Programm eine Ausgabe machen will, erhalte ich immer NULL oder NULL-pointer exception

    main-Aufruf:

    Reservierung default_reservierung = new Reservierung();
    System.out.println(default_reservierung.getKunde_res().getNachname());
    

    Ich hoffe meine Erklärung ist halbwegs verständlich und wäre dankbar für jeden Tipp

    Gruss,
    Lalas



  • Hatte grad eine Erleuchtung:

    public Reservierung() {
        super();
        this.kunde_res = new Kunde();
        this.zimmer_res = new Zimmer();
        this.datum_beginn = new Datum();
        this.datum_ende = new Datum();
        this.res_nummer = 1;
    }
    

    damit funktioniert es.

    Dafür vielleicht eine nächste Frage:

    Zur Erzeugung der Reservierungsnummer soll ein zusätzliches Klassenattribut (static) eingeführt werden.
    Das soll immer dann inkrementiert werden, wenn ein neues Reservierungsobjekt erzeugt wird.
    Ihc weiss zwar was gemeint ist (würde es in C auch hinbekommen) aber in Java....

    Und zum krönenden Abschluss noch diese Frage:

    "Überschreiben Sie in allen Klassen die geerbte toString-Methode, so dass die Werte aller Attribute einer Klasse in einem String abgelegt werden."
    Irgendwie klingt das für mich widersprüchlich, die toString-Methode schreibt doch das jeweilige Objekt in einen String oder was ist hiermit gemeint ?

    Gruss,
    lalas



  • public Reservierung() {
            super();
            this.kunde_res = kunde_res;
            this.zimmer_res = zimmer_res;
            this.datum_beginn = datum_beginn;
            this.datum_ende = datum_ende;
            this.res_nummer = res_nummer;
        }
    

    Wo wird kunde_res, zimmer_res, datum_beginn, datum_ende instanziert?
    Weil wenn du diese noch nicht instanziert hast, ist der inhalt immer null.

    Übrigens ist super() nicht unbedingt nötig...Default-Konstruktor der Oberklasse wird wenn super() fehlt dennoch implizit aufgerufen.



  • Zur Erzeugung der Reservierungsnummer soll ein zusätzliches Klassenattribut (static) eingeführt werden.
    Das soll immer dann inkrementiert werden, wenn ein neues Reservierungsobjekt erzeugt wird.

    public class Reservierung {
      // ...
      private static int counter = 0;
    
      public Reservierung() {
        // ...
        counter++;
      }
      // ...
    }
    

    Wegen dem Überrschreiben:

    class Test {
      private int wert0, wert1;
      private String irgendwas;
    
      public Test(int wert0, int wert1, String irgendwas) {
        this.wert0 = wert0;
        this.wert1 = wert1;
        this.irgendwas = irgendwas;
      }
    
      // wir überschreiben die geerbte Methode
      public String toString() {
        return "wert0 = "+wert0+", wert1 = "+wert1+", irgendwas = "+irgendwas;
      }
    }
    


  • Hallo,

    Danke erstmal für die Antworten, das teste ich mal alles durch. Wegen deinem ersten post:

    Ravendark schrieb:

    public Reservierung() {
            super();
            this.kunde_res = kunde_res;
            this.zimmer_res = zimmer_res;
            this.datum_beginn = datum_beginn;
            this.datum_ende = datum_ende;
            this.res_nummer = res_nummer;
        }
    

    Wo wird kunde_res, zimmer_res, datum_beginn, datum_ende instanziert?
    Weil wenn du diese noch nicht instanziert hast, ist der inhalt immer null.

    Das habe ich mittlerweilen korrigiert (siehe meinen zweiten post, hat sich um paar Sekunden überschnitten)

    Zur toString-Methode:
    Wozu will ich (bzw. meine Professorin) denn alle Werte in einen String ablegen ?

    Gruss,
    Michael



  • Hi,

    Es gab hier die Frage nach mehrere Oberklassen. Das geht in Java NICHT. Ausweg sind INterfaces.

    Die toString-mehtode wird häufig verwendet, um Klassen in der konsole "auszugeben". Also bei deiner Reservierung soll dann der Aufruf:

    System.out.println(meineReservierung);
    

    zum beispiel ausgeben:

    Reservierung 1487539487
    Name: Hans Meier
    Beginn: ...
    usw.
    

    in dem Println wird dann automatisch die toString-methode aufgerufen, in der du dann schreiben musst:

    return "Reservierung " + nr + "\nName: " + name + ...;
    

    Mfg DerBaer



  • Guten Morgen,

    HERVORRAGEND, jetzt weiss ich genau was gemeint ist, vielen Dank!!

    Gruss,
    Lalas



  • Habe soweit alles fertig, hänge nun allerdings bei der toString-Methode für eine Klasse, wo ich Inhalte eines arrays ausgeben will, hier mal der code:

    public Hotel(String hotelname, int hotelnr, int zimmer_anzahl) {
    		super();
    		this.hotelname = hotelname;
    		this.hotelnr = hotelnr;
    		setZimmer_array(new Zimmer[zimmer_anzahl]);
    
    		for (int i=0; i<getZimmer_array().length/3; i++)
    		{
    			getZimmer_array()[i] = new Zimmer (100+i, 1);
    		}
    		for (int j=getZimmer_array().length/3; j<getZimmer_array().length; j++)
    		{
    			getZimmer_array()[j] = new Zimmer (100+j, 2);
    		}
    
    	}
    

    Bislang hatte ich im Hauptprogramm die Ausgabe des Zimmer-arrays so gemacht:

    for (int k=0; k<default_hotel.getZimmer_array().length;k++)
    		{
    			System.out.println("Zimmernr: "+default_hotel.getZimmer_array()[k].getZimmernr()+"\n"+"Anzahl Betten: "+default_hotel.getZimmer_array()[k].getBetten()+"\n"
    					+"-----------------");
    		}
    

    Nun wollte ich toString-Methode schreiben, allerdings weiss ich nicht wie ich quasi jeden array-index in einen string schreiben soll. Sicherlich in einer Schleife, aber wie kann ich an einen einmal erzeugten string, quasi beim nächsten Schleifendurchlauf das nächste Zimmer anhängen ?

    Wäre dankbar für einen Tipp wie ich das am besten anstelle.

    Gruss,
    Lalas



  • auch das lässt sich leit machen:

    du legst einfach vorher eine neue Variable an, in die du nacheinander alles reinschreibst:

    String s = "";
    for (int k=0; k<default_hotel.getZimmer_array().length;k++)
    {
        s += "Zimmernr: "+default_hotel.getZimmer_array() [k].getZimmernr()+"\n"+"Anzahl Betten: "+default_hotel.getZimmer_array()[k].getBetten()+"\n" + "-----------------");
    } 
    return s;
    

    Damit hängst du jedesmal die neue zeichenkette an s dran, sodass nach der schleife alles in einem großen string steht. den gibts du dann zurück.

    Und nochwas:
    soweit ich weiß, wird bei dir in jedem schleifendurchlauf die getZimmer_array()-Methode 2 mal aufgerufen. Das dauert ziemlich lange und ist nicht so sauber programmiert.
    Mach lieber:

    Zimmer[] zimmer = default_hotel.getZimmer_array();
    String s = "";
    for (int k = 0; k < zimmer.length; k++) {
        s += "Zimmernr: " + zimmer[k].getZimmernr() + "\n" + Anzahl Betten: " + zimmer[k].getBetten() + "\n---------------");
    }
    return s;
    

    das sollte für große hotels schneller gehen(wenn der compiler das nicht schon macht^^)

    Mfg DerBaer



  • aber wie kann ich an einen einmal erzeugten string, quasi beim nächsten Schleifendurchlauf das nächste Zimmer anhängen ?

    Benutze einen StringBuffer, dies ist ein veränderlicher String der im Vergleich zu einem normalen String speicherschonender ist.

    StringBuffer s = new StringBuffer();
    for(int i = 0; i < default_hotel.getZimmer_array().length; i++) {
      // s.append(...) hängt den Klammerausdruck an den StringBuffer hinten dran ohne
      // intern einen neuen String zu erzeugen
      s.append("Zimmernr: "+default_hotel.getZimmer_array()[i].getZimmernr+"\n");
      s.append("Bettenanzahl: "+default_hotel.getZimmer_array()[i].getBetten()+"\n");
      s.append("\n");
    }
    
    System.out.println(s.toString());
    


  • Also ich habe es nun fertig und sieht gut aus, auch wenn meine Professorin immer was zu meckern hat 😉

    Vielen Dank nochmals an alle, ich stelle immer wieder fest das dies Forum wirklich eine Bereicherung ist, auch wenn ich nicht viel dazu beitragen kann.

    Hoffe aber das änder sich 😉

    Gruss,
    Lalas


Log in to reply