Tutorial Java SCJP – #10 Domeniul de vizibilitate al variabilelor

Multe erori de compilare sunt generate de programatori deoarece nu au o imagine clara cu privire la domeniul de vizibilitate al variabilelor, cat sunt disponibile si când pot fi accesate. Conceptul de domeniu de vizibilitate  descrie viata unei variabile, sau zona de disponibilitate, dupa ce aceasta a fost definita.

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

Pentru a intelege acest subiect, vom porni de la exemplul urmator:

class Student{
    public static int noStudents = 0;  //variabila statica
    public int age;              //variabila de instanta - atribut
    public int[] marks;     //variabila de instanta - atribut

    public Student()
    {
        noStudents++;   //acces variabila statica
        this.age = 0;
        marks = new int[10];
    }
    public float getAverage()
    {
        float sum = 0;    //variabila locala
        for(int i = 0;i < marks.length;)
        {   //i este o variabila locala in blocul for
            sum+=marks[i];
            i++;
        }
        return sum/marks.length;
    }
}

public class Main{
	public static void main(String[] args) 
        {
            Student s1 = new Student();
            Student s2 = new Student();

            //acces variabila statica
            System.out.println("Exista ";+Student.noStudents+" studenti");
	}
}

Fiecare tip de variabila are domeniului sau de vizibilitate:

variabile de Instanta (atribute) - aceste variabile definesc valorile unui obiect, deci, ele sunt create atunci când obiectul este creat; ele exista de când obiectul este creat si pana cand acesta este distrus; doar obiectul si metodele sale au acces la variabilele de instanta;

variabilele statice - aceste variabile sunt parte dintr-o clasa; sunt create atunci când clasa este incarcata de JVM;

variabile locale ale unor metode - aceste variabile sunt definite pe stiva metodei si ele exista atâta timp cât metoda este executata (exista in stiva de apeluri); variabilele locale nu pot fi accesate si din interiorul unor metode imbricate chiar daca ele exista cand metoda imbricata este executata ( Java Tutorial - # 8 Stiva metodelor si memoria Heap );

variabile locale unui bloc de cod - aceste variabile sunt definite in interiorul blocurilor de cod (intre { si }) si poate fi utilizate in timp ce blocul este executat; blocuri de cod sunt tipice pentru, for, while si blocuri de initializare.

Care sunt erorile comune in ceea ce priveste domeniul de vizibilitate a variabilelor - Cannot find symbol error

Eroarea de compilare Cannot find symbol este generata atunci când incercati sa utilizati o variabila, locala unui bloc, in afara blocului:

    public float getAverage()
    {
        float sum = 0;    //variabila locala
        for(int i = 0;i < marks.length;)
        {   //i este o variabila locala in blocul for
            sum+=marks[i];
            i++;
        }
			//eroare de compilare - Cannot find symbol 
        i = 0;          //COMPILER ERROR
        return sum/marks.length;
    }

Un alt caz in care veti obtine aceeasi eroare de compilare este atunci când incercati sa accesati o variabila locala a unei metode dintr-o metoda imbricata:

    public static void DoSomething()
    {
            int variable = 0;       //variabila locala
            DoSomethingElse();	    //metoda imbricata
    }
    public static void DoSomethingElse()
    {
	//eroare de compilare - Cannot find symbol 
        variable++;     //COMPILER ERROR
    }

Veti obtine aceeasi eroare atunci când incercati sa accesati atributele sau metodele unui obiect dintr-un context static, fara a folosi o instanta, cum ar fi in main.

	public static void main(String[] args) 
        {
            Student s1 = new Student();
            Student s2 = new Student();

            //acces variabila statica
            System.out.println("Exista "+Student.noStudents+" studenti");
            
	    //eroare de compilare - Cannot find symbol 
            age = 23;         //COMPILER ERROR
            getAverage();     //COMPILER ERROR
	}

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