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:
public: Dostupné z akéhokoľvek miesta v rámci a mimo balíka.protected: Dostupné v rámci toho istého balíka a v podtriedach (aj v iných balíkoch).- Predvolený režim (default alebo package-private): Dostupné iba v rámci toho istého balíka. Nie je výslovne uvedené modifikátorom.
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.