# Methode, die etwas hochzählt



## Gulliver (18. Okt 2009)

Hallo,

ich hätte da eine Frage. Und zwar gehts um Folgendes:

Ich bin noch blutiger Anfänger und ich übe gerade ein wenig, wie das mit Objekte und Klassen, etc. funktioniert. Da hab ich jetzt eine Aufgabe, da ist eine Klasse von Bankangestellten gegeben, mit gewissen Attributen. Eines davon ist eine Angestelltennummer, die jeder Bankangestellte hat. Jedem Objekt, das neu erzeugt wird, soll automatisch eine Angestelltennummer zugewiesen werden, die um 1 höher ist als die Angestelltennummer vom vorherigen Objekt. Ich zeig euch mal den bisherigen Code und was ich dann probiert hab:


```
public class Angestellter {

	public String name;
	public String vorname;
	public int stunden;
	public static int angestelltenNummer;
	public int folgeNummer=angestelltenNummer;
	
		
	public void ausgabe(Angestellter obj) {
		System.out.println(obj.name);
		System.out.println(obj.vorname);
		System.out.println(obj.stunden);
		System.out.println(obj.Nummer());
	}
	
			
	Angestellter() {
		
	}
	
	public int Nummer() {
		
		folgeNummer++;
		return folgeNummer;
	}
	
	public Angestellter(String nname, String vvorname, int sstunden, Angestellter Nummer) {
		name = nname;
		vorname = vvorname;
		stunden = sstunden;
				
	}
		
	public static void main(String[] args) {
	Angestellter s;
	Angestellter s1;
	s = new Angestellter();
	s1= new Angestellter();

	s.name="hans";
	s.Nummer();
   	s1.name="Fritz";
	s1.Nummer();
	
        s.ausgabe(s);
	s1.ausgabe(s1);
	}

}
```

Oben sieht man, wie ich das probiert hab. Ich habe eine Methode "Nummer" entwickelt, die die Folgenummer ermittelt. Allerdings hab ich bei der Ausgabe das Problem, dass dem ersten Objekt als Angestelltennummer der Wert 2 und dem zweiten Objekt ebenfalls die 2 zugewiesen wurde. Wie krieg ich das richtig hin? Wo liegt hier mein Denkfehler?

Danke für jede Hilfe.


----------



## Landei (18. Okt 2009)

Die einfachste Variante ist dieses Schema:


```
class Bla {
  private static int counter = 0;
  private int id; 
  
  public Bla() {
     id = counter++; 
  }
}
```

Die Klasse (deshalb static!) besitzt eine Variable counter. Jede erzeugte Instanz setzt seine Id gleich counter, und erhöhst diesen dann um 1 (mit ++). Da int ein primitiver (oder Werte-) Typ ist, beeinflusst das Erhöhen von counter die bereits gesetzten IDs nicht.


----------



## romzac (18. Okt 2009)

Mhhh, 2 Varianten wären möglich:

A) Die aktuell verfügbare ID nicht innerhalb der Klassen speichern, sondern über eine Variable im Hauptprogramm verwalten. Damit wären die Objekte von der Aufgabe befreit, sich um die letzte gültige ID kümmern zu müssen.

B) Falls das inkrementieren doch in den Klassen bleiben soll, empfiehlt sich das Schlüsselwort "static" vor einem Attribut. Damit verfügen alle instanzierten Objekte von der Klasse über den gleichen Wert. Das Hochzählen und Zuweisen erfolgt praktischerweise im Konstruktor. Dann sieht es so aus wie hier beschrieben:


```
public class Angestellter {
 
    public String name;
    public String vorname;
    public int stunden;
    public int angestelltenNummer;
    public static int folgeNummer = 1; // Startwert
    
        
    public void ausgabe() {
        System.out.println(this.name);
        System.out.println(this.vorname);
        System.out.println(this.stunden);
        System.out.println(this.Nummer());
    }
               
    Angestellter() {
        
    }
        
    public Angestellter(String nname, String vvorname, int sstunden, Angestellter Nummer) {
        name = nname;
        vorname = vvorname;
        stunden = sstunden;
// Zuweisen und Hochzählen
        angestelltenNummer = folgeNummer;
        folgeNummer++;
    }
```


----------



## Landei (18. Okt 2009)

Inwiefern unterscheidet sich B) von meinem Vorschlag?


----------



## Gulliver (18. Okt 2009)

Super, danke euch! Das hat prima funktioniert. 

Jetzt hätt ich aber nur noch eine letzte Frage:

Und zwar hab ich jetzt eine Methode entworfen, die die Überstunden eines Arbeites ausrechnet und zwar soll ich den this-Operator verwenden:


```
public int Uestunden(int StundenzahlErlaubt) {
 return this.stunden-StundenzahlErlaubt;
}
```

Hab ich hier den this-Operator auch richtig verwendet? Ich dachte, der wird nur dazu verwendet, um zwischen dem Methoden-Parameter und den Attributen der Klasse zu unterscheiden, also dass da nichts verwechselt werden kann. Aber "stunden" wird ja in meiner Methode gar nicht als Parameter übergeben. Kann man this hier so trotzdem verwenden und macht das dann überhaupt Sinn?


----------



## Leroy42 (19. Okt 2009)

Gulliver hat gesagt.:


> Hab ich hier den this-Operator auch richtig verwendet? Ich dachte, der wird nur dazu verwendet, um zwischen dem Methoden-Parameter und den Attributen der Klasse zu unterscheiden, also dass da nichts verwechselt werden kann. Aber "stunden" wird ja in meiner Methode gar nicht als Parameter übergeben. Kann man this hier so trotzdem verwenden und macht das dann überhaupt Sinn?



Ja er wird gebraucht um zwischen den Attributen und möglicherweise gleichnamigen
Parametern zu unterscheiden:


```
public class Punkt {
  private x, y;
  public void setX(int x) {this.x = x:}
  public void setY(int y) {this.y = y:}
  public int getX() {return x;}
  public int getY() {return y;}
}
```

Es ist zwar möglich, macht jedoch keinen Sinn.


----------



## Gulliver (19. Okt 2009)

Leroy42 hat gesagt.:


> Es ist zwar möglich, macht jedoch keinen Sinn.



Hmm, das ist ja gerade das komische. Ich habs so verstanden wie du mir das eben erklärt hast. Nur war die Methode genauso vorgegeben wie ich sie oben geschrieben hab. Da sollen wir die this-Referenz verwenden. Und da der Parameter nicht wie ein Attribut der Klasse benannt wurde, wüsste ich nicht, weshalb this da gebraucht wird. Komisch irgendwie!


----------

