2009-03-08 15 views
8

Jeśli mają zmienną elementu, takiego jak ten (deklarowanej na ciele klasa)Java obiektu referencyjnego/zakres pytanie

private Dot[] dots=new Dot[numDots]; 

I pętli wszystkich członków tej tablicy, przy czym:

1) Przeciągnij każdy obiekt kropki do funkcji innej klasy, które:

2) przekazuje go do jeszcze innej funkcji 3rd klasie, jeśli spełnione są pewne warunki

3) oraz 3rd klasy zmienia niektóre salo rty obiektu Kropka

następnie, kiedy ten obiekt zostanie zwrócony do klasy pierwotnej/rodzica, czy te zmiany w jego właściwości zostałyby zachowane? Czy byłby traktowany jak lokalna zmienna przez funkcje 2nd/3rd?

+0

Podoba mi się twoje imię i głosowałem bez czytania pytania. – Cheeso

Odpowiedz

12

Tak, zmiany w właściwościach są zachowane. Java jest w 100% wartością pass-by, jednak podczas przekazywania obiektu wartość "value" jest naprawdę wskaźnikiem do obiektu. Tak więc, kiedy zmienić obiekt w metodzie jesteś zmieniając rzeczywisty obiekt przeszedł w

Oznacza to, że jeśli masz następującą metodę, wówczas sposób wywołujący będzie zobaczyć zmiany.

private void updateMyDot(final Dot aDot) { 
    aDot.dotColor = new Color(255,255,255); 
} 

, ale jeśli wykonasz następujące czynności, to metoda wywołująca będzie nie Zobacz zmiany.

private void updateMyDot(/* not final */ Dot aDot) { 
    aDot = new Dot(); 
    aDot.dotColor = new Color(255,255,255); 
} 

W drugim przykładzie, rozmówca nie będzie widać żadnych zmian i nie będzie widać nowo utworzonego Dot obiekt.

2

Przedmioty zapadają [ odniesieniawartości, przy której wartość jest odniesieniem] (co że dziedziczą Address), wartości pierwotnych (Int długo, dwu-, etc.) są przekazywane przez wartość.

Oznacza to, że po przekazaniu prymitywu z metody wywołującej do obiektu jest ono kopiowane, natomiast w przypadku obiektu wartość [] odniesienia odniesiona jest do].

Co z kolei oznacza, że ​​gdy obiekt jest mutowany przez metodę, wywołujący widzi te zmiany, ponieważ ma odniesienie do tego samego obiektu.

Odwrotnie, gdy metoda mutuje element pierwotny, wywołujący nie widzi zmian, ponieważ metoda działa na kopii.

[powód do edycji]

Jeżeli Java nie przechodzą przez odniesienie to można to zrobić:

Object x; 

x = new Integer(42); 
foo(x); 
System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float 

gdzie foo jest zdefiniowana jako:

void foo(Object o) 
{ 
    o = new Float(43); 
} 

Od przechodzi Java odniesienie o wartość o = new Float(43); jest dozwolone - ale wartość w abonencie wywołującym pozostanie jako new Integer(42);

+0

Jak stwierdzono w milionach innych miejsc, nie jest to ściśle prawda. Wszystkie parametry są przekazywane według wartości w Javie. Jednak zmienne obiektowe faktycznie odnoszą się do odniesień do obiektów. Przekazanie obiektu jako parametru metody kopiuje zmienną obiektu, tj. Kopiuje odniesienie. – mtruesdell