# klasse datum



## steffen (10. Jan 2005)

hallo zusammen,
ich weiß, es gibt sehr viele themen zur darstellung eines datums, aber leider helfen die mir nicht weiter. 
wir haben eben erst mit der objektorientierung angefangen und ich verstehe die aufgabenstellung einfach nicht:
aufgabe: es soll eine klasse datum (ganzzahlige komponenten tag/monat/jahr) geschrieben werden.für die klasse datum sollten "geeignete" konstruktoren geschrieben und es sollte eine methode toString implementiert werden (geerbt aus der klasse object). außerdem war eine objekt-methode zu implementieren, die die differenz der ganzen jahre bei eingabe eines zweiten datums bestimmt und ausgibt. alles was ich unterstrichen habe, verstehe ich nicht. folgende klasse habe ich geschrieben und ausgeführt "funktioniert" sie auch (auch nur mit hilfe), ist aber wohl "falsch" realisiert bezüglich der aufgabenstellung:

```
class TestDatum extends Datum {

   static public void main(String[] args) {

   Datum d= new Datum();
   //d.setDatum();

   //System.out.println(d.getDatum());

   d.datumVergleich();
   }
}
class Datum {
			int 	day=0;
			int		month=0;
			int		year=0;
			String	date="";

	public void setDatum(){

			System.out.println("Bitte Tag eingeben!           ");
			System.out.println("Bitte eine Zahl zwischen 1 und 31 ein!           ");
			day = EM02.liesInt();
			while(day<1 || day>31){
	  			System.out.println("Bitte Tag eingeben!           ");
				day = EM02.liesInt();
				System.out.println("Fehler bei der Eingabe!");
			}

			System.out.println("Bitte Monat eingeben!           ");
			System.out.println("Bitte eine Zahl zwischen 1 und 12 ein!           ");
			month = EM02.liesInt();
			while(month<1 || month>12){
				System.out.println("Bitte Monat eingeben!           ");
				month = EM02.liesInt();
				System.out.println("Fehler bei der Eingabe!");
			}

			System.out.println("Bitte Jahr eingeben!           ");
			System.out.println("Bitte eine Zahl zwischen 1 und 3000 ein!           ");
			year = EM02.liesInt();
			while(year<1 || year>3000){
				System.out.println("Bitte Jahr eingeben!           ");
				year = EM02.liesInt();
				System.out.println("Fehler bei der Eingabe!");
			}
			date=day+"."+month+"."+year;


    } // setDatum()

    public String getDatum(){
		return date;
	} // getDatum()


	public void resetDatum(){
		day=0;
		month=0;
		year=0;
		date="";
	}

	public void datumVergleich(){
		System.out.println("Jahres Vergleich!");
		System.out.println("--------------------------------------------------");
		int diffJahr=0;
		System.out.println("Bitte erstmal das erste Datum eingeben");
		setDatum();
		int jahr1=year;

		resetDatum();
		System.out.println("Bitte tragen sie noch ein Datum zum Vergleich ein");
		setDatum();
		int jahr2=year;

		if(jahr1 >jahr2)
			diffJahr=jahr1-jahr2;
		else
			diffJahr=jahr2-jahr1;

		System.out.println("Der Abstand zwischen den Jahren betraegt:  "+ diffJahr);


	}// datumVergleich()

}
```

Ich würde mich sehr freuen, wenn jemand mir einen vorschlag zur änderung machen könnte
 Grüße, S.


----------



## mic_checker (10. Jan 2005)

Also zu deinen unterstrichenen Wörtern:

toString() : Falls du deine eigenen Klassen schreibst, z.B. TestDatum, so kannst du in toString() spezifizieren was du bei System.out.println() ausgibst:


```
TestDatum td = ....;
System.out.println(td);
```

Ohne Überladung der toString() Methode erscheinen - auf den ersten blick - unbrauchbare informationen. In toString() kannst du wichtige Informationen über deine Klasse ausgeben lassen.

Jede Klasse erbt automatisch von Object diese Methode.



geeignete Konstruktoren:
Normalerweise stellt Java einen sog. Standard-Konstruktor zur Verfügung:


```
TestDatum()
{
}
```

Allerdings ist dieser Konstruktor für deine Fälle nicht sonderlich brauchbar , deshalb sollst du einen Konstruktor angeben, der geeignete Argumente aufnehmen kann.

Hab jetzt leider keine Zeit, sonst würd ich noch den Code angucken..


greets
mic_checker


----------



## steffen (10. Jan 2005)

ok..dank dir erstmal, werd versuchen, das toString() an geeigneter Stelle einzubauen


----------



## Steffen (10. Jan 2005)

n'abend
vielleicht hat noch jemand eine idee, was ich anders machen könnte?;-)


----------



## mic_checker (10. Jan 2005)

Also zum Thema Konstruktoren:
Du könntest ja z.B. einen "Kopierkonstruktor" angeben, der nichts anderes macht als ein Objekt mit den Werten des Objekts welches du ihm übergibst zu initialsieren...


```
/*
 * Hier verkette ich die Konstruktoren.
 * Grund ? Schreibfaulheit =)
 */
 
/*
 * In diesem Fall kannst du dir die Belegung der Variablen mit diesen Werten eigentlich sparen,
 * da du sie selber schon mit 0 initialsiert hast. Dient nur als Beispiel.
 */  
Datum()
{
	this(0,0,0,"");
}

Datum(Datum da)
{
	this(da.day,da.month,da.year,da.date); 
}

Datum(int day,int month,int year,String date)
{
	this.day = day;
	this.month = month;
	this.year = year;
	this.date = date;
}
```

Anmerkung:
Ich weiss nicht ob nur ich es so sehe, aber ist es nicht ungewöhnlich eine set Methode anzugeben ohne Parameter, wird nicht normalerweise so etwas da stehen:


```
public void setDatum(int hour,int month,int year,String date)
{
	/* Überprüfung der Parameter muss noch gemacht werden.
	* Z.B. hour >= 0 && hour <= 24 etc.
	*/
	this.hour = hour;
	this.month = month;
	this.year = year;
	this.date = date;
}
```

Außerdem ist datumVergleich SO sicherlich nicht ursprünglich gedacht oder? Du liest dort zwei Daten ein die miteinander verglichen werden...Wärs nicht besser das Datum vom aktuellen Objekt mit einem übergebenen Datum zu vergleichen? Ist halt die Frage wie du es willst.

Der COde ist ungetestet und nur schnell hingeschlunzt, hoffe es dir dir trotzdem weiter..


----------



## Steffen (11. Jan 2005)

morgen,

super, danke für die antwort! jetzt versteh' ich, wozu die konstruktoren da sind, bzw. wie ich sie hier einsetzen kann. mit dem datum-vergleich hast du natürlich recht..also, ich setz mich gleich ran;-) schönen tag dir!


----------



## mic_checker (11. Jan 2005)

Hi,
ja...mit den Konstruktoren ist das manchmal so ne Sache =)

Ich schätze mal das die Variable "date" ganz hilfreich sein könnte für dein toString(). 
Weil wenn du so etwas machst:


```
Datum d = new Datum(12,2,1945,"12.2.1945");
System.out.println(d);
```

Könnte es ganz praktisch sein wenn so etwas ausgegeben werden würde:

12.2.1945.

Da fällt mir auf das du am besten noch einen weiteren Konstruktor definierst - und zwar einen der day,month und year aufnimmt, date anhand von String Konkatenation aufstellt und dann den andern Konstruktor aufruft (Konstruktor Verkettung wieder).


```
Datum(int day,int month,int year)
{
//oder alternativ StringBuffer mit append und anschließendem toString()
date = day + "." + month + "." + year;
this(day,month,year,date);
}
```

Wieder ist der Code nur schnell hingeschrieben, hoffentlich keine Fehler drin,muss jetzt auch leider wieder weg...

Viel Spaß noch!


----------

