Sobes.tech
Junior

Čo je viditeľnosť v kontexte programovania v Jave?

sobes.tech AI

Odpoveď od AI

Viditeľnosť v kontexte Javy (tiež nazývaná rozsah viditeľnosti) určuje dostupnosť premennej, metódy, konštruktora alebo triedy z iných častí programu. Je riadená modifikátormi prístupu.

V Jave existujú štyri úrovne viditeľnosti:

  1. public: Dostupné z akéhokoľvek miesta vo vnútri aj mimo balíka.
  2. protected: Dostupné v rámci toho istého balíka a v podtriedach (aj v iných balíkoch).
  3. Predvolený režim (default alebo package-private): Dostupné iba v rámci toho istého balíka. Nie je explicitne označené modifikátorom.
  4. private: Dostupné iba v rámci tej istej triedy.
Modifikátor Trieda Balík Podtrieda (mimo balíka) Akákoľvek trieda (mimo balíka)
public Áno Áno Áno Áno
protected Áno Áno Áno Nie
Default Áno Áno Nie Nie
private Áno Nie Nie Nie

Pochopenie viditeľnosti pomáha vytvárať spoľahlivejší a modulárnejší kód, obmedzujúc nechcený prístup k vnútorným detailom tried.

Príklad použitia modifikátorov:

// Trieda A v balíku com.example.package1
package com.example.package1;

public class ClassA {
    public int publicVar;
    protected int protectedVar;
    int defaultVar; // Predvolený modifikátor
    private int privateVar;

    public void publicMethod() {
        // Môže získať prístup ku všetkým premenným triedy ClassA
        System.out.println("Public method in ClassA");
    }

    protected void protectedMethod() {
        System.out.println("Protected method in ClassA");
    }

    void defaultMethod() {
        System.out.println("Default method in ClassA");
    }

    private void privateMethod() {
        System.out.println("Private method in ClassA");
    }

    public void accessMembers() {
        publicVar = 1;
        protectedVar = 2;
        defaultVar = 3;
        privateVar = 4; // OK, prístup v rámci triedy
        privateMethod(); // OK, prístup v rámci triedy
    }
}
// Trieda B v tom istom balíku 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 (ten istý balík)
        objA.defaultVar = 30; // OK, default (ten istý balík)
        // objA.privateVar = 40; // Chyba kompilácie, private
        objA.publicMethod(); // OK, public
        objA.protectedMethod(); // OK, protected (ten istý balík)
        objA.defaultMethod(); // OK, default (ten istý balík)
        // objA.privateMethod(); // Chyba kompilácie, private
    }
}
// Trieda C v inom balíku com.example.package2
package com.example.package2;
import com.example.package1.ClassA;

public class ClassC extends ClassA { // ClassC je podtriedou ClassA
    public void accessClassAMembersFromSubclass() {
        publicVar = 100; // OK, public
        protectedVar = 200; // OK, protected (podtrieda, aj v inom balíku)
        // defaultVar = 300; // Chyba kompilácie, default (iný balík)
        // privateVar = 400; // Chyba kompilácie, private

        publicMethod(); // OK, public
        protectedMethod(); // OK, protected (podtrieda, aj v inom balíku)
        // defaultMethod(); // Chyba kompilácie, default (iný balík)
        // privateMethod(); // Chyba kompilácie, private
    }
}
// Trieda D v inom balíku com.example.package2 (NE podtrieda 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; // Chyba kompilácie, protected (iný balík, nie podtrieda)
        // objA.defaultVar = 3000; // Chyba kompilácie, default (iný balík)
        // objA.privateVar = 4000; // Chyba kompilácie, private

        objA.publicMethod(); // OK, public
        // objA.protectedMethod(); // Chyba kompilácie, protected (iný balík, nie podtrieda)
        // objA.defaultMethod(); // Chyba kompilácie, default (iný balík)
        // objA.privateMethod(); // Chyba kompilácie, private
    }
}