Wie lautet der Parameter für das Objekt?
In Klasse Person Zeile 39 muss ein Übergabeparameter gegeben sein für das Attribut mit Typ "Date geburtsdatum". Zurzeit steht dort "datum", was jedoch nicht richtig ist. Wie lautet die Syntax dafür.
5 Antworten
Was ist denn genau das Problem? Ich sehe da keinen Fehler Oo
Datum ist vom Typ Date und das sollte eigentlich passen
Die letzte Zeile gibt nicht das Datum an, sonder nur den Speicherplatz
geburtsdatum ist nur ein Name. Der Name der Variable, die du als Argument überreichst, muss nicht mit dem Parameternamen übereinstimmen. Das habe ich dir in einer deiner vorherigen Fragen bereits erklärt.
Schau hier:
class Date {
public Date(int day, int month, int year) {
System.out.printf("%d.%d.%d", day, month, year);
}
}
// main:
int max = 21;
int marie = 3;
int josefine = 2001;
Date koffer = new Date(max, marie, josefine); // => 21.3.2001
Ich habe im unteren Teil bewusst absurde Bezeichner gewählt. Die Werte der einzelnen Variablen werden in Java implizit in die Parameter kopiert, die die Methode (bzw. hier der Konstruktor) definiert.
Ein Versuch der Verbildlichung:
public Date(int day = max, int month= marie, int year = josefine) {
// ...
}
Wenn man sich nun bei dir die Zeilen 13, 36, 39 und 12 (in Date.java) anschaut, sieht man, dass du gemäß deines Date-Konstruktors ein Datumsobjekt anlegst und dieses gemäß des Person-Konstruktors als drittes Argument übergibst, um ein Objekt der Klasse Person anzulegen. Das ist alles korrekt. Wenn du einen Fehler hast, liegt der nun woanders.
Jap hatte woanders noch einen Fehler, musste in die Methode asString der Klasse Person noch ein .toString(); hinter geburtsdatum setzen, trotzdem danke!
Wieso toString? Du hast dir doch explizit asString für diesen Fall in beiden Klassen implementiert.
Wieso soll das falsch sein?
Die letzte Zeile gibt nicht das Datum an, sonder nur diesen Speicherplatz
Nein. Das Datum ist ein Objekt und das wird auch als solches verwendet. Alles korrekt so.
Für mich sieht das richtig aus, weil die Variable datum ein Objet vom Typ Datum ist. Siehe Zeile 36. Warum soll das nicht richtig sein?
Wenn ich diese jedoch ausgeben möchte, wird nur der lokale speicher angezeigt
Korrekt, du musst dann die toString() verwenden.
date.toString()
Siehe JavaDoc für Date: https://docs.oracle.com/javase/7/docs/api/java/util/Date.html
In dem Fall wäre sowohl für Date als auch für Person der Aufruf von asString korrekt. Immerhin hat sich der FS diese Methoden extra für eine Ausgabe implementiert.
@regex9 asString() ruft aber nicht die toString() methoden anderer Objekte auf, dadurch wird beim Date die Speicheradresse ausgegeben
Schau dir die obige Implementation in seinen Bildern an. Seine beiden Klassen Date und Person haben jeweils eine asString-Methode implementiert, die jeweils die Attribute in Printform zurückgibt.
@regex9 aaaah ja jetzt sehe ich es. Wird die denn überhaupt bei einem Aufruf von person.asString() aufgerufen?
Das muss er noch ergänzen (habe ich ihn in einem der oberen Kommentare schon geschrieben).
So kannst du kein Date Objekt mit dem entsprechenden Datums wert erzeugen, hier sind ein paar (Beispiel) Wege um es korrekt zu machen:
Date date = new GregorianCalendar(2000, Calendar.FEBRUARY, 11).getTime();
--
oder mit einer Hilfsfunktion und Date Format:
public static Date parseDate(String date) {
try {
return new SimpleDateFormat("dd-MM-yyyy").parse(date);
} catch (ParseException e) {
return null;
}
}
Verwenden mit:
Date myDate = parseDate("14-02-2000");
LG
Türil kann er das in Diesem Fall weil er die Klasse Date selbst geschrieben hat.
Es könnte der Fall sein das der Compiler durcheinander kommt weil es eventuell ne Klasse Date im jdk gibt.
Die letzte Zeile gibt nicht das Datum an, sonder nur diesen Speicherplatz
Das ist das eigentliche Problem
Rufe in der asString-Methode der Person-Klasse noch für das Datum asString auf.
return nachname + /* usw. ... */ + geburtsdatum.asString();
Eine Sache könnte ein Problem sein.
Es gibt bereits ne Klasse Date in Java. (Bin mir nicht ganz sicher ob die wirklich Date heisst)
Du implementierst aber die Klasse Date selbst. Ist nie ne gute Idee Klassen zu schreiben die es so nochmal irgendwo gibt.
Nenn deine eigene Klasse Date einfach um. Z.b. in MyDate. Oder in Datum. Dann kommt der Compiler eventuell nicht durcheinander.
Ggf. Kannst du auch das package vorher angeben damit der Compiler weiss das du dein eigenes Date meinst und nicht das vom jdk. Wie genau man das in Java weiss ich allerdings nicht mehr.