Sobes.tech
Junior

Co je viditelnost v kontextu programování v jazyce Java?

sobes.tech AI

Odpověď od AI

V kontexte Java (tiež nazývané rozsah) určuje dostupnosť premennej, metódy, konštruktora alebo triedy z iných častí programu. Je riadená modifikátormi prístupu.

Java má štyri úrovne viditeľnosti:

  1. public: Dostupné z akéhokoľvek miesta v rámci a 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 výslovne uvedené 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
Predvolený Áno Áno Nie Nie
private Áno Nie Nie Nie

Pochopenie viditeľnosti pomáha vytvárať spoľahlivejší a modulárnejší kód, obmedzovaním nechceného prístupu 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("Verejná metóda v triede ClassA");
    }

    protected void protectedMethod() {
        System.out.println("Chránená metóda v triede ClassA");
    }

    void defaultMethod() {
        System.out.println("Predvolená metóda v triede ClassA");
    }

    private void privateMethod() {
        System.out.println("Súkromná metóda v triede ClassA");
    }

    public void accessMembers() {
        publicVar = 1;
        protectedVar = 2;
        defaultVar = 3;
        privateVar = 4; // OK, v rámci triedy
        privateMethod(); // OK, 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, predvolené (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, predvolené (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 triedy ClassA
    public void accessClassAMembersFromSubclass() {
        publicVar = 100; // OK, public
        protectedVar = 200; // OK, protected (podtrieda, aj v inom balíku)
        // defaultVar = 300; // Chyba kompilácie, predvolené (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, predvolené (iný balík)
        // privateMethod(); // Chyba kompilácie, private
    }
}
// Trieda D v inom balíku com.example.package2 (NE podtrieda triedy 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, predvolené (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, predvolené (iný balík)
        // objA.privateMethod(); // Chyba kompilácie, private
    }
}

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