2010-10-04 12 views
5

Powiedz, że ustawiłem int A = int B. Kiedy zmienię A po, to nie zmieni to wartości B. Ale kiedy ustawię SomeClass A = SomeClass B, i zmienię zawartość A (jak a.cost), to zmienia także B.cost. Czy ktoś może mi to wyjaśnić?Przypisywanie w Javie?

Myślałem, że Java jest przypisana przez wartość, a nie odwołanie?

Odpowiedz

19

Tak, robi - ale wartość A jest odniesieniem, a nie kopią samego obiektu.

chciałbym dać następującą analogię ...

Załóżmy dwie osoby, obie mają mój adres: że jak dwóch zmiennych typu House w Javie. Teraz jeden z nich przychodzi i maluje moje czerwone drzwi. Druga osoba będzie jeszcze zobaczyć czerwone drzwi, jeśli na stronie internetowej:

House jonsHouse = new House(); // Even the variable jonsHouse is only a reference 

House firstAddressCopy = jonsHouse; // Just a copy of the reference 
House secondAddressCopy = jonsHouse; // Just a copy of the reference 

firstAddressCopy.paintDoor(Color.Red); 

Color color = secondAddressCopy.getDoorColor(); // Now color will be red 

Zasadniczo należy pamiętać o kilku zasadach i wszystko stanie się jasne:

  • Wartość wyrażenia w języku Java jest nigdy obiekt - zawsze tylko odniesienie lub pierwotną wartość
  • (następstwem pierwszego punktu) zmienna nigdy posiada obiekt - zawsze tylko odniesienie lub pierwotną wartość
  • Przyporządkowanie (a mijania argument) zawsze kopiuje wartość, czy ta wartość jest odwołaniem lub wartość prymitywny
2

Myślałem Java jest przypisany przez wartość, nie odwoływać?

Co oznacza "przypisany wartością"? Czy możesz pomylić to z "przekazaniem wartości/referencji"?

W każdym razie, jeśli zajmujesz się instancją klasy w Javie, faktycznie obsługujesz odwołanie do tej klasy (podobnie jak wskaźnik w C/C++). Twoje zadanie kopiuje tylko referencję, więc zarówno A, jak i B odnoszą się do tej samej instancji, tj. Dane są współużytkowane, stąd wynik.

1

A jest odniesieniem do obiektu. Więc jeśli zmienisz obiekt stan wewnętrzny, zostanie on odzwierciedlony dla każdej innej zmiennej wskazującej na to.

Jeśli ponownie przypisać A, następnie B nie zmieni:

Foo a = new Foo(); 
Foo b = a; 
a.bar = "bar"; // this is reflected in b 
a = new Foo(); // b stays pointing to the previous Foo 
a.bar = "baaar"; // b stays with a value of bar="bar" 

(.. Java jest wprost wartością Sprawdź this article o tym)

+0

Java jest ściśle przekazywana według wartości. Podczas przekazywania odniesienia przez wartość tylko odnośnik jest duplikowany, a nie obiekt, do którego się odwołuje. –

+0

@Maven, oczywiście, głupi błąd, pomyślałem jeden i napisałem drugi :) dzięki – Bozho

0

w Javie, swoje zmienne mogą być podzielić na dwie kategorie: Obiekty i wszystko inne (int, długi, bajt, itd.).

Typ pierwotny (int, long, itp.) Ma dowolną wartość, którą mu przypisujesz. Natomiast zmienna obiektowa zawiera odniesienie do jakiegoś obiektu. Więc jeśli przypiszesz jedną zmienną obiektu do drugiej, skopiowałeś odniesienie, zarówno A, jak i B wskazują na ten sam obiekt.

UWAGA: Ciągi w Javie są w rzeczywistości obiektami, a nie prymitywami, które często zakładają początkujący.

Mam nadzieję, że to pomoże