Junior
Mis on nähtavus Java programmeerimise kontekstis?
sobes.tech AI
Vastus AI-lt
Java kontekstis määrab nähtavuse (samuti nimetatakse seda nähtavuse piirkonnaks), kui juurdepääsetav on muutuja, meetod, konstruktor või klass teistest programmi osadest. Seda kontrollitakse juurdepääsmodifikatsioonide kaudu.
Java-s on neli nähtavustaset:
public: juurdepääs on igal pool nii paketis kui ka väljaspool seda.protected: juurdepääs on samas paketis ja alamklassides (isegi teistes pakettides).- Vaikimisi režiim (default või package-private): juurdepääs on ainult samas paketis. Modifikaatorit ei näidata selgelt.
private: juurdepääs on ainult samas klassis.
| Modifikaator | Klass | Pakett | Alamklass (välja paketist) | Iga klass (välja paketist) |
|---|---|---|---|---|
public |
Jah | Jah | Jah | Jah |
protected |
Jah | Jah | Jah | Ei |
| Vaikimisi | Jah | Jah | Ei | Ei |
private |
Jah | Ei | Ei | Ei |
Nähtavuse mõistmine aitab luua usaldusväärsemat ja modulaarsemat koodi, piirates soovimatut juurdepääsu klassi sisemistele elementidele.
Näide modifikaatorite kasutamisest:
// Klass A paketis com.example.package1
package com.example.package1;
public class ClassA {
public int publicVar;
protected int protectedVar;
int defaultVar; // Vaikimisi modifikaator
private int privateVar;
public void publicMethod() {
// Võib pääseda ligi kõigile muutujatele
System.out.println("Klassi A avalik meetod");
}
protected void protectedMethod() {
System.out.println("Klassi A kaitstud meetod");
}
void defaultMethod() {
System.out.println("Klassi A vaikimisi meetod");
}
private void privateMethod() {
System.out.println("Klassi A privaatsed meetod");
}
public void accessMembers() {
publicVar = 1;
protectedVar = 2;
defaultVar = 3;
privateVar = 4; // Okei, klassi sees kättesaadav
privateMethod(); // Okei, klassi sees kättesaadav
}
}
// Klass B samas paketis com.example.package1
package com.example.package1;
public class ClassB {
public void accessClassAMembers(ClassA objA) {
objA.publicVar = 10; // Okei, public
objA.protectedVar = 20; // Okei, protected (sama paket)
objA.defaultVar = 30; // Okei, default (sama paket)
// objA.privateVar = 40; // Kompileerimisel viga, private
objA.publicMethod(); // Okei, public
objA.protectedMethod(); // Okei, protected (sama paket)
objA.defaultMethod(); // Okei, default (sama paket)
// objA.privateMethod(); // Kompileerimisel viga, private
}
}
// Klass C teises paketis com.example.package2
package com.example.package2;
import com.example.package1.ClassA;
public class ClassC extends ClassA { // ClassC on ClassA alamklass
public void accessClassAMembersFromSubclass() {
publicVar = 100; // Okei, public
protectedVar = 200; // Okei, protected (alamklass, isegi teises paketis)
// defaultVar = 300; // Kompileerimisel viga, default (teine pakett)
// privateVar = 400; // Kompileerimisel viga, private
publicMethod(); // Okei, public
protectedMethod(); // Okei, protected (alamklass, isegi teises paketis)
// defaultMethod(); // Kompileerimisel viga, default (teine pakett)
// privateMethod(); // Kompileerimisel viga, private
}
}
// Klass D teises paketis com.example.package2
package com.example.package2;
import com.example.package1.ClassA;
public class ClassD {
public void accessClassAMembers(ClassA objA) {
objA.publicVar = 1000; // Okei, public
// objA.protectedVar = 2000; // Kompileerimisel viga, protected (teine pakett, mitte alamklass)
// objA.defaultVar = 3000; // Kompileerimisel viga, default (teine pakett)
// objA.privateVar = 4000; // Kompileerimisel viga, private
objA.publicMethod(); // Okei, public
// objA.protectedMethod(); // Kompileerimisel viga, protected (teine pakett, mitte alamklass)
// objA.defaultMethod(); // Kompileerimisel viga, default (teine pakett)
// objA.privateMethod(); // Kompileerimisel viga, private
}
}