Tutorial Java SCJP – #14.1 Ce inseamna sa ascunzi (shadow) o variabila

1 comment - This post in english

Shadowing se produce atunci cand se defineste o metoda cu parametri de intrare care au nume identice cu variabile statice sau variabile de instanta (atribute).

Alte subiecte care fac parte din acest tutorial Java sunt accesibile prin intermediul Java Tutorial 6 – Cuprins.

Daca analiza urmatoarea secventa

class Auto {
    int maxSpeed;
    float weight;
    //constructor cu parametri
    public Auto(int maxSpeed, float Weight) {
        //shadowing
        //Assignment to itself warning
        maxSpeed = maxSpeed;
        weight = Weight;
    }
    public void setMaxSpeed(int maxSpeed) {
        //shadowing
        //warning - Assignment to itself
        maxSpeed = maxSpeed;
    }
    public int getMaxSpeed() {
        return this.maxSpeed;
    }
}
 
public class Main {
 
    public static void main(String[] args) {
        Auto a = new Auto(180, 2000);
        System.out.println(a.getMaxSpeed());
        a.setMaxSpeed(200);
        System.out.println(a.getMaxSpeed());
    }
}

atunci se observa ca metoda constructor Auto() si metoda setMaxSpeed() au cate un parametru de intrare, maxspeed are are acelasi nume cu atributul maxspeed definit in clasa.

Executia acestui exemplu genereaza la consola mesajul:

0
0

deoarece în interiorul 2 metode este vizibil doar parametrul de intrare. Logic, prin cele 2 metode se doreste initializarea atributului cu valoarea argumentuui, insa, in realitate, atunci cand metodele sunt compilate, variabila maxspeed din stanga egalului este interpretata ca variabila locala, si nu ca variabila a instantei.

In aceasta situatie, compilatorul va avertizeaza cu privire la o posibila eroare printr-un mesaj Assignment to itself.

In acest caz, este importanta utilizarea referintei this, pentru a indica care variabila este atributul. Solutia corecta pentru a exemplul anterior este:

class Auto {
    int maxSpeed;
    float weight;
    //constructor cu parametri
    public Auto(int maxSpeed, float Weight) {
	//se foloseste this pentru a indica atributul
        this.maxSpeed = maxSpeed;
        weight = Weight;
    }
    public void setMaxSpeed(int maxSpeed) {
	//se foloseste this pentru a indica atributul
        this.maxSpeed = maxSpeed;
    }
    public int getMaxSpeed() {
        return this.maxSpeed;
    }
}

Pentru variabilele statice, nu se poate utiliza referinta this pentru a evita ascunderea (shadowing) variabilei, deoarece variabilele statice sunt variabile de clasa si nu variabile de instanta. În acest caz, se utilizeaza numele clasei:

class Auto {
    static int category;
    int maxSpeed;
    float weight;
 
    public static void setCategory(int category)
    {
	//se foloseste numele clasei pentru a indica variabila statica
        Auto.category = category;
    }
}

Alte subiecte care fac parte din acest tutorial Java sunt accesibile prin intermediul Java Tutorial 6 – Cuprins.


  1. No comments yet.
(will not be published)