W javie jest to dość skomplikowany. Zazwyczaj wszytko jest przekazywane przez wartość, ale w przypadku obiektów. Następuje "płytkie kopiowanie" wszystkie pola obiektu przekazywanego do metody nie są kopiowane do nowego obiektu. W rzeczywistości zatem może dojść do takiej sytuacji jak tutaj:
package com.hp.sis.szkolenia.xml;
public class LongIReferencja {
/**
* @param args
*/
public static void main(String[] args) {
A a = new A();
System.out.println("początek A :" + a.toString());
a.a = 10;
a.b = 10;
System.out.println("nadanie A :" +a.toString());
metoda(a); //przekazujemy wskaźnik na a, ale zostaje on skopiowany!!!
System.out.println(a.toString());
}
private static void metoda(A a) {
// a jest kopią tego z main() i wszytkie zmiany są robione w kopii!!!
A b = new A();
System.out.println("początek B :" +b.toString());
b.a = 11;
b.b = 11;
System.out.println("nadanie B :" +b.toString());
a = b; //wskaźnik zaczyna wskazywać na lokalną zmianną b
System.out.println("A = B :" +a.toString());
}
}
class A {
public int a;
public Integer b;
@Override
public String toString() {
return "a: " + a + "; b: " + b;
}
}
Do metody zostaje przekazana kopia obiektu, która ma wszystkie pola takie same jako oryginał. Kopii zostaje przypisana nowa wartość, ale jest to kopia więc nie jest to zmiana wprowadzona na oryginalnym obiekcie.
W drugim przypadku nowe wartości są przypisywane polom kopii, które to pola są wspólne dla kopii i oryginału:
package com.hp.sis.szkolenia.xml;
public class LongIReferencja {
/**
* @param args
*/
public static void main(String[] args) {
A a = new A();
System.out.println("początek A :" + a.toString());
a.a = 10;
a.b = 10;
System.out.println("nadanie A :" + a.toString());
metoda(a); // przekazujemy wskaźnik na a, ale zostaje on skopiowany!!!
System.out.println(a.toString());
}
private static void metoda(A a) {
// a jest kopią tego z main() i wszytkie zmiany są robione w kopii!!!
A b = new A();
System.out.println("początek B :" + b.toString());
b.a = 11;
b.b = 11;
System.out.println("nadanie B :" + b.toString());
a.a = b.a;
a.b = b.b;
System.out.println("A = B :" + a.toString());
}
}
class A {
public int a;
public Integer b;
@Override
public String toString() {
return "a: " + a + "; b: " + b;
}
}
Jest to ciekawostka w javie. Odpowiednie zrozumienie tego mechanizmu pozwala na opanowanie problemów twojego typu.