Junior
Mi az láthatóság a Java programozás kontextusában?
sobes.tech MI
Válasz az MI-től
A Java kontextusában (más néven láthatósági terület) a láthatóság meghatározza egy változó, metódus, konstruktor vagy osztály elérhetőségét a program más részeiről. Ezt a hozzáférési módosítók szabályozzák.
Java négy láthatósági szintet tartalmaz:
public: Bármilyen helyről elérhető a csomagon belül és kívül.protected: A csomagon belül és az alosztályokban (még más csomagokban is) elérhető.- Alapértelmezett mód (default vagy package-private): Csak ugyanazon csomagon belül elérhető. Nincs kifejezetten megadva módosítóval.
private: Csak ugyanazon osztályon belül elérhető.
| Módosító | Osztály | Csomag | Alosztály (más csomagban) | Bármely osztály (más csomagban) |
|---|---|---|---|---|
public |
Igen | Igen | Igen | Igen |
protected |
Igen | Igen | Igen | Nem |
| Alapértelmezett | Igen | Igen | Nem | Nem |
private |
Igen | Nem | Nem | Nem |
A láthatósági módosítók használata fontos szerepet játszik az inkapszulációban és a hozzáférés szabályozásában a program elemeihez.
Példa a láthatósági módosítók használatára:
// Az A osztály a com.example.package1 csomagban
package com.example.package1;
public class ClassA {
public int publicVar;
protected int protectedVar;
int defaultVar; // Alapértelmezett módosító
private int privateVar;
public void publicMethod() {
// Hozzáférhet az összes változóhoz az osztályban
System.out.println("Nyilvános metódus az ClassA-ban");
}
protected void protectedMethod() {
System.out.println("Védett metódus az ClassA-ban");
}
void defaultMethod() {
System.out.println("Alapértelmezett metódus az ClassA-ban");
}
private void privateMethod() {
System.out.println("Privát metódus az ClassA-ban");
}
public void accessMembers() {
publicVar = 1;
protectedVar = 2;
defaultVar = 3;
privateVar = 4; // OK, az osztályon belül
privateMethod(); // OK, az osztályon belül
}
}
// A osztály ugyanabban a csomagban, mint az ClassA
package com.example.package1;
public class ClassB {
public void accessClassAMembers(ClassA objA) {
objA.publicVar = 10; // OK, public
objA.protectedVar = 20; // OK, protected (azon csomag)
objA.defaultVar = 30; // OK, default (azon csomag)
// objA.privateVar = 40; // Hibás fordítás, private
objA.publicMethod(); // OK, public
objA.protectedMethod(); // OK, protected (azon csomag)
objA.defaultMethod(); // OK, default (azon csomag)
// objA.privateMethod(); // Hibás fordítás, private
}
}
// Egy másik csomagban, a com.example.package2-ben, ClassC
package com.example.package2;
import com.example.package1.ClassA;
public class ClassC extends ClassA { // ClassC az osztálya ClassA-nak
public void accessClassAMembersFromSubclass() {
publicVar = 100; // OK, public
protectedVar = 200; // OK, protected (alosztály, még más csomagban)
// defaultVar = 300; // Fordítási hiba, default (más csomag)
// privateVar = 400; // Fordítási hiba, private
publicMethod(); // OK, public
protectedMethod(); // OK, protected (alosztály, más csomag)
// defaultMethod(); // Fordítási hiba, default (más csomag)
// privateMethod(); // Fordítási hiba, private
}
}
// Egy másik csomagban, a com.example.package2-ben, ClassD
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; // Fordítási hiba, protected (más csomag, nem alosztály)
// objA.defaultVar = 3000; // Fordítási hiba, default (más csomag)
// objA.privateVar = 4000; // Fordítási hiba, private
objA.publicMethod(); // OK, public
// objA.protectedMethod(); // Fordítási hiba, protected (más csomag, nem alosztály)
// objA.defaultMethod(); // Fordítási hiba, default (más csomag)
// objA.privateMethod(); // Fordítási hiba, private
}
}
A láthatóság megértése segít megbízhatóbb és modulárisabb kódok létrehozásában, korlátozva a nem kívánt hozzáférést az osztályok belső részleteihez.