Variablen Instanzen gleich aber warum ?

KenParker

Mitglied
Hallo alle zusammen,

Ich bin neue im Java und grübel gerade unter folgenden Problem.
die Variablen p und x werden wie folgendes erzeugt:
Java:
Player p = new Player("Paul");
PlayerRef x = new PlayerRef(p);

egal was ich in p zuordne, hat x der gleiche wert.

Ich kann nicht begreifen warum. Hat jemand ein Typ ?

Hier der Code:

Java:
public class ObjGen1
{

    Player p = new Player("Paul");
    PlayerRef x = new PlayerRef(p);

    public void ObjTest()
    {
        p.name = "Lukas";

        System.out.println("p :" + p);
        System.out.println("x :" + x);
        
        p.name = "Pablo";

        System.out.println("p :" + p);
        System.out.println("x :" + x);
    }
}

public class PlayerRef
{
    private Player playerRef;
    
    public PlayerRef()
    {}
    
    public PlayerRef(Player player)
    {
        playerRef = player;
    }
 }
 
public class Player
{
    public String name;
    
    public Player()
                   {}
    public Player(String name)
    {
        this.name = name;
    }
            
    public Player(Player p)
    {
        this.name = p.name;
    }
    
 

}
 
Instanzen gleich aber warum ?
In Java-Sprech heißt das allgemein, dass der Aufruf der Methode equals true zurück liefert. Weiß nicht, ob Dir das geläufig ist, deswegen sag ich's lieber nochmal. Das wird bei Deinem Code nie passieren. Auch der Vergleich mit '==' wird nie true werden. Insofern ist mir leider nicht klar, was Du mit: "egal was ich in p zuordne, hat x der gleiche wert.", meinst. Könntest Du das etwas näher erläutern?
 
In PlayerRef ist eine Referenz auf dasSELBE Player-Objekt gespeichert, wie das, das unter dem Namen 'p' bekannt ist. Wenn man 'p.name' einen neuen String zuweist, dann ist das eben der neue String (auch wenn dasSELBE Player-Objekt nochmal in der PlayerRef liegt).
 
Also
Java:
 public void ObjTest()
    {
        p.name = "Lukas";
 
        System.out.println("p :" + p);
        System.out.println("x :" + x);
        
        p.name = "Pablo";
 
        System.out.println("p :" + p);
        System.out.println("x :" + x);
    }

Diese Ausgabe ist so, wie dein Code ist unsinnig. Wenn du nicht die toString() Methode von Player und PlayerRef überschreibst kriegst du da immer nur KlassenName@Adresse raus. Das sagt dir aber gar nichts, über den eigentlichen Zustand des Objektes (Belegung der Variablen).
Außerdem hält der PlayerRef eine Referenz auf den Player. Wenn du dann an dem Player den Namen änderst, dann passiert das auf dem Player p.
 

Zurück
Oben