2016-04-07 15 views
6

stavo provando il seguente codice,perché nulla assegnazione non lavorare in una funzione

public void test() { 
    List<Integer> list = new ArrayList<>(); 
    list.add(100);  
    list.add(89);  
    System.out.println(list); 
    update1(list); 
    System.out.println(list); 
    update2(list); 
    System.out.println(list);  
} 

public void update1(List<Integer> list) { 
    list.remove(0); 
} 

public void update2(List<Integer> list) { 
    list = null; 
} 

Sto ottenendo il seguente output,

[100,89] 
[89] 
[89] 

La mia domanda è, perché io non sono in grado di assegnare l'elenco come null all'interno di una funzione chiamata?

+0

Grazie @ColonelThirtyTwo, ma la mia domanda è reinquadramento l'assegnazione nullo. So che "Java passa sempre in base al valore, senza eccezioni, mai." dal post "http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value" – Kajal

+0

Cosa è l'assegnazione nulla? Stai solo cambiando ciò a cui punta 'list' (nel caso di' null', non punta a nulla). –

risposta

5

Poiché tutte le chiamate di metodo in java vengono passate per valore e ciò significa che il riferimento è stato copiato quando si chiama un'altra funzione, ma i due puntano allo stesso oggetto.

Due copie di riferimento che puntano allo stesso oggetto.

Un altro esempio potrebbe essere

public void update2(List<Integer> list) { 
    list = new ArrayList<>(); // The new refrence got assigned to a new object 
    list.add(23); // Add 23 to the new list 
} 

Questo frammento di sopra non influenzano il vecchio oggetto o è di riferimento a tutti.

+0

Grazie, @Ahmed. Se usiamo assegnare con null "nuovo riferimento assegnato" giusto? – Kajal

+0

no. quando chiami update2 (lista) un "nuovo riferimento viene copiato" e quando chiami list = null all'interno della funzione stai cambiando il refrence copiato in modo che punti a nulla. –

+0

Ok, update1 (elenco) è anche un "riferimento copiato", giusto? così come le modifiche si riflettono sul riferimento reale. – Kajal

1

Riferimenti, come i tipi di dati vecchi di pianura, sono passati per valore alle funzioni in Java

Il update2 rende solo il parametro locale list riferiscono a null. È non modificare ciò che list fa riferimento al chiamante per quella funzione.

Quindi update2 è un non-op.

update1 modifica l'elenco tramite il riferimento passato a tale funzione.

0

Per ulteriori chiarimenti si può anche provare in modo tale

List<Integer> list = new ArrayList<>(); 
public void test() { 

    list.add(100);  
    list.add(89);  
    System.out.println(list); 
    update1(list); 
    System.out.println(list); 
    update2(list); 
    System.out.println(list+"not null");  
} 

public void update1(List<Integer> list) { 
    list.remove(0); 
} 

public void update2(List<Integer> list) { 
    this.list = null; 
} 

Utilizzando this keyword Update2() imposta la lista per essere nullo.

Qui viene emesso.

[100, 89]

[89]

nullo Ora sarà nullo

+0

this.list ignorerà la lista dei parametri passati a destra. – Kajal

+0

Si dice che se si richiedesse di impostare la lista come null! –

+0

Grazie Manikanth. Ma stavo cercando di capire il comportamento di un oggetto passato, quando assegniamo con null. – Kajal

Problemi correlati