Sobes.tech
Junior

Чӣ гуна намоёнӣ дар контексти барномасозии Java аст?

sobes.tech AI

Ҷавоб аз AI

Java-да контекстте көрүнүмдүүлүк (ошондой эле көрүнүмдүүлүк аймагы деп аталат) башка бөлүмдөрдөн өзгөрмө, метод, конструктор же класска жетүүнү аныктайт. Ал жеткиликтүүлүк модификаторлору аркылуу көзөмөлдөнөт.

Javaда төрт деңгээлдеги көрүнүмдүүлүк бар:

  1. public: пакет ичинде жана сыртында каалаган жерден жеткиликтүү.
  2. protected: ошол эле пакете жана подклассларда (башка пакеттерде да) жеткиликтүү.
  3. Дефолт режим (default же package-private): гана ошол эле пакете жеткиликтүү. Модификатор explicitly көрсөтүлбөйт.
  4. private: гана ошол эле класс ичинде жеткиликтүү.
Модификатор Класс Пакет Подкласс (пакеттен тышкары) Ар бир класс (пакеттен тышкары)
public Ооба Ооба Ооба Ооба
protected Ооба Ооба Ооба Жок
Default Ооба Ооба Жок Жок
private Ооба Жок Жок Жок

Көрүнүмдүүлүк модификаторлорун түшүнүү класс элементтерине көзөмөлдөөнү жана ишенимдүү код түзүүнү жеңилдетет.

Модификаторлордун мисалы:

// com.example.package1 пакетиндеги A класс
package com.example.package1;

public class ClassA {
    public int publicVar;
    protected int protectedVar;
    int defaultVar; // Дефолт модификатор
    private int privateVar;

    public void publicMethod() {
        // Бардык өзгөрмөлөргө жана методдорго жетүүгө болот
        System.out.println("ClassA ичиндеги public метод");
    }

    protected void protectedMethod() {
        System.out.println("ClassA ичиндеги protected метод");
    }

    void defaultMethod() {
        System.out.println("ClassA ичиндеги default метод");
    }

    private void privateMethod() {
        System.out.println("ClassA ичиндеги private метод");
    }

    public void accessMembers() {
        publicVar = 1;
        protectedVar = 2;
        defaultVar = 3;
        privateVar = 4; // ОК, класс ичинде жеткиликтүү
        privateMethod(); // ОК, класс ичинде жеткиликтүү
    }
}
// ClassB ошол эле пакете com.example.package1 ичинде
package com.example.package1;

public class ClassB {
    public void accessClassAMembers(ClassA objA) {
        objA.publicVar = 10; // ОК, public
        objA.protectedVar = 20; // ОК, protected (ошол эле пакет)
        objA.defaultVar = 30; // ОК, default (ошол эле пакет)
        // objA.privateVar = 40; // Компиляция ката, private
        objA.publicMethod(); // ОК, public
        objA.protectedMethod(); // ОК, protected (ошол эле пакет)
        objA.defaultMethod(); // ОК, default (ошол эле пакет)
        // objA.privateMethod(); // Компиляция ката, private
    }
}
// ClassC башка пакете com.example.package2 ичинде
package com.example.package2;
import com.example.package1.ClassA;

public class ClassC extends ClassA { // ClassC ClassAнын подклассы
    public void accessClassAMembersFromSubclass() {
        publicVar = 100; // ОК, public
        protectedVar = 200; // ОК, protected (подкласс, дагы башка пакеттерде)
        // defaultVar = 300; // Компиляция ката, default (башка пакет)
        // privateVar = 400; // Компиляция ката, private

        publicMethod(); // ОК, public
        protectedMethod(); // ОК, protected (подкласс, дагы башка пакеттерде)
        // defaultMethod(); // Компиляция ката, default (башка пакет)
        // privateMethod(); // Компиляция ката, private
    }
}
// ClassD башка пакете com.example.package2 ичинде (ClassAнын подклассы эмес)
package com.example.package2;
import com.example.package1.ClassA;

public class ClassD {
    public void accessClassAMembers(ClassA objA) {
        objA.publicVar = 1000; // ОК, public
        // objA.protectedVar = 2000; // Компиляция ката, protected (башка пакет, подкласс эмес)
        // objA.defaultVar = 3000; // Компиляция ката, default (башка пакет)
        // objA.privateVar = 4000; // Компиляция ката, private

        objA.publicMethod(); // ОК, public
        // objA.protectedMethod(); // Компиляция ката, protected (башка пакет, подкласс эмес)
        // objA.defaultMethod(); // Компиляция ката, default (башка пакет)
        // objA.privateMethod(); // Компиляция ката, private
    }
}