Objektwerte werden ungewollt überschrieben

cartilage

Mitglied
Hallo an Alle!

Ich habe eine Frage zum Setzen von Objektwerten per Schleife.

Und zwar habe ich eine Klasse Mannschaft erstellt, welche aus jeweils 11 Objekten Spieler bestehen. Diese werden beim Aufruf des Konstruktors erzeugt.
Mittels einer for-Schleife möchte ich nun jedem Spieler eine zufällig erzeugte Nummer zuweisen.
Anstatt jedem Spieler eine neue Nummer zu geben, werden jedoch pro Iteration alle Nummern der bisher erzeugten Spieler überschrieben.

Das soll natürlich nicht sein 🙂
Anbei mein Beispielcode, vll wisst ihr was ich da falsch mache.

Java:
public class Spieler{
int nummer;

public Spieler(){
this.nummer = new int;
}
}

public class Mannschaft{
Spieler[] einzelner = new Spieler[11];

public Mannschaft(){

for(int i=0; i<11; i++){
einzelner[i] = new Spieler();
int cache = new int;
cache = (referenz auf methode welche eine spielernummer berechnet);
einzelner[i] = new Spieler(cache);
einzelner[i].setNummer(cache);
}

}

}
 
Du hast das hoffentlich nicht wirklich so in einer java-Datei stehen?! Mehrere public-Klassen in einer Datei geht wohl nicht. Und was
Code:
new int
bedeuten oder bewirken soll, weiss ich auch nicht. Einen int-Wert weisst du zu, z.B.
Code:
int nummer = 0;
, aber nicht mit new.
Und steht das wirklich so in deinem Code:
Code:
cache = (referenz auf methode welche eine spielernummer berechnet);
 
denkbar ist dass das Attribut fälschlicherweise statisch ist, dann gilt der eine aktuelle Wert für alle Objekte,
aus dem Code ist kein Fehler zu sehen mal abgesehen von den offensichtlichen,

du musst schon ein lauffähiges Mini-Programm mit System.out.println oder sonstwie überzeugender Fehlerbeschreibung posten
 
Nein ich habe beide Klassen hier untereinander geschrieben, der Übersicht halber und das Problem vereinfacht. Auch das in der Klammer steht im Code natürlich so nicht da.
Der Code produziert keine Fehler, sondern überschreibt nur alle Objektwerte der bereits bestehenden Objekte.
 
Einmal: Einrückung ist wichtig 😉

Zweitens: new int ? schreib doch einfach int cache = 0;

Java:
einzelner[i] = new Spieler(cache);
einzelner[i].setNummer(cache);

Die beiden Aufrufe setzen entsprechende Methoden (bzw. den einen konstruktor) vorraus. Wieso setzt du 2x die Nummer?

Rufe einfach nur den Konstruktor auf und machs so:

Java:
public Spieler(int nummer){
this.nummer = nummer;
}

Natürlich ist das erste Erstellen eines Spieler in der for-schleife zu Beginn dann unnötig, der wird eh wieder "überschrieben"

Edit: Wie Slater schon sagt: Einen ganzen Code bitte 😉
 
Ich werde NIE behaupten, dass das da unten gut ist, aber mir war gerade mal 1 Minute lang langweilig ...
Immerhin haben weder Compiler noch JRE haben daran was auszusetzen 😀

Java:
public class SpielerTest {

	private static class Spieler {
		private int nummer;

		public Spieler(){
			nummer = 0;
		}
		public void setNummer (int nr) {
			nummer = nr;
		}
		@Override
		public String toString() {
			return "Spieler " + nummer;
		}
	}

	private static class Mannschaft {
		private Spieler[] spielerListe = new Spieler[11];
		private final String name;

		public Mannschaft(String name){
			this.name = name;
			for(int i=0; i<11; i++){
				int cache = i+1; //hochkomplexe Routine zur Berechnung der Spielernummer :-)
				spielerListe[i] = new Spieler();
				// würde ich aber direkt über den Konstruktor machen
				spielerListe[i].setNummer(cache);
			}
		}

		@Override
		public String toString() {
			final String newline = System.getProperty("line.separator");
			String retVal = name + newline;
			for (Spieler s : spielerListe)
				retVal += s + newline;
			return retVal;
		}
	}

	public static void main(String[] args) {
		Mannschaft loser = new Mannschaft("Loser team");
		System.out.println(loser);
	}
}
 
Danke für eure Antworten.

Um die Sache zu Vereinfachen, habe ich gerade ein Beispiel entworfen, mit denselben Aufgaben. Dies funktioniert nun ohne Probleme 😳

Ich werde im Hauptprogramm nochmals die entsprechenden Teile neu schreiben und dann evt mit einem nicht funktionierenden Beispiel auf euch zurückkommen.
 

Zurück
Oben