2010-12-16 146 views
1
public static void main(String[] args) { 
    Foo[] foo1 = new Foo[1]; 
    Foo[] foo2 = new Foo[1]; 
    foo1[0] = new Foo(); 
    foo2[0] = new Foo(); 
    foo1[0].x = 1; 
    foo2[0].x = 2; 
    swapA(foo1, foo2); 
    System.out.println("Swap A " + foo1[0].x + " " + foo2[0].x); 
    swapB(foo1[0], foo2[0]); 
    System.out.println("Swap B " + foo1[0].x + " " + foo2[0].x); 
    swapC(foo1[0], foo2[0]); 
    System.out.println("Swap C " + foo1[0].x + " " + foo2[0].x); 
    swapD(foo1, foo2); 
    System.out.println("Swap D " + foo1[0].x + " " + foo2[0].x); 
} 

public static void swapA(Foo[] o1, Foo[] o2) { 
    Foo[] temp; 
    temp = o1; 
    o1 = o2; 
    o2 = temp; 
    System.out.println("Swap A " + o1[0].x + " " + o2[0].x); 
} 

public static void swapD(Foo[] o1, Foo[] o2) { 
    Foo temp; 
    temp = o1[0]; 
    o1[0] = o2[0]; 
    o2[0] = temp; 
    System.out.println("Swap D " + o1[0].x + " " + o2[0].x); 
} 

public static void swapB(Foo o1, Foo o2) { 
    Foo temp; 
    temp = o1; 
    o1 = o2; 
    o2 = temp; 
    System.out.println("Swap B " + o1.x + " " + o2.x); 
} 

public static void swapC(Foo o1, Foo o2) { 
    int temp; 
    temp = o1.x; 
    o1.x = o2.x; 
    o2.x = temp; 
    System.out.println("Swap C " + o1.x + " " + o2.x); 
} 


Swap A 2 1 
Swap A 1 2 
Swap B 2 1 
Swap B 1 2 
Swap C 2 1 
Swap C 2 1 
Swap D 1 2 
Swap D 1 2 

Pour mieux comprendre, pourquoi swapA et swapB ne changent pas la valeur lors de l'impression dans la méthode principale, mais par elle-même la méthode change la valeur. Je pensais que l'objet et le tableau étaient passés par référence quand vous l'échangez, la valeur d'origine changera aussi?Java Passage tableau et valeur d'objet

+0

Veuillez lire http://www.javaranch.com/campfire/StoryPassBy.jsp. –

Répondre

4

S'il vous plaît voir Is Java "pass-by-reference" or "pass-by-value"?

La réponse est non. Java est pass-references-by-value.

Par exemple:

String a = "a string"; 
public void change(String b) { 
    b = "some other string"; 
} 
change(a); 

Le « pointeur » à une variable est passée par valeur et affecté à b dans le cadre de la méthode. Changer b va modifier b, mais pas a.

+0

Merci pour votre explication – user236501

1

JAVA EST TOUJOURS PASSÉ PAR VALEUR !!!

Les références Java sont transmises par valeur.

+0

Merci pour votre explication – user236501

1

Passer par référence/passer par valeur est une terminologie extrêmement ennuyante.

hvgotcodes answer "Les références sont transmises par valeur" est la preuve la plus évidente.

Java est cohérente, rappelez-vous juste deux choses:

1) vous pouvez toujours réattribuer les variables passées pour toute méthode sans affecter l'appelant.

2) Java ne duplique pas les objets, donc si vous avez reçu une instance donnée, la modification des données dans cette instance la modifiera pour tout le monde. A propos, le seul cas que j'ai vu pour modifier les valeurs passées est "swap", et c'est un peu artificiel car il est si simple que l'écriture d'une version générique est inutile.

En général, la modification des valeurs transmises à une méthode est si rare et si confuse que Java a décidé que vous n'en aviez pas besoin. Pas tout le monde pense que c'est une bonne décision, mais si vous êtes d'accord que passer par référence est bon ou pas, vous devez admettre que ne pas l'avoir vous permet d'oublier un ensemble de préoccupations (vos variables ne seront jamais modifiées lorsque vous appelez une méthode

+0

Merci pour votre explication – user236501