# Uhrzeit-Aufgabe



## Möpppel (17. Dez 2009)

Moin, 
ich muss eine Aufgabe bearbeiten in der ich das erste mal mit Klassen, Methoden, Konstruktoren richtig arbeiten muss.
Leider weiß ich nicht wie ich am besten an diese Aufgabe rangehen weil ich mir noch garnicht so sicher bin was ich da machen muss und wie das alles funktioniert. Könntet ihr mir vllt. ein par kleine TIpps geben damit ich den Einstieg besser finde?

hier ist die Aufgabe:

```
Eine Uhrzeit wird die durch die Angabe einer Stunde (0–23), einer
Minute (0–59) und einer Sekunde (0–59) festgelegt. Beispiel: 14:59:01 Uhr.
Schreiben Sie eine Klasse Uhrzeit, die eine Zeitangabe durch die drei privaten Attribute
stunden, minuten und sekunden vom Datentyp int repräsentiert. Neben diesen
Attributen soll Ihre Klasse mindestens die folgenden Methoden enthalten:

a) Konstruktoren: Der parameterlose Konstruktor Uhrzeit() initialisiert die Zeit mit
00:00:00 Uhr. Der Konstruktor
Uhrzeit(int stunden, int minuten, int sekunden)
setzt die Zeit auf die Parameterwerte.

b) Get- und Set-Methoden: Die folgenden Methoden sollen die jeweiligen Attribute als
Ergebnis liefern bzw. die entsprechenden Attribute setzen:
getStunden()
getMinuten()
getSekunden()
setUhrzeit(int stunden, int minuten, int sekunden)

c) Überlagerung von Methoden der Klasse Object:
– Die Methode toString() soll die aktuelle Uhrzeit in der Form 14:59:01 Uhr
liefern.
– Die Methode equals(Object o) soll den Parameter mit dem aktuellen Objekt
vergleichen.
– Die Methode clone() soll ein neues Objekt der Klasse Uhrzeit mit der Zeit
des aktuellen Objekts liefern.

d) Die Methoden add(Uhrzeit u), sub(Uhrzeit u) und früher(Uhrzeit u) sollen
die durch den Parameter übergebene Uhrzeit zur aktuellen Uhrzeit addieren, von
der aktuellen Uhrzeit subtrahieren bzw. mit der aktuellen Uhrzeit vergleichen.

Stellen Sie sicher, dass die Stundenwerte stets im Bereich 0–23 und die Minuten- und
Sekundenwerte im Bereich 0–59 liegen. Sie dürfen bei der Implementierung der Methoden
Hilfsattribute und -methoden verwenden.
```

Vielen Dank schonmal


----------



## maki (17. Dez 2009)

> Könntet ihr mir vllt. ein par kleine TIpps geben damit ich den Einstieg besser finde?


Folge den Anweisungen:
Schreibe eine Klasse Uhrzeit, ....


----------



## Möpppel (17. Dez 2009)

Oki, das ist ja schonmal ein Anfang! Danke dir


----------



## nrg (17. Dez 2009)

damit hat er dir schonmal mindestens zwei wörter und zwei geschweifte klammern gesagt ;D. falls es dir vllt noch weiterhilft, repräsentiert die aufgabenstellung auch das grundgerüst der klasse. mach es wie maki schon schön angedeutet hat einfach schritt für schritt durch. bis c) sollte das drin sein. falls du iwo nicht weiter kommst, helfen wir dir anhand von ansätzen gern weiter.


----------



## Heady86 (17. Dez 2009)

Eigentlich steht ja schon alles schön beschrieben drin was du machen musst. Dadurch lässt sichs auch leicht googlen wenn du was nich weißt.

Ich mach mal nen Anfang:



> drei privaten Attribute
> stunden, minuten und sekunden vom Datentyp int repräsentiert.




```
private int stunden;
....
```




> Der Konstruktor Uhrzeit(int stunden, int minuten, int sekunden)..




```
public Uhrzeit (int stunden, int minuten, int sekunden) {
  this.stunden = stunden;
  this.minuten = minuten;
  this.sekunden = sekunden;
}
```



> getStunden()




```
public int getStunden() {
  return stunden;
}
```

usw.


----------



## Möppppel (21. Dez 2009)

So ich bin jetzt ein bissel vorrangekommen:


```
public class Uhrzeit {
    
// Attribute 
  
  private int stunden;
  
  private int minuten;
    
  private int sekunden;

// Konstruktoren  
    
    public Uhrzeit() {
         stunden = 0;
         minuten = 0;
         sekunden = 0;
    }
    
    public Uhrzeit(int newstunden, int newminuten, int newsekunden) {     
     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;
    }

// get- und set-Methoden 

  public int getStunden() {
    return stunden;
  }

  public int getMinuten() {
    return minuten;
  }

  public int getSekunden() {
    return stunden;
  }

  public void setUhrzeit(int stunden, int minuten, int sekunden) {
    stunde = h;
    minuten = m;
    sekunden = s; 
  }

}
```

Ist das soweit richtig (bis c) ??


----------



## Heady86 (21. Dez 2009)

Ich geh davon aus du hast den Code nicht compiliert, ansonsten hättest du einige Fehler. 
Diese hätten sich aber zum Gr0ßteil leicht durch Compilerfehlermeldungen finden lassen:

*FEHLER 1*


> ```
> public Uhrzeit(int newstunden, int newminuten, int newsekunden) {
> this.stunden = stunden;
> this.minuten = minuten;
> ...


Das stimmt so nicht. Mit 
	
	
	
	





```
this
```
 musst du nur arbeiten wenn eine Übergabeparameter gleich heißen wie deine variabelen im Code. Außerdem nutzt du hier deine Übergabeparameter gar nicht.

So würde es gehen:

```
public Uhrzeit(int stunden, int minuten, int sekunden) {     
     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;
    }
```
*
FEHLER 2*



> ```
> public void setUhrzeit(int stunden, int minuten, int sekunden) {
> stunde = h;
> minuten = m;
> ...



Es gibt die Variable "stunde" nicht, wenn dann "stunden". 
Außerdem der gleiche Fehler wie bei setUhrzeit(). Die übergebenen Namen sind nicht identisch mit denen die du in deiner Methode setzt.

*FEHLER 3*


> ```
> public int getSekunden() {
> return stunden;
> }
> ```



Hier dürfte der Fehler offensichtlich sein...


----------



## Möppppel (21. Dez 2009)

oh danke, dass sind echt dumme Fehler. Tut mir leid das ich das nicht gesehen habe


----------



## Möpppel (21. Dez 2009)

So hab jetzt mal die Fehler verbessert! 


```
public class Uhrzeit {
    
// Attribute 
  
  private int stunden;
  
  private int minuten;
    
  private int sekunden;

// Konstruktoren  
    
    public Uhrzeit() {
         stunden = 0;
         minuten = 0;
         sekunden = 0;
    }
    
    public Uhrzeit(int stunden, int minuten, int sekunden) {     
     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;
    }
// get- und set-Methoden 

  public int getStunden() {
    return stunden;
  }

  public int getMinuten() {
    return minuten;
  }

  public int getSekunden() {
    return sekunden;
  }

  public void setUhrzeit(int stunden, int minuten, int sekunden) {
    this.stunden = stunden;
    this.minuten = minuten;
    this.sekunden = sekunden;
  }

}
```

Is das jetzt soweit richtig das ich mit aufgabenteil C) weitermachen kann?


----------



## Marco13 (21. Dez 2009)

Ja.


----------



## Möpppel (21. Dez 2009)

Juhu. danke


----------



## Möpppel (21. Dez 2009)

ohh.. es wird jetzt erst richtig schwer


----------



## heoyeah (22. Dez 2009)

Ich muss die Aufgabe auch machen.
Bei mir funktioniert bis jetzt nur die Methode fürs Addieren.

```
public class Uhrzeit {

   // Attribute

   private int stunden;
   private int minuten;
   private int sekunden;
   public int Uhrzeit;

   // Konstruktoren
   
   public Uhrzeit() {

     stunden = minuten = sekunden = 0;

   }
   
   public Uhrzeit(int stunden, int minuten, int sekunden) {

     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;

   }
   
   // get-Methoden

   public int getStunden() {

     return stunden;

   }

   public int getMinuten() {

     return minuten;

   }

   public int getSekunden() {

     return sekunden;

   }

   // set-Methode

   public int setUhrzeit(int stunden, int minuten, int sekunden) {

     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;
     return Uhrzeit;
   }

   public String toString() {
     
      String Uhrzeit = getStunden() + ":";
      if (getStunden()<10)Uhrzeit = "0" + Uhrzeit;
      if (getMinuten()<10) Uhrzeit += "0";
      Uhrzeit += getMinuten() + ":";
      if (getSekunden()<10) Uhrzeit += "0";
      Uhrzeit += getSekunden();
      return Uhrzeit;
   }

   public void add(Uhrzeit u) {
     
      sekunden += u.sekunden;
      int neue_minuten = sekunden/60;
      sekunden = sekunden % 60;
      minuten += u.minuten;
      minuten += neue_minuten;
      int neue_stunden = minuten/60;
      minuten = minuten % 60;
      stunden += u.stunden;
      stunden += neue_stunden;
      stunden = stunden % 24
   }

}
```


----------



## nrg (22. Dez 2009)

Deine toString() Methode sieht doch auch echt gut aus! Funktioniert auch soweit.

Hier vllt noch eine Option für die toString() Methode:


```
import java.text.DecimalFormat;

public class Uhrzeit{
   ....
   public String toString() {
	  DecimalFormat myDF = new DecimalFormat("00");
	  return 	myDF.format(getStunden()) + ":" + 
	  			myDF.format(getMinuten()) + ":" + 
	  			myDF.format(getSekunden());
   }
}
[/Java]

die anderen methoden lass ich mal noch offen... deine add() funzt ja. ist allerdings nicht grad schön zu lesen.
edit: dann sollte die sub() Methode ja auch kein problem für dich sein.
Für die clone() musst du einfach ein neues Objekt anhand des aktuellen Objektes instanziieren.
Die Methode früher() ruft die Methode equals() auf.
In der equals() Methode musst du das Objekt mit dem übergegeben Objekt auf inhaltliche (nicht nur referenzielle!!) gleichheit überprüfen (paar ifs und die sache ist erledigt).

grüße
nrg
```


----------



## Heady86 (22. Dez 2009)

*Zusätzlich noch:*



			
				heoyeah hat gesagt.:
			
		

> ```
> stunden = stunden % 24
> ```


hier fehlt noch ein 
	
	
	
	





```
;
```
 ist aber warscheinlich nur eine copy/paste fehler



			
				heoyeah hat gesagt.:
			
		

> ```
> public int setUhrzeit(int stunden, int minuten, int sekunden) {
> 
> this.stunden = stunden;
> ...



Schau dir nochmal den Aufbau von Get/Set Methoden an, hier hast du beides miteinander vermischt.


----------



## Leuchtturm (23. Dez 2009)

nabend,
Ich muss die aufgabe leider auch machen 

Aber leider bekomm ich das mit den subtrahieren überhaupt nicht hin :rtfm:.
und wo der unterschied in der methode equals und früher liegt.
Kann mit vllt. jemand einen kleinen tipp geben?

danke


----------



## Marco13 (24. Dez 2009)

Der Unterschied zwischen equals und früher ist: equals vergleicht eine Uhrzeit mit _irgendeinem_ Objekt, und gibt zurück, ob das andere Objekt auch eine Uhrzeit ist, die die gleiche Zeit beschreibt. 
"früher" überprüft, ob eine Uhrzeit einen früheren Zeitpunkt beschreibt, als eine andere Uhrzeit.

Zum sub: Poste mal, was du bisher hast, und beschreibe die Probleme.


----------



## Leuchtturm (24. Dez 2009)

Bei sub hab ich halt noch keine wirkliche idee wie sich das einfach mathematisch umsetzen lässt ( vllt stunen * 3600 und minuten * 60 und dann wieder teilen? )

Die Methode equals hab ich jetzt so gestaltet:

```
public boolean equals(Uhrzeit u) {
   int b = sekunden;
   int a = u.sekunden;
   int x = minuten;
   int y = u.minuten;
   int i = stunden;
   int j = u.stunden;
   if (b == a || x == y || i ==j)
     return true;
    else
        return false;
 }
```

is das so richtig oder macht man das mit object.equals(X) ?


----------



## faetzminator (24. Dez 2009)

Ich würde es so machen (bezogen auf eine Klasse Foo mit den int's a und b):

```
@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (!(o instanceof Foo)) {
        return false;
    }
    Foo foo = (Foo) o;
    return this.a == foo.a && this.b == foo.b;
}
```
Der Unterschied ist, dass du laut Methodensignatur von Object nur ein Object übergeben bekommst. Zusätzlich musst du [c]o[/c] auf [c]null[/c] überprüfen (in meinem Fall macht das instanceof).
Edit: zusätzlich musst du deine Felder natürlich nicht mit einem OR, sondern mit einem AND überprüfen.


----------



## Leuchtturm (24. Dez 2009)

Sorry faetzminator, das versteh ich noch nicht so richtig (Absoluter Anfänger )


----------



## faetzminator (24. Dez 2009)

Was verstehst du nicht? Wenn das andere Objekt das genau gleiche wie das aktuelle ist (3) wird true (4) zurückgegeben. Ansonsten wird überprüft ob o vom Typen Foo ist (6), wenn nicht wird false (7) zurückgeben. Ansonsten wird das Objekt nach Foo gecastet (9) und deren a und b wird mit der aktuellen Instanz (this) verglichen (10). Das ganze muss natürlich AND und nicht OR verknüpft sein, da du nur true willst, falls alle (und nicht nur einer) Felder (a und b) gleich sind.


----------



## Leuchtturm (24. Dez 2009)

So in etwa? 


```
public boolean equals(Uhrzeit u) {
    if (this == u) {
     return true;
    }
    else 
        return false;
   
}
```


----------



## faetzminator (24. Dez 2009)

öhm, ich bezog die Erklärung auf meinen Code... Was verstehst du da nicht?


----------



## Leuchtturm (24. Dez 2009)

komm damit nicht zurecht, werd erstmal ne pause machen und dann nochmal scahun ob ich was finde was mit weiterhilft, sonst verzweifelst du noch an meiner inkompetens


----------



## heoyeah (24. Dez 2009)

Also bei mir sieht equals methode so aus:


```
public boolean equals(Object o) {
    	  
     Uhrzeit u = (Uhrzeit)o;
     if (this.stunden == u.getStunden() && this.minuten == u.getMinuten() && 
     this.sekunden == u.getSekunden()) {
       return true;
     }
     return false;
 }
```
Ist das richtig so?


----------



## Marco13 (24. Dez 2009)

So fast. Bis man mal aufruft
uhrzeit.equals(einStringOderSo);
Dann kracht's mit einer CLassCastException. Schau dir mal an, was "instanceof" macht.


----------



## faetzminator (24. Dez 2009)

1. das von Marco13 genannte instanceof
2. da hätten wir wieder die NullPointerException, welche sich aber durch instanceof lösen liesse
3. der Referenzvergleich in meinem Beispiel kann den Check schneller lassen werden, falls des öfteren gleiche Objekte miteinander verglichen werden


----------



## Marco13 (24. Dez 2009)

Ach ja...



faetzminator hat gesagt.:


> ```
> ...
> if (!(o instanceof Foo)) {
> return false;
> ...



Ich glaub' mein Kaffee wirkt noch nicht, aber ... im Moment glaube ich, dass das so nicht funktioniert!? Ist 
null instanceof Foo
nicht IMMER true? D.h. wenn dort "null" übergeben wird, wird doch weitergegangen, und dann unten versucht, auf das (auf Foo gecastete) null zuzugreifen? ???:L
(Würde mich aber wundern, weil du das zweimal so "selbstsicher" geschrieben hast!?  ... Mal testen..)


EDIT: Ahja ... da hatte ich wohl in meinem Hinterkopf irgendwas mit castbarkeit, Zuweisbarkeit und isAssignableFrom oder so durcheinandergewürfelt ... Hier steht's genau: Expressions:
_the result of the instanceof operator is true if the value of the RelationalExpression is not null and..._


----------



## heoyeah (24. Dez 2009)

Danke für die Hilfe.
So ist jetzt richtig oder?

```
public boolean equals(Object o) {

        if (this == o) {
            return true;
        }
        if (!(o instanceof Uhrzeit)) {
          return false;
        } 
        Uhrzeit u = (Uhrzeit) o;
        return this.stunden == u.getStunden() && this.minuten == u.getMinuten() && 
        this.sekunden == u.getSekunden();  
 
 }
```


----------



## faetzminator (24. Dez 2009)

Marco13 hat gesagt.:


> Ich glaub' mein Kaffee wirkt noch nicht, aber ... im Moment glaube ich, dass das so nicht funktioniert!? Ist null instanceof Foo nicht IMMER true? D.h. wenn dort "null" übergeben wird, wird doch weitergegangen, und dann unten versucht, auf das (auf Foo gecastete) null zuzugreifen? ???:L



falsch, [c]null[/c] gibt immer [c]false[/c] zurück


----------



## Faton (25. Dez 2009)

private boolean prüfe;


 public boolean equals(Uhrzeit u){
            float kleinerA,kleinerB;
            kleinerA= this.stunden*60+this.minuten+this.sekunden/60;
            kleinerB= u.stunden*60+u.minuten+u.sekunden/60;

            if(kleinerA==kleinerB){
                  return !prüfe;
            }
            else {
                  return prüfe;

            } 


            public boolean früher(Uhrzeit u){
            float kleinerA,kleinerB;
            kleinerA= this.stunden*60+this.minuten+this.sekunden/60;
            kleinerB= u.stunden*60+u.minuten+u.sekunden/60;
            if(kleinerA<kleinerB){
                  return !prüfe;
            }
            else {
                  return prüfe;

            }


      public void add(Uhrzeit u){
            this.sekunden+= u.sekunden;
            this.minuten+=  u.minuten;
            this.stunden+=  u.stunden;

            if(this.sekunden>59){
                  this.sekunden-=60;
                  this.minuten+=1;
            }

            if(this.minuten>59){
                  this.minuten-=60;
                  this.stunden+=1;
            } 

            if(this.stunden>23){
                  this.stunden-=24;

            }                       


            this.setUhrzeit(this.stunden,this.minuten,this.sekunden);


      }

      public void sub(Uhrzeit u){
            this.sekunden-= u.sekunden;
            this.minuten-=  u.minuten;
            this.stunden-=  u.stunden;

            if(this.sekunden<0){
                  this.sekunden+=60;
                  this.minuten-=1;
            }

            if(this.minuten<0){
                  this.minuten+=60;
                  this.stunden-=1;
            } 

            if(this.stunden<0){
                  this.stunden+=24;

            }  


aber ich habe kein plan wie ich clone und equals machen soll...
könnt ihr mir helfen?

danke

ich brauche eine exploizite beschreibung dafür


----------



## heoyeah (25. Dez 2009)

Mir fehlt auch nur noch clone.
Könnte bitte jemand einen Tip geben?


----------



## eRaaaa (25. Dez 2009)

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 10.2 Object ist die Mutter aller Klassen

Du musst halt ein neues Uhrzeit-Objekt erstellen, mit den gleichen Werten(Uhrzeit halt: also Sekunden,Stunden, Minuten) wie das, auf welches die methode aufgerufen wird, und dieses neue Objekt zurückgeben. (oder halt Variante 2 (siehe Link) und super.clone())


----------



## Faton (25. Dez 2009)

public class Uhrzeit{

      private int stunden,minuten,sekunden;
      private boolean prüfe;
      int uhrzeit;  
      public Uhrzeit(){
      }


      public Uhrzeit(int stunden,int minuten,int sekunden){
            if(stunden>23 || stunden<0){
               //System.out.println("Fehler!:Gültige Stunden nur von 0-23");

            }

            else if(minuten>59 || minuten<1){
               //System.out.println("Fehler!:Gültige Minuten nur von 0-59"); 

            }

            else if(sekunden>59 || sekunden<1){

            }

            else {         
               this.stunden= stunden;
               this.minuten= minuten;
               this.sekunden= sekunden;
            }



      }

      public void setUhrzeit(int stunden,int minuten, int sekunden){
            if(stunden>23 || stunden<0){
               //System.out.println("Fehler!:Gültige Stunden nur von 0-23!");

            }

            else if(minuten>59 || minuten<1){
               //System.out.println("Fehler!:Gültige Minuten nur von 0-59!"); 

            }

            else if(sekunden>59 || sekunden<1){
               //System.out.println("Fehler!:Gültige Sekunden nur von 0-59!"); 

            }

            else {         
               this.stunden= stunden;
               this.minuten= minuten;
               this.sekunden= sekunden;

            }


         }






      public int getUhrzeit(){
            return this.uhrzeit;
      }      

      public int getStunden(){
            return this.stunden;
       }

      public int getMinuten(){
            return this.minuten;
      } 

      public int getSekunden(){
            return this.sekunden;
      }     

      public void add(Uhrzeit u){
            this.sekunden+= u.sekunden;
            this.minuten+=  u.minuten;
            this.stunden+=  u.stunden;

            if(this.sekunden>59){
                  this.sekunden-=60;
                  this.minuten+=1;
            }

            if(this.minuten>59){
                  this.minuten-=60;
                  this.stunden+=1;
            } 

            if(this.stunden>23){
                  this.stunden-=24;

            }                       


            this.setUhrzeit(this.stunden,this.minuten,this.sekunden);


      }

      public void sub(Uhrzeit u){
            this.sekunden-= u.sekunden;
            this.minuten-=  u.minuten;
            this.stunden-=  u.stunden;

            if(this.sekunden<0){
                  this.sekunden+=60;
                  this.minuten-=1;
            }

            if(this.minuten<0){
                  this.minuten+=60;
                  this.stunden-=1;
            } 

            if(this.stunden<0){
                  this.stunden+=24;

            }                       


            this.setUhrzeit(this.stunden,this.minuten,this.sekunden);   

      }

      public boolean früher(Uhrzeit u){
            float kleinerA,kleinerB;
            kleinerA= this.stunden*60+this.minuten+this.sekunden/60;
            kleinerB= u.stunden*60+u.minuten+u.sekunden/60;
            if(kleinerA<kleinerB){
                  return !prüfe;
            }
            else {
                  return prüfe;

            }


      }

      public boolean equals(Uhrzeit u){
            float kleinerA,kleinerB;
            kleinerA= this.stunden*60+this.minuten+this.sekunden/60;
            kleinerB= u.stunden*60+u.minuten+u.sekunden/60;

            if(kleinerA==kleinerB){
                  return !prüfe;
            }
            else {
                  return prüfe;

            } 



}






      public Uhrzeit clone(){
            return new Uhrzeit(this.stunden,this.minuten,this.sekunden); 

      }

         public String toString() {

               String Uhrzeit = getStunden() + ":";
               if (getStunden()<10)Uhrzeit = "0" + Uhrzeit;
               if (getMinuten()<10) Uhrzeit += "0";
               Uhrzeit += getMinuten() + ":";
               if (getSekunden()<10) Uhrzeit += "0";
               Uhrzeit += getSekunden();
               return Uhrzeit;
         }









   }

es klappt mit dem clone einfach nicht!!!!!


The return type is incompatible with Object.clone()

das steht als fehlermeldung ???:L!!!1 Bitte gebt mir explizit das Beispiel für clone() und equals(Object o)

vielen danke


----------



## eRaaaa (25. Dez 2009)

man müsste sich nur mal die Links anschauen, die einem vorgeschlagen werden ;D
(und den Code in 
	
	
	
	





```
- Tags zu schreiben wäre auch gut! 

[code=Java]
public class Uhrzeit implements Cloneable{

//.....

    @Override
    public Uhrzeit clone() {
	try {
	    return (Uhrzeit) super.clone();
	} catch (CloneNotSupportedException e) {
	    throw new InternalError();
	}
    }
```


----------



## uhrzeit fertig (25. Dez 2009)

So damit sollte nun diese Aufgabe gelöst sein:


```
public class Uhrzeit implements Cloneable {
    
// Aufgabenteil a)
  
  private int stunden;
  private int minuten;  
  private int sekunden;
  

 
    
    public Uhrzeit() {
         stunden = 0;
         minuten = 0;
         sekunden = 0;
    }
    
    public Uhrzeit(int stunden, int minuten, int sekunden) {     
     this.stunden = stunden;
     this.minuten = minuten;
     this.sekunden = sekunden;
    }
// Aufgabenteil b)

  public int getStunden() {
    return stunden;
  }
  public int getMinuten() {
    return minuten;
  }
  public int getSekunden() {
    return sekunden;
  }
  public void setUhrzeit(int stunden, int minuten, int sekunden) {
    this.stunden = stunden;
    this.minuten = minuten;
    this.sekunden = sekunden;
  }
// Aufgabenteil c)

  public String toString() {
    String Uhrzeit = getStunden() + ":";
    if (getStunden()<10)Uhrzeit = "0" + Uhrzeit;
    if (getMinuten()<10) Uhrzeit += "0";
    Uhrzeit += getMinuten() + ":";
    if (getSekunden()<10) Uhrzeit += "0";
    Uhrzeit += getSekunden() + " Uhr";
    return Uhrzeit;
  }

  public boolean equals(Object o) {
      if (this == o) {
            return true;
        }
        if (!(o instanceof Uhrzeit)) {
          return false;
        } 
        Uhrzeit u = (Uhrzeit) o;
        return this.stunden == u.getStunden() && this.minuten == u.getMinuten() && 
        this.sekunden == u.getSekunden();  
  }    
  
  public Uhrzeit clone() {
    try {
        return (Uhrzeit) super.clone();
    } catch (CloneNotSupportedException e) {
        throw new InternalError();
    }
    }
// Aufgabenteil d)

  public void add(Uhrzeit u) {   
   this.sekunden+= u.sekunden;
   this.minuten+= u.minuten;
   this.stunden+= u.stunden;

  if(this.sekunden>59){
   this.sekunden-=60;
   this.minuten+=1;
 }

  if(this.minuten>59){
   this.minuten-=60;
   this.stunden+=1;
 }

  if(this.stunden>23){
   this.stunden-=24;
  } 
  }
 
 public void sub(Uhrzeit u) {
      this.sekunden-= u.sekunden;
      this.minuten-= u.minuten;
      this.stunden-= u.stunden;

       if(this.sekunden<0){
        this.sekunden+=60;
        this.minuten-=1;
       }

       if(this.minuten<0){
        this.minuten+=60;
        this.stunden-=1;
       }

      if(this.stunden<0){
        this.stunden+=24;                                
      }
  }
 public boolean früher(Uhrzeit u) {
  float kleinerA,kleinerB;
  kleinerA= this.stunden*60+this.minuten+this.sekunden/60;
  kleinerB= u.stunden*60+u.minuten+u.sekunden/60;
  if(kleinerA<kleinerB){
    return true;
  }
  else {
   return false;
  }  
 }
}
```

oder gibts noch verbesserungsvorschläge?
sonst danke an alle die hier mitgeholfen haben und tips und gute Ratschläge gegeben haben!

Frohe Weihnachten!


----------



## eRaaaa (25. Dez 2009)

Eine Sache hätte ich da schon

```
Stellen Sie sicher, dass die Stundenwerte stets im Bereich 0–23 und die Minuten- und
Sekundenwerte im Bereich 0–59 liegen. Sie dürfen bei der Implementierung der Methoden
Hilfsattribute und -methoden verwenden.
```

Das solltest du beim Konstruktor + setter Methoden beachten!
Ich könnte jetzt auch eine Uhrzeit angeben, die nicht in diesem Bereich liegt


----------



## Uhrzeit fertig (26. Dez 2009)

ja richtig wie es Faton schon gepostet hat:


```
public Uhrzeit(int stunden,int minuten,int sekunden){
if(stunden>23 || stunden<0){
//System.out.println("Fehler!:Gültige Stunden nur von 0-23");

}

else if(minuten>59 || minuten<1){
//System.out.println("Fehler!:Gültige Minuten nur von 0-59");

}

else if(sekunden>59 || sekunden<1){

}

else {
this.stunden= stunden;
this.minuten= minuten;
this.sekunden= sekunden;
}



}

public void setUhrzeit(int stunden,int minuten, int sekunden){
if(stunden>23 || stunden<0){
//System.out.println("Fehler!:Gültige Stunden nur von 0-23!");

}

else if(minuten>59 || minuten<1){
//System.out.println("Fehler!:Gültige Minuten nur von 0-59!");

}

else if(sekunden>59 || sekunden<1){
//System.out.println("Fehler!:Gültige Sekunden nur von 0-59!");

}
```


----------



## eRaaaa (26. Dez 2009)

Ich will ja nicht pingelig sein, aber wieso dürfen Minuten und Sekunden bei dir nicht 0 sein? 

Ich würde mir dafür auch lieber eine Methode schreiben, das erspart dir die Redundanz!


```
private boolean isCorrectTime(int stunden, int minuten, int sekunden) {
	return stunden < 24 && stunden >= 0 && minuten < 60 && minuten >= 0
		&& sekunden < 60 && sekunden >= 0;
    }
```

Konstruktor dann irgendwie so:

```
public Uhrzeit(int stunden, int minuten, int sekunden) {
	if (isCorrectTime(stunden, minuten, sekunden)) {
	    this.stunden = stunden;
	    this.minuten = minuten;
	    this.sekunden = sekunden;
	} else {
	    throw new IllegalArgumentException("Keine gültige Uhrzeit!");
	}
    }
```


----------



## Faton (27. Dez 2009)

The return type is incompatible with Object.clone()
Steht als Fehlermeldung???
kp warum das so ist...
achja habe einen Fehler noch gefunden....

Zeile 7 und 12... Minuten<0 und sekunden <0 nicht kleiner als eins^^...

Also das mit copy funktioniert nicht...
kann das eine bei euch ausprobieren vllt liegt das an meinem Rechner oder an Java :S...

Vielen dank Leute

Achja schöne Weihnachten


----------



## eRaaaa (27. Dez 2009)

Magst du uns deinen Code auch zeigen?  (und was für ein Copy überhaupt? )


----------



## MoD (4. Jan 2010)

Hallo,

könnt ihr mich nochmal die equals-Methode dieser Forum für Dummies erklären?


```
public boolean equals(Object o) {
      if (this == o) {
            return true;
        }
        if (!(o instanceof Uhrzeit)) {
          return false;
        } 
        Uhrzeit u = (Uhrzeit) o;
        return this.stunden == u.getStunden() && this.minuten == u.getMinuten() && 
        this.sekunden == u.getSekunden();  
  }
```


----------



## MoD (4. Jan 2010)

Genauer geht es um die (2), dass this == o?!
Dann verstehe ich das instanceof (5f) immernoch nicht genau. Es klärt ob es gleich 0 ist und überprüft irgendwelche Typen?!??
und dieses " Uhrzeit u = (Uhrzeit) o " in (8) check ich nicht. mit den ( .. ) um Uhrzeit
Allgemein verwirrt mich dieses zweimal true. Kann denn nicht in einem bestimmten Fall 2x true ausgegeben werden? Durch (2f) und das return... ab (9) ?!?!


----------



## eRaaaa (4. Jan 2010)

MoD hat gesagt.:


> Genauer geht es um die (2), dass this == o?!
> Dann verstehe ich das instanceof (5f) immernoch nicht genau. Es klärt ob es gleich 0 ist und überprüft irgendwelche Typen?!??
> und dieses " Uhrzeit u = (Uhrzeit) o " in (8) check ich nicht. mit den ( .. ) um Uhrzeit
> Allgemein verwirrt mich dieses zweimal true. Kann denn nicht in einem bestimmten Fall 2x true ausgegeben werden? Durch (2f) und das return... ab (9) ?!?!



Wenn einmal ein return kommt, wird die Methode beendet..also nicht weitergearbeitet, dahe rmacht man auch oft das

this==o ...denn wenn die eh auf das gleiche Objekt zeigen, müssen sie gleich sein und somit kann man sich den Rest des Prüfens sparen...
Instanceof macht man, damit man sich den null-check spart + damit man keine CastExcepion bekommt..da man ja auf Uhrzeit castet. Die MEthode kann ja jegliches Objekt übergeben bekommen!
Ja und der Rest prüft dann halt ob die Attribute (stunden,min, sek) halt gleich sind...


----------



## MoD (4. Jan 2010)

So weit, so gut. Verstanden 
Kannst du mir das 

```
Uhrzeit u = (Uhrzeit) o;
```
nochmal ganz klein erklären? Mit den ()


----------



## eRaaaa (4. Jan 2010)

Das ist ein cast. Vor dem Zeitpunkt, ist o ein normales Objekt für die Methode vom Typ Objekt ;D
Was bedeutet, du kannst darauf keine Methoden aus Uhrzeit aufrufen z.b. getStunden()., also musst du das Objekt wieder zu einem Uhrzeit-Objekt machen indem du auf Uhrzeit castest (da du ja weisst dass es ein Uhrzeit-Objekt ist, durch den instanceof- Test, gibt es dann da auch keine CastException).

Danach ist das Objekt o, bzw jetzt ist es ja u, halt eine Uhrzeit und du kannst darauf die Methodne aufrufen !


----------



## Sduni (5. Jan 2010)

und warum nicht einfach:


```
public boolean equals(Uhrzeit o) {
      if (this == o) 
            return true;
      return this.stunden == u.getStunden() && this.minuten == u.getMinuten() && 
      this.sekunden == u.getSekunden();  
  }
```


----------



## Landei (5. Jan 2010)

Du meinst sicher equals(Uhrzeit *u*). Du kannst natürlich so eine Methode schreiben, das ist aber nicht mehr die, die normalerweise zum Vergleichen verwendet wird. Andere Klassen, die vergleichen können müssen (wie z.B. Sets), wissen ja nicht, dass du so eine Methode hast (können sie nicht, sind ja Jahre vor deiner Uhrzeit-Klasse geschrieben). Sie wissen nur, das alle Objekte eine equals(*Object*) Methode haben (da die Klasse Object so eine hat, und alle anderen Klassen direkt oder indirekt von dieser Klasse erben), und deshalb verlassen sie sich auf diese, und nicht auf deine (für sie unbekannte) Methode.


----------



## Sduni (5. Jan 2010)

asso... bei was für ein konkretem beispiel würde es also einen Fehler geben???? so zum besseren verständniss?:L


----------



## eRaaaa (5. Jan 2010)

Naja, was heißt Fehler?! Du erhältst unter Umständen nicht das von dir erwünschte Ergebnis.
Bei dem Beispiel von dem von Landei angesprochenen Set: Man erwartet, dass nur unterschiedliche Objekte in einem Set sind! Dazu wird unteranderem die equals-Methode von dem Set benutzt, um den Vergleich zu vollziehen. Wenn du nun "deine" equals-Methode implementieren würdest, würde das Set die nicht beachten, weil sie eben nur die equals-Methode mit der bestimmten Signatur benutzt. Diese musst du also überschreiben, anstelle von überladen 


```
Uhrzeit u1 = new Uhrzeit(11, 11, 11);
	Uhrzeit u2 = new Uhrzeit(11, 11, 11);
	Set<Uhrzeit> uhrzeiten = new HashSet<Uhrzeit>(Arrays.asList(u1,u2));
	System.out.println(uhrzeiten.size());
```

Würde mit deiner equals-Methode (und entsprechender hashCode Implementierung) 2 liefern, obwohl die Objekte ja vom Inhalt eig. die gleichen sind, mit der o.g. equals, würde das von uns erwartete Ergebnis 1 herauskommen.


----------



## Sduni (5. Jan 2010)

ok, danke! Habs verstanden


----------



## MoD (7. Jan 2010)

Kann nochmal jemand schnell das clonen erklären? ^^


```
public Uhrzeit clone() {
    try {
        return (Uhrzeit) super.clone();
    } catch (CloneNotSupportedException e) {
        throw new InternalError();
    }
    }
```


----------



## eRaaaa (7. Jan 2010)

Hat doch Christian Ullenboom schon, man muß nur mal die Links lesen 

=> Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 10.2.4 Klonen eines Objekts mit clone()


----------

