Che cosa è lo shadowing variabile utilizzato in una class Java?

Sto leggendo il mio libro Deitel, Java How to Program e ho trovato il termine shadowing . Se è consentito lo shadowing, quale situazione o quale scopo è presente in una class Java?

Esempio:

public class Foo { int x = 5; public void useField() { System.out.println(this.x); } public void useLocal() { int x = 10; System.out.println(x); } } 

    Lo scopo principale dell’ombreggiamento è disaccoppiare il codice locale dalla class circostante. Se non fosse disponibile, prendi in considerazione il caso seguente.

    Viene rilasciata una class Foo in un’API. Nel codice lo si sottoclass e nella sottoclass si usa una variabile chiamata bar. Quindi Foo rilascia un aggiornamento e aggiunge una variabile protetta chiamata Bar alla sua class.

    Ora la tua class non verrà eseguita a causa di un conflitto che non potresti prevedere.

    Tuttavia, non farlo apposta. Lascia che questo accada solo quando non ti interessa davvero cosa sta accadendo al di fuori dell’ambito.

    Può essere utile per i setter in cui non si desidera creare un nome di variabile separato solo per il parametro del metodo, ad esempio:

     public void setX(int x) { this.x = x; } 

    A parte ciò li eviterei.

    Uno degli scopi principali è confondere le persone. È una ctriggers pratica e dovrebbe essere evitato.

    Shadowing non è un termine solo Java. In ogni caso in cui una variabile dichiarata in un ambito ha lo stesso nome di uno in un ambito più grande, tale variabile viene ombreggiata.

    Alcuni usi comuni per lo shadowing si hanno quando si hanno classi interne ed esterne e si desidera mantenere una variabile con lo stesso nome.

    Se puoi evitarlo però, dovresti causare confusione.

    I due usi comuni sono costruttori e metodi impostati:

     public Foo(int x) { this.x = x; } public void setX(int x) { this.x = x; } 

    Molto occasionalmente è utile se vuoi una copia della variabile in un singolo istante, ma la variabile può cambiare all’interno della chiamata al metodo.

     private void fire() { Listener[] listeners = this.listeners; int num = listeners.length; for (int ct=0; ct 

    (Naturalmente, un esempio inventato reso inutile con il posh per il ciclo.)