2009-03-08 9 views
8

Se ho una variabile membro come questa (dichiarati nel corpo di una classe)Java oggetto di riferimento/domanda portata

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

I scorrere tutti i membri di questa matrice, e:

1) Passare ogni oggetto Dot a una funzione di un'altra classe, che:

2) lo passa ad un'altra funzione di un 3 ° di classe, se alcune condizioni sono soddisfatte

3) e il 3 ° di classe cambia qualche prope anni dell'oggetto Dot

quindi quando questo oggetto viene restituito alla classe originale/genitore, le modifiche alle sue proprietà sarebbero state mantenute? O sarebbe trattato come una variabile locale dalla 2a/3a funzione?

+0

Mi piace il tuo nome e ho votato senza leggere la domanda. – Cheeso

risposta

12

Sì, le modifiche alle proprietà vengono mantenute. Java è un valore di passaggio al 100%, tuttavia, quando si passa un oggetto, il "valore" passato è veramente un puntatore all'oggetto. Così, quando si modifica un oggetto in un metodo, si sta modificando l'oggetto effettivo passato in

Cioè, se avete la seguente metodo, allora il metodo chiamante vedrà i cambiamenti:.

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

ma se si effettua quanto segue, il metodo di chiamata sarà non vedere le modifiche.

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

Nel secondo esempio, il chiamante non vedere tutte le modifiche e non vedrà la nuova creazione Dot oggetto.

2

Gli oggetti sono passati di [ riferimentovalore quando il valore è il riferimento] (cose che ereditano da Object), valori primitivi (int, lungo, doppio, ecc) sono passati per valore.

Ciò significa che quando una primitiva viene passata da un chiamante a un metodo, viene copiata, mentre con un oggetto viene passato un valore [del valore].

Che a sua volta significa che quando un oggetto viene mutato da un metodo, il chiamante vede tali modifiche perché ha un riferimento allo stesso oggetto.

Al contrario, quando un metodo muta una primitiva, il chiamante non vede le modifiche mentre il metodo sta lavorando su una copia.

[motivo per le modifiche]

Se Java avesse passare per riferimento allora si potrebbe fare questo:

Object x; 

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

dove foo è definito come:

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

Dal Java passa la riferimento per il valore o = new Float(43); è consentito - ma il valore nel chiamante rimarrà come new Integer(42);

+0

Come affermato in un milione di altri luoghi, questo non è assolutamente vero. Tutti i parametri sono passati per valore in Java. Tuttavia, le variabili oggetto si riferiscono effettivamente a riferimenti a oggetti. Passare un oggetto come parametro del metodo copia la variabile oggetto, cioè copia il riferimento. – mtruesdell