Java Werte werden nicht übergeben?!

StudentX

Newbie
Registriert
Apr. 2013
Beiträge
2
Hallo Java-Experten,

ich quäle mich seit Tagen durch das kleine Programm, was ich schreiben soll. Im Prinzip funktioniert es auch teilweise. Ich bekomme es aber nicht hin, das die Persönlichen Daten, die ich in der main schreibe, auch in den passenden Variablen landen. Ich denke das Problem ist, das es über eine Klasse in eine andere soll. Komm damit nicht so ganz klar.

Hier mal der Code:
Hauptklasse:

Code:
public class Hauptklasse {

    public static void main(String[] args) {

       
        SpielerDaten kader[] = new SpielerDaten[35]; //
      
        
        kader[0] = new SpielerDaten(246,"Abwehr",9,5,0,"Paul",
                                    "Panzer",14,2,1988,99.3f,1.81f);
          
        kader[1] = new SpielerDaten(1,"Torwart",0,0,0,"Robert","Almer",20,03,1984,88.0f,1.94f);
        
       int i;
       for (i=0;i<2;i++){
       kader[i].zeigeSpielerdaten();
       System.out.println();
       }
        
    }
        
}

Klasse SpielerDaten:

Code:
public class SpielerDaten {
    
    PersoenlicheDaten persdaten; //
    
    int anzahlspiele;
    String position;
    int gelb;
    int gelbrot;
    int rot;
    
   
    public SpielerDaten(int anzahlspiele, String position, int gelb, 
                        int gelbrot, int rot, String vorname2, String name2,
                        int gebtag2, int gebmon2, int gebjahr2, float gewicht2,
                        float größe2)
    {
        
        
        this.anzahlspiele = anzahlspiele;
        this.position = position;
        this.gelb = gelb;
        this.gelbrot = gelbrot;
        this.rot = rot;
        PersoenlicheDaten pd = new PersoenlicheDaten (vorname2,name2,gebtag2,gebmon2,gebjahr2,gewicht2,größe2);
        pd.vorname = vorname2;
        pd.name = name2;                                // irgendwo hier läuft es wohl schief
        pd.gebtag = gebtag2;                  
        pd.gebmon = gebmon2;
        pd.gebjahr = gebjahr2;
        pd.gewicht = gewicht2;
        pd.größe = größe2;
        
    }

    
    public void zeigeSpielerdaten() {
        
        PersoenlicheDaten pd = new PersoenlicheDaten();
        pd.zeigeDaten();
        System.out.println("Anzahl Spiele: " + anzahlspiele);
        System.out.println("Position :" + position);
        System.out.println("Gelbe Karten: " + gelb);
        System.out.println("Gelbrote Karten: " + gelbrot);
        System.out.println("Rote Karten: " + rot);
        
        
        
        
    }
}

und Klasse PersoenlicheDaten:

Code:
public class PersoenlicheDaten {
    String vorname;
    String name;
    int gebtag;
    int gebmon;
    int gebjahr;
    float gewicht;
    float größe;
  
    public PersoenlicheDaten(){}  // sind 2 konstruktoren, aber ohne den hier ging es irgendwie nicht
    public PersoenlicheDaten( String vorname, String name, 
                        int gebtag, int gebmon, int gebjahr, float gewicht, 
                        float größe) {
        
        this.vorname = vorname;
        this.name = name;
        this.gebtag = gebtag;
        this.gebmon = gebmon;
        this.gebjahr = gebjahr;
        this.gewicht = gewicht;
        this.größe = größe;
        
    }

    
    

    public void zeigeDaten() {
        
        System.out.println("Vorname: " + vorname);
        System.out.println("Name: " + name);
        System.out.println("Geburtstag: " + gebtag + "." + gebmon + "." + gebjahr);
        System.out.println("Gewicht: " + gewicht);
        System.out.println("Größe: " + größe);
        
        
        
        
        
    }
}

Wenn ich das laufen lasse erhalte ich folgendes:

run:
Vorname: null
Name: null
Geburtstag: 0.0.0
Gewicht: 0.0
Größe: 0.0
Anzahl Spiele: 246
Position :Abwehr
Gelbe Karten: 9
Gelbrote Karten: 5
Rote Karten: 0

...


Wieso stehen Name, Vorname, Geburtstag usw. nicht da wo sie hin sollen?
Ich würd mich freuen, wenn mir das einer erklären könnte.

Grüße
Torsten
 
Auf den ersten Blick - du erzeugst ein neues Objekt PersoenlicheDaten im Konstruktor von SpielerDaten. Das ist auch der Grund warum es ohne den parameterlosen Konstruktor von PersoenlicheDaten nicht kompiliert, denn du rufst ihn mehrfach auf mit
Code:
PersoenlicheDaten pd = new PersoenlicheDaten();

Was du eigentlich willst ist in der SpielerDaten-Klasse auf das Feld persdaten zuzugreifen, sowohl schreibend (im Konstruktor) als auch lesend (in zeigeSpielerdaten()). Im Moment erzeugst du an beiden Stellen ein neues Objekt vom Typ PersoenlicheDaten und diese sind natürlich leer.
 
Auf den ersten Blick würde ich sagen ist Zeile 38 der Klasse "SpielerDaten" dein Problem. Jedesmal wenn du die Methode dort aufrufst erzeugst du ein neues, leeres Objekt aus dem du dann die Daten anzeigst.
 
Du verdrahtest die Spielerdaten zu sehr mit PersoenlicheDaten.

Bau den Konstruktor so um, dass du die Instanz PersoenlicheDaten der Instanz SpielerDaten direkt übergibst.
Code:
    public SpielerDaten(int anzahlspiele, String position, int gelb, 
                        int gelbrot, int rot, PersoenlicheDaten persdaten)
    {
        this.anzahlspiele = anzahlspiele;
        this.position = position;
        this.gelb = gelb;
        this.gelbrot = gelbrot;
        this.rot = rot;
        this.persdaten = persdaten;
    }
Code:
 PersoenlicheDaten pd = new PersoenlicheDaten("Paul",
                                    "Panzer",14,2,1988,99.3f,1.81f);

  kader[0] = new SpielerDaten(246,"Abwehr",9,5,0, pd);

Für die Ausgabe der Daten, überschreibe die jeweilige toString()-Methode der Klasse. Die Hilfsmethode zum Formatieren eines Strings, kann hierbei merklich die Lesbarkeit erhöhen. Bei String.format steht das %s für einen Platzhalter, in dem Fall einen Stringwert.
Code:
Klasse PersoenlicheDaten:

@Override 
public String toString(){
 return String.format("Vorname %s - Gebdatum %s - " , name, gebDatum);
}


Klasse SpielerDaten:

@Override 
public String toString(){
 return String.format("Rote-Karte %s - Gelbe-Karte %s - PersoenlicheDaten:[ %s ]" , rot, gelb, persDaten.toString());
}

Wenn du das für beide Klassen(SpielerDaten und PersoenlicheDaten) machst, kannst du nachher einfach die toString-Methode an dem konkreten Objekt aufrufen.

Code:
SpielerDaten sp = new SpielerDaten(...);
System.out.println(sp.toString());
 
Zuletzt bearbeitet:
Ich danke euch vielmals, besonders flintzen_123. Mit Euren Erklärungen und Beispielen hab ich es jetzt hinbekommen.
Werd mich melden, wenn ich vom Prof Punkte bekommen habe^^

Danke mochmal
 
Zurück
Oben