Sobes.tech
Junior

Ce este vizibilitatea în contextul programării Java?

sobes.tech AI

Răspuns de la AI

În contextul Java (cunoscut și ca scop) vizibilitatea determină accesibilitatea unei variabile, metode, constructor sau clasă din alte părți ale programului. Este controlată de modificatorii de acces.

Java are patru niveluri de vizibilitate:

  1. public: Accesibil de oriunde în interiorul și în afara pachetului.
  2. protected: Accesibil în același pachet și în subclase (chiar și în pachete diferite).
  3. Modul implicit (default sau package-private): Accesibil doar în interiorul aceluiași pachet. Nu este specificat explicit printr-un modificator.
  4. private: Accesibil doar în interiorul aceleiași clase.
Modificator Clasă Pachet Subclasă (în afara pachetului) Orice clasă (în afara pachetului)
public Da Da Da Da
protected Da Da Da Nu
Default Da Da Nu Nu
private Da Nu Nu Nu

Utilizarea modificatorilor de vizibilitate joacă un rol important în încapsulare și controlul accesului la elementele programului.

Exemplu de utilizare a modificatorilor:

// Clasa A în pachetul com.example.package1
package com.example.package1;

public class ClassA {
    public int publicVar;
    protected int protectedVar;
    int defaultVar; // Modificator implicit
    private int privateVar;

    public void publicMethod() {
        // Poate accesa toate variabilele clasei ClassA
        System.out.println("Metodă publică în ClassA");
    }

    protected void protectedMethod() {
        System.out.println("Metodă protected în ClassA");
    }

    void defaultMethod() {
        System.out.println("Metodă implicită în ClassA");
    }

    private void privateMethod() {
        System.out.println("Metodă privată în ClassA");
    }

    public void accessMembers() {
        publicVar = 1;
        protectedVar = 2;
        defaultVar = 3;
        privateVar = 4; // OK, în interiorul clasei
        privateMethod(); // OK, în interiorul clasei
    }
}
// Clasa B în același pachet com.example.package1
package com.example.package1;

public class ClassB {
    public void accessClassAMembers(ClassA objA) {
        objA.publicVar = 10; // OK, public
        objA.protectedVar = 20; // OK, protected (același pachet)
        objA.defaultVar = 30; // OK, implicit (același pachet)
        // objA.privateVar = 40; // Eroare de compilare, private
        objA.publicMethod(); // OK, public
        objA.protectedMethod(); // OK, protected (același pachet)
        objA.defaultMethod(); // OK, implicit (același pachet)
        // objA.privateMethod(); // Eroare de compilare, private
    }
}
// Clasa C într-un alt pachet com.example.package2
package com.example.package2;
import com.example.package1.ClassA;

public class ClassC extends ClassA { // ClassC este o subclasă a ClassA
    public void accessClassAMembersFromSubclass() {
        publicVar = 100; // OK, public
        protectedVar = 200; // OK, protected (subclasă, chiar și în alt pachet)
        // defaultVar = 300; // Eroare de compilare, implicit (alt pachet)
        // privateVar = 400; // Eroare de compilare, private

        publicMethod(); // OK, public
        protectedMethod(); // OK, protected (subclasă, chiar și în alt pachet)
        // defaultMethod(); // Eroare de compilare, implicit (alt pachet)
        // privateMethod(); // Eroare de compilare, private
    }
}
// Clasa D într-un alt pachet com.example.package2 (NU subclasă a ClassA)
package com.example.package2;
import com.example.package1.ClassA;

public class ClassD {
    public void accessClassAMembers(ClassA objA) {
        objA.publicVar = 1000; // OK, public
        // objA.protectedVar = 2000; // Eroare de compilare, protected (alt pachet, nu subclasă)
        // objA.defaultVar = 3000; // Eroare de compilare, implicit (alt pachet)
        // objA.privateVar = 4000; // Eroare de compilare, private

        objA.publicMethod(); // OK, public
        // objA.protectedMethod(); // Eroare de compilare, protected (alt pachet, nu subclasă)
        // objA.defaultMethod(); // Eroare de compilare, implicit (alt pachet)
        // objA.privateMethod(); // Eroare de compilare, private
    }
}

Înțelegerea vizibilității ajută la crearea unui cod mai fiabil și modular, limitând accesul nedorit la detaliile interne ale claselor.