Auf eine Variable von einer anderen Klasse aus zugreifen

Vivien

Mitglied
Hallo Liebe Community,

es tut mir leid, wenn dies eine dumme Frage ist - aber ich komme wieder einmal nicht so weiter wie ich das gerne hätte, trotz ausgiebiger Recherche.
Im Rahmen eines simplen Ratespiels, möchte ich von der Klasse Ratespiel.java - die Anzahl der Spieler auslesen, die in Spieler.java erstellt worden sind.

Ich habe zwar eine funktionierende Lösung gefunden und habe diese markiert, doch mir erscheint die Lösung "nicht wirklich schön". Meine ungeliebte Lösung habe ich hervorgehoben:

[CODE lang="java" title="Spieler.java" highlight="5,18,28,29,30"]import java.util.*;

public class Spieler {

public static int SpielerAnzahl;

public static void SpielerAnlegen() {
//Einlesen der Spielerzahl
Scanner anzahlSpieler = new Scanner(System.in);
System.out.println("Wie viele Spieler seid Ihr? Bitte gebt die Zahl der Mitspieler ein!");
int anzahlSpielerAusUserInput = anzahlSpieler.nextInt(); //Schreibe userinput in variable anzahlSpielerAusUserInput
System.out.println("Spiel mit " + anzahlSpielerAusUserInput + " Spielern(n) wird erstellt!");

//Erstelle ArrayListe mit eingegebenen Spielern und gib jedem Spieler eine Nummer angefangen bei 1 & endend bei Spielernr. aus UserInput
ArrayList<Integer> SpielerArray = new ArrayList<Integer>();
for (int i=1; i<=anzahlSpielerAusUserInput; i++) {
SpielerArray.add(i);
SpielerAnzahl++;
}

//Ausgabe der erstellten Spieler aus der ArrayListe mit dem ListIterator (mehr zur Überprüfung, das auch alle Spieler korrekt erstellt wurden sind)
ListIterator<Integer> li = SpielerArray.listIterator();

while(li.hasNext()) {
System.out.println("Spieler Nummer " + li.next() + " erfolgreich erstellt.");
}
}
public static int getSpielerAnzahl() {
return SpielerAnzahl;
}



}[/CODE]

[CODE lang="java" title="Ratespiel.java" highlight="24"]import java.util.*;

public class Ratespiel {
public void starteSpiel() {
//Spieler anlegen
Spieler spieler = new Spieler();
spieler.SpielerAnlegen();

//Formatierung
System.out.println();
System.out.println("Spiel startet jetzt!");
System.out.println();

//Zufallszahl Intervall festlegen
int max = 10;
int min = 1;
int range = max - min + 1;

//Zufallszahl erzeugen im oben festgelegten Intervall
int rand = 0;
for (int i = 0; i < 10; i++) {
rand = (int)(Math.random()*range) + min;
}
System.out.println("Alle " + Spieler.getSpielerAnzahl() + " Spieler suchen sich jetzt eine Zahl aus:");


}
}[/CODE]

Nur der Vollständigkeit halber noch der SpielStarter:
[CODE lang="java" title="SpielStarter.java"]public class SpielStarter {
public static void main(String[] main) {
Ratespiel ratespiel = new Ratespiel();
ratespiel.starteSpiel();
}
}[/CODE]

Ich hätte gerne die Lösung so umgesetzt, dass ich nicht nochmal unnötig in der for Schleife aus Zeile 18, in Spieler.java mitzählen muss.
Folgendes habe ich versucht (veränderte Zeilen hervorgehoben):

[CODE lang="java" title="Spieler.java" highlight="6,25"]import java.util.*;

public class Spieler {


public static int SpielerAnlegen() {
//Einlesen der Spielerzahl
Scanner anzahlSpieler = new Scanner(System.in);
System.out.println("Wie viele Spieler seid Ihr? Bitte gebt die Zahl der Mitspieler ein!");
int anzahlSpielerAusUserInput = anzahlSpieler.nextInt(); //Schreibe userinput in variable anzahlSpielerAusUserInput
System.out.println("Spiel mit " + anzahlSpielerAusUserInput + " Spielern(n) wird erstellt!");

//Erstelle ArrayListe mit eingegebenen Spielern und gib jedem Spieler eine Nummer angefangen bei 1 & endend bei Spielernr. aus UserInput
ArrayList<Integer> SpielerArray = new ArrayList<Integer>();
for (int i=1; i<=anzahlSpielerAusUserInput; i++) {
SpielerArray.add(i);
}

//Ausgabe der erstellten Spieler aus der ArrayListe mit dem ListIterator (mehr zur Überprüfung, das auch alle Spieler korrekt erstellt wurden sind)
ListIterator<Integer> li = SpielerArray.listIterator();

while(li.hasNext()) {
System.out.println("Spieler Nummer " + li.next() + " erfolgreich erstellt.");
}
return anzahlSpielerAusUserInput;
}




}[/CODE]

Sprich: Ich würde gerne die Methode "SpielerAnlegen" so nutzen, dass ich anschließend als Rückgabewert die Spieleranzahl ebenfalls mit-erhalte, am besten gleich aus der eh schon vorhandenen Variable anzahlSpielerAusUserInput, um diese an beliebiger Stelle in Ratespiel.java zu nutzen.
Leider weiß ich aber nicht wie ich dann auf den Rückgabewert aus Ratespiel.java aus zugreifen soll 🙁

Mit folgendem Code wird SpielerAnlegen komplett durchgelaufen und nicht nur der return Wert geliefert logischerweise:
Java:
        System.out.println("Alle " + Spieler.SpielerAnlegen() + " Spieler suchen sich jetzt eine Zahl aus:");

Habe ich mich verrannt und kann man das so in der Weise gar nicht umsetzen?
Oder fehlt mir eine wichtige Grundlage um das so umsetzen zu können?

Über Hilfestellung, wie das richtig (und elegant) umzusetzen wäre, würde ich mich freuen 🤔
Vielen Dank!

Lg
 
mach erstmal alles nicht static was nicht "main" heißt dann sollten sich einige Probleme von alleine Lösen


du kannst auf die Variable nicht zu greifen weil sie Static ist dh alle Spieler greifen auf die Gleiche Variable zu wegen dem static aber das ufert dann zu dem aus dass man den code nicht mehr versteht weil static schon so ziemlich gegen die grundprinzipien von java ist...

es gibt ausnahmen wie Math.PI weil sich PI nur unwahrscheinlich in nächster Zeit verändert das hat aber auch "public static final" also unveränderbar
 
Zuletzt bearbeitet von einem Moderator:
Also in Ratespiel hast Du ja in starteSpiel eine lokale Variable spieler. Diese könntest Du zu einer Instanzvariable machen, dann hättest Du in allen Methoden von Ratespiel Zugriff auf diese Instanz.
 
Hallo,
vielen Dank für eure Antworten. Tut mir leid das ich Heute erst antworte.
Also ich bin noch einmal die static Grundlagen durchgegangen und werde darauf in Zukunft achten, dieses nur dann einzusetzen wenn ich es auch wirklich brauche. Vielen Dank @Mart .
Vielen Dank auch für @kneitzel , damit wurde mein Problem gelöst 🙂
Lg
 

Zurück
Oben