Auf Eigenschaften von Objekten anderer Klassen zugreifen

Diskutiere Auf Eigenschaften von Objekten anderer Klassen zugreifen im Java Basics - Anfänger-Themen Bereich.
A

AurI

Hallo, ich fürchte ich habe einen Knoten im Hirn. Ich komme einfach nicht weiter.
Ich habe eine Klasse Player mit div. Eigenschaften wie id, name etc.
Java:
public class Player {

    private int id;
    private String name;
    private boolean isActive;
    // usw..
    
    public Player() {
    }

    public Player(int id, String name, boolean isActive) {
        this.id = id;
        this.name = name;
        this.isActive = isActive;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public boolean isActive() {
        return isActive;
    }

}
Dann habe ich eine Klasse Setup in der ein Player mit Namen player1 und seinen Eigenschaften erstellt wird:

Java:
public class Setup {
    
    int id = 1;
    String name = "user1";
    boolean isActive = true;

    private Player player1 = new Player(id, name, isActive);
    
    // hier passiert das ein oder andere mit den Eigenschaften
Dann komme ich im Laufe des Programms zur Klasse Game und möchte hier einem neuen Player player2 die Eigenschaften von player1 zuweisen. Aber wie spreche ich den jetzt an?

Mein Ansatz war
Java:
public class Game {
    
    private Player player2 = new Player();
    
    player2.id = player.getId() + 1;

usw....
Aber das geht so nicht (Eclipse meldet z.B Syntax error on oken "id", VariableDeclaratorId expected after this token) . Hat irgendjemand einen Tipp für mich? Ich möchte auch noch auf weitere Eigenschaften von player zugreifen und sie an player2 übergeben.
 
H

httpdigest

In Java muss ausführbarer Code immer in Methoden stehen!
Die einzige Ausnahme ist die Deklaration von Klassenvariablen oder Instanzvariablen mit gleichzeitiger Initialisierung. Hier kann die Initialisierung ein Ausdruck sein, der nicht innerhalb einer Methode steht.
Der Code player2.id = player.getId() + 1; ist ausführbarer Code, der keine Initialisierung einer Variablendeklaration ist. Somit muss er innerhalb einer Methode (dazu zählen auch Konstruktoren und Initializer Blöcke) stehen.
Desweiteren ist `id` von `Player` als "private" deklariert. Somit kannst du nicht von außerhalb der `Player` Klasse auf `id` zugreifen. Schreibe z.B. einen "Setter" für `id` und die anderen Instanzvariablen von `Player`, die du außerhalb der Klasse `Player` setzen möchtest.
 
T

temi

Die Attribute sind alle (korrekt) private deklariert. Deshalb kannst du nicht direkt darauf zugreifen.

Verwende z.B. den Konstruktor:

Java:
public class Game {
 
    private Player player2 = new Player(player.getId()+1, ...);
    // ...
oder erstelle Setter für die Attribute. Diese Lösung finde ich persönlich nicht so gut, denn eine Klasse sollte nachdem sie erzeugt wurde möglichst funktionsfähig sein. Deshalb würde ich auch den leeren Konstruktor von Player wieder löschen, denn eine "leere" Playerinstanz ist nicht sinnvoll. Außerdem sollte eine Klasse möglichst viel von ihrem Inneren Aufbau verbergen und nur nach außen geben, was unbedingt nötig ist. Darum sind Setter eher fragwürdig.

Oder baue dir einen Kopierkonstruktor für Player:
Java:
    public Player(Player other) {
        this(other.id, other.name, other.isActive);
    }

    public Player(int id, String name, boolean isActive) {
        this.id = id;
        this.name = name;
        this.isActive = isActive;
    }
Edit: Manche Attribute sollten natürlich von außen veränderbar sein. In deinem Fall ist es sinnvoll das sich die Id und der Name des Players nicht nachträglich ändern lassen, aber die Aktivität schon. Dafür solltest du entsprechende Methoden erstellen, z.B. void activate() und void deactivate().
 
Zuletzt bearbeitet:
T

TM69

Ein paar Sachen fallen mir so spontan auf:
  1. Woher kommt "player"?
  2. Wiese deklarierst du in der Klasse Setup die Attribute öffentlich und in Game player2 als private? (Unschöner Stiel)
  3. Du benutzt "player2.id = player.getId() + 1" außerhalb einer Funktion.
Normalerweise wenn du identische Klassen hast, die Daten untereinander austauschen, benutzt man einen Copy-Konstruktur bzw. die clone() - Funktion: s. http://www.angelikalanger.com/Articles/EffectiveJava/06.Clone-Part2/06.Clone-Part2.html
 
A

AurI

  1. Woher kommt "player"?
  2. Wiese deklarierst du in der Klasse Setup die Attribute öffentlich und in Game player2 als private? (Unschöner Stiel)
  3. Du benutzt "player2.id = player.getId() + 1" außerhalb einer Funktion.
Moin, TM69, sorry "player" ist ein Tippfehler, es handelt sich um player1, der wird als Objekt von Player in Setup erstellt. Die Attribute sind nur zum testen darin, eigentlich werden sie über die login-Funktion übergeben.

Ich hab mir mittlerweile überlegt, dass ich eigentlich gar keinen player2 brauche, wenn ich irgendwie direkt auf player1 zugreifen könnte. Ich habe in Setup einen Getter:
Java:
public Player getPlayer() {
        return player;
    }
Könnte mir jemand anhand eines Beispiel Codes zeigen, wie ich jetzt in "Game" an die Eigenschaften von "player1" komme? Ich habe schon so einiges ausprobiert, aber einfach das Objekt mit Punktoperator a la player1.getID() ansprechen geht wohl nicht so einfach, wie ich dachte.
 
mihe7

mihe7

Ich verstehe das Problem nicht ganz. Wenn Du ein Spiel erstellst, musst Du dem Spiel halt den Player oder das Setup mitgeben.
Java:
public class Game {
    private boolean gameOver;
    private Player player;

    public Game(Player player) {
        this.player = player;
    }
    // Oder auch:
    public Game(Setup setup) {
        this.player = setup.getPlayer();
    }
}
Wenn Du jetzt im Spiel eine Eigenschaft des Spielers brauchst, greifst Du halt über player auf das Player-Objekt zu:
Java:
    private void updateGameState() {
        if (player.isDead()) {
            gameOver = true;
        }
    }
 
Thema: 

Auf Eigenschaften von Objekten anderer Klassen zugreifen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben