Wiem, że w Javie wszystko jest przekazywane przez wartość. Ale dla obiektów jest to wartość odniesienia do obiektu, który jest przekazywany. Oznacza to, że czasami obiekt można zmienić za pomocą parametru, dlatego, jak sądzę, ludzie mówią: Nigdy nie modyfikuj parametrów.Przejść według "wartości referencyjnej"? Potrzebne pewne wyjaśnienie
Ale w poniższym kodzie dzieje się coś innego. s
w changeIt()
nie zmienia się, kiedy wrócisz do main()
:
public class TestClass {
static String str = "Hello World";
public static void changeIt(String s) {
s = "Good bye world";
}
public static void main(String[] args) {
changeIt(str);
System.out.println(str);
}
}
Zgaduję - i chciałbym potwierdzenie - że kiedy mówisz s = "something"
to ten sam lub równoważny mówiąc String s = new String("something")
. Czy to dlatego nie zmienia się s
? Czy jest lokalnie przydzielony zupełnie nowy obiekt, który zostaje odrzucony po wyjściu z changeIt()
?
Widziałem już tego rodzaju pytania/odpowiedzi, a ja * nadal * mam wrażenie, że potrzebuję recenzji. +1 – BlackVegetable
Nie zmienia się, ponieważ łańcuchy znaków w języku Java są obiektami niezmiennymi. – anio
@anio Nie, to nie jest powód, dla którego ten konkretny kod nie zmienia łańcucha. Byłoby to takie samo zachowanie dla dowolnego obiektu, niezmienne lub nie (ponieważ wykonuje przypisanie, nie wywołuje żadnej metody na otrzymanym obiekcie). – nos