Bei Java Konstruktor in einem andern Konstruktor verwenden

Neue Frage »

Auf diesen Beitrag antworten »
Lycaner Bei Java Konstruktor in einem andern Konstruktor verwenden

Ich muss ein Programm in Java schreiben, bei dem ich ein Konstruktor selber schreibe und später habe ich eine zweite Klasse, wo ich ein neune Konstruktor schreiben muss. Bei dem neuen muss ich den alten auch verwenden und ich weiß nicht wie das gehen soll.

z.B.

public class persönlicheDaten{

public PersönlicheDaten(String vorname, String nachname){
this.vorname=vorname;
this.nachname=nachname;
}
.............
......
...
}
/**************andere Klasse**********/
public class persönlicheDatensatz{

public persönlicheDatensatz(PersönlicheDaten(), int gebTag, int gebMonat, int gebJahr){
this.PersönlicheDaten=PersönlicheDaten;
this.gebTag=gebTag;
this.gebMonat=gebMonat;
this.gebJahr=geb.Jahr;
}
..........


Wie muss man es richtig schreiben?
 
Auf diesen Beitrag antworten »
eulerscheZahl

Ist zwar C#, sollte aber so oder sehr ähnlich auch in Java funktionieren:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
    public class persoenlicheDaten
    {
        public string vorname, nachname;
        public persoenlicheDaten(string vorname, string nachname)
        {
            this.vorname = vorname;
            this.nachname = nachname;
        }
    }

    public class persoenlicherDatensatz
    {
        public persoenlicheDaten per;
        public int gebTag, gebMonat, gebJahr;
        public persoenlicherDatensatz(persoenlicheDaten per, int gebTag, int gebMonat, int gebJahr)
        {
            this.per = per;
            this.gebTag = gebTag;
            this.gebMonat = gebMonat;
            this.gebJahr = gebJahr;
        }

        public persoenlicherDatensatz(string vorname, string nachname, int gebTag, int gebMonat, int gebJahr)
        {
            this.per = new persoenlicheDaten(vorname,nachname);
            this.gebTag = gebTag;
            this.gebMonat = gebMonat;
            this.gebJahr = gebJahr;
        }
    }

//Und der Aufruf:
persoenlicheDaten pd = new persoenlicheDaten("Hans", "Meier");
persoenlicherDatensatz pds = new persoenlicherDatensatz(pd, 1, 1, 1970);
//bzw. mit anderem Konstruktor:
persoenlicherDatensatz pds = new persoenlicherDatensatz("Hans", "Meier", 1, 1, 1970);
Auf diesen Beitrag antworten »
Lycaner

13: public persoenlicheDaten per;
14:public int gebTag, gebMonat, gebJahr;

Was sollen diese Zeilen bedeuten?
Ich dachte erst, dass die Zeile 13 die Methode aufruft aber die heißt anders.
Und wenn man du in Zeile 14 die Variabel mit dem Typ (int) deklarierst, ist das dann nicht doppelt weil in Zeile 15 wird das noch mal gemacht.
Ist ab Zeile 23, das zweite Beispiel , wie man es machen kann?
Auf diesen Beitrag antworten »
eulerscheZahl

In Zeile 13/14 sind die in der Klasse verwendeten Variablen.

In Zeile 15-21 ist ein Konstruktor, der die Klasse persoenlicheDaten übergeben bekommt.
Aufruf ist in Zeile 33/34.

In Zeile 23-30 ist ein anderen Konstruktor, der statt persoenlicheDaten zwei strings annimmt und diese dann selbst (Zeile 25) in persoenlicheDaten umwandelt.
Aufruf dazu in Zeile 36

Und ich habe keine Variable doppelt deklariert:
In Zeile 13/14 (übrigens auch in Zeile 3) sind die nach außen sichtbaren Variablen, die man abfragen/ändern kann, z.B. mit:
string vor = pds.per.vorname;
Innerhalb der Klasse wird mit this.Variablenname darauf zugegriffen.
Mit this.gebTag = gebTag; sage ich also, dass das nach außen Sichtbare den übergebenen Wert annimmt.
 
Auf diesen Beitrag antworten »
Lycaner

Ok danke.

Kannst du mir vielleicht sagen, wie ich die Felder abrufen/fühlen kann, wenn ich ein Datenfeld mit persoenlicherDatensatz erzeug habe.
z.B.
persoenlicherDatensatz Datenfeld[]=new persoenlicherDatensatz[10];

Muss ich dann sowas schreiben wie:
Datenfeld[0]=new Datenfeld("Hans", "Meier", 1, 1, 1970);
Auf diesen Beitrag antworten »
eulerscheZahl

nicht ganz:
code:
1:
2:
persoenlicherDatensatz[] Datenfeld = new persoenlicherDatensatz[10];
Datenfeld[0] = new persoenlicherDatensatz("Hans", "Meier", 1, 1, 1970);


Datenfeld ist ja aus der Klasse persoenlicherDatensatz. Außerdem hast du beim Initialisieren das Arrays die eckigen Klammern falsch platziert.
Auf diesen Beitrag antworten »
Lycaner

Bei mir funktioniert das irgendwie nicht. Kommt immer ein Fehler.

cannot find symbol
Auf diesen Beitrag antworten »
eulerscheZahl

Um das ganze unter Java zum Laufen zu bringen, musste ich string zu String machen, also groß schreiben, ansonsten sollte das alles passen, bei mir läuft es zumindest.
In welcher Zeile tritt der Fehler denn bei dir auf?
Auf diesen Beitrag antworten »
Lycaner

public class Test5 {


public static void main(String[] args) {

1: Test7[] datenfeld= new Test7[10];

2: datenfeld[1] = new Test7("Hans", "Meier", 1, 1, 1970);

}

Also in dem Hauptprogramm tritt der Fehler auf(Zeile 1 und Zeile 2).
Ich habe ein neues Projekt angelegt und das rein kopiert, was du geschrieben hast. Ich wollt das Programm nicht verunstalte und mehr kaputt mache als es schon so ist. Deswegen habe ich die Klassen umbenannt. In den Klassen zeigt mir kein Fehler an. Aber in der Hauptklasse funktioniert nichts.

C war in der Hinsicht viel leichter, wo man alles in ein Fenster schreiben konnte(
Auf diesen Beitrag antworten »
eulerscheZahl

Eine Ferndiagnose ist schwer.
Hast du
- Die Namen der Klassen auch nicht vertauscht
- Das richtige Package zugewiesen
- Für jede Klasse ein eigenes .java-File erstellt

Hier noch ein Screenshot, wie es bei mir aussieht:
Auf diesen Beitrag antworten »
Lycaner

Erst mal, danke für deine Mühe.

Ich habe genauso abgetippt und das hat nur funktioniert, als ich den zweiten Konstruktor eingefügt habe.

Leider steht in der Aufgabenstellung, dass man den ersten Konstruktor verwenden soll. Und wenn ich das mache, kann ich kein Array erzeugen( zu minderst da taucht der erster Fehler auf(
Auf diesen Beitrag antworten »
eulerscheZahl

meinst du so?
Datenfeld[0] = new persoenlicherDatensatz(new persoenlicheDaten("Hans", "Meier"), 1, 1, 1970);

falls nein, bitte ich um den genauen Wortlaut der Aufgabe, weil ich immer noch nicht weiß, was du vorhast.
Auf diesen Beitrag antworten »
Lycaner

Aufgabe 2b.
Entwerfen Sie einen geeigneten Konstruktor, der alle persönlichen Daten und Datensatz eines Fussbalspielers als Parameter erhält.

Unter den persönlichen Daten habe ich 7 Attribute und im dem Datensatz kommen 6 weiter Attribute hinzu.
Deswegen wollte ich den ersten Konstruktor verwenden, weil dann das Programm viel kürzer wird.
Auf diesen Beitrag antworten »
Lycaner

Aufgabe 2c.
Die Methode zeigeSpielerdaten() soll alle persönlichen und Spielerdaten
anzeigen. Zur Anzeige der persönlichen Daten soll die Methode zeigeDaten
der Klasse PersoenlicheDaten aufgerufen werden.

Die Methode zeigeDaten habe ich programmiert und dann wollte ich diese Methode in der Methode PersönlicheDaten abrufen aber es kommt immer ein Fehler vor, obwohl ich den abruf einige Programm im Internet gesehen habe(

public void zeigeDaten() {
System.out.println("Vorname und Nachname: "+vorname+" "+nachname);
}


public void zeigeSpielerdaten() {
System.out.println(zeigeDate per()); diese Zeile wird rot unterstrichen(
System.out.println("");
}

Die zweite Methode steht in der anderen Klasse als die erste Methode.
Auf diesen Beitrag antworten »
eulerscheZahl

Versuche mal per.zeigeDaten();
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
package meinPaket;
public class main {
	public static void main(String[] args) {
		persoenlicherDatensatz[] Datenfeld = new persoenlicherDatensatz[10];
		Datenfeld[0] = new persoenlicherDatensatz(new persoenlicheDaten("Hans", "Meier"), 1, 1, 1970);
		Datenfeld[0].zeigeDatensatz();
	}

}


package meinPaket;
public class persoenlicheDaten {
    public String vorname, nachname;
    public persoenlicheDaten(String vorname, String nachname)
    {
        this.vorname = vorname;
        this.nachname = nachname;
    }
    
    public void zeigeDaten(){
    	System.out.println("Vorname und Nachname: "+vorname+" "+nachname);	
    }
}


package meinPaket;
public class persoenlicherDatensatz {
    public persoenlicheDaten per;
    public int gebTag, gebMonat, gebJahr;
    public persoenlicherDatensatz(persoenlicheDaten per, int gebTag, int gebMonat, int gebJahr)
    {
        this.per = per;
        this.gebTag = gebTag;
        this.gebMonat = gebMonat;
        this.gebJahr = gebJahr;
    }

    public persoenlicherDatensatz(String vorname, String nachname, int gebTag, int gebMonat, int gebJahr)
    {
        this.per = new persoenlicheDaten(vorname,nachname);
        this.gebTag = gebTag;
        this.gebMonat = gebMonat;
        this.gebJahr = gebJahr;
    }
    
    public void zeigeDatensatz(){
    	per.zeigeDaten();
    }
}
Auf diesen Beitrag antworten »
Lycaner

Es klappt endlich alles, vielen Dank.
Schöne Ostertage noch eulerscheZah : )
Auf diesen Beitrag antworten »
Lycaner

Ok jetzt habe ich doch noch eine kleine Frage.
Ich wollte das gesamte Datenfeld ausgeben und habe einen kleine Schleife geschrieben.
Das
for(int i=0;i<10;i++){
if(Datenfeld[i].gebTag>0){
Datenfeld[i].zeigeSpielerdaten();
}
break;
}
Wieso gibt er mir nur den erst Datenfeld aus und bricht die Schleife ab. Ich wollte, dass die Schleife abgebrochen wird, wenn bei Geburtstagen nichts steht.
Gibt es eine andere Möglichkeit zu prüfen, ob in der Schleife etwas stehet oder nicht?
Auf diesen Beitrag antworten »
eulerscheZahl

break bricht die Schleife komplett ab, continue den aktuellen Schleifendurchlauf.
Dein break ist nicht von if(...) abhängig, wird also auf jeden Fall ausgeführt. Daher endet die Schleife nach dem ersten Durchgang.
Je nachdem, was du vorhast, empfehle ich dir else break oder das break einfach ganz wegzulassen.
Auf diesen Beitrag antworten »
Lycaner

Nochmal Danke
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »