2010-05-15 3 views
1

Je suis un peu gêné de demander ceci comme je devrais savoir mieux, mais voici ce que j'ai.Propriétés et références de Java - Je ne reçois pas ce que j'attends

J'ai un objet "Pitcher" avec une propriété int de "runsAllowed". J'ai un objet Batter qui a la propriété de "responsiblePitcher". J'ai un objet Team qui a une propriété "lanceur". Lorsque le batteur atteint la base:

Batter.responsiblePitcher = Team.pitcher; 

Tout cela est bon et bon. Cependant, si nous avons un changement de lanceur alors que le coureur est sur la base, je mis un nouveau lanceur dans Team.pitcher:

Team.pitcher = new Pitcher(); 

... et bien sûr, cela change la valeur de Batter.pitcher.

Comment dois-je faire les choses différemment de telle sorte que la propriété Batter.responsiblePitcher continue de pointer vers le lanceur qui le laisse sur la base au lieu de pointer sur le whever dans la propriété Team.pitcher? Encore une fois, je me sens comme je devrais le savoir déjà ...

Merci.

+0

Vous ne devriez rien avoir à faire. Batter.reponsiblePitcher devrait rester la valeur qu'il était ... –

Répondre

2

... et bien sûr cela change la valeur de Batter.pitcher.

Ceci n'est pas vrai. Votre problème se situe ailleurs. Peut-être vous réellement changer la valeur comme ceci:

Team.pitcher.changeSomeProperty(newValue); 

alors ce sera en effet se reflètent dans les autres références puisqu'elle indique la même instance.

Java est une référence de passage par valeur. L'exemple ci-dessous prouve ceci:

import java.util.Arrays; 

public class Test { 
    public static void main(String... args) { 
     String[] strings = new String[] { "foo", "bar" }; 
     changeReference(strings); 
     System.out.println(Arrays.toString(strings)); // still [foo, bar] 
     changeValue(strings); 
     System.out.println(Arrays.toString(strings)); // [foo, foo] 
    } 
    public static void changeReference(String[] strings) { 
     strings = new String[] { "foo", "foo" }; 
    } 
    public static void changeValue(String[] strings) { 
     strings[1] = "foo"; 
    } 
} 
+0

Effectivement, ce que vous avez décrit est correct, et Batter.responsiblePitcher conservait la valeur correcte. J'ajustais incorrectement les propriétés de responsiblePitcher dans un autre endroit, et il n'y avait jamais aucune raison pour que cette question existe. : P Merci! – Blumer

1

En fait, votre hypothèse n'est pas correcte. L'affectation de Team.pitcher à une nouvelle valeur ne change pas Batter.pitcher. Batter.pitcher pointe toujours vers l'ancienne instance Pitcher.

La raison est que vous affectez une référence à un objet, et non l'objet lui-même.

Questions connexes