Sobes.tech
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:

  1. public: juurdepääs on igal pool nii paketis kui ka väljaspool seda.
  2. protected: juurdepääs on samas paketis ja alamklassides (isegi teistes pakettides).
  3. Vaikimisi režiim (default või package-private): juurdepääs on ainult samas paketis. Modifikaatorit ei näidata selgelt.
  4. 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
    }
}