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 пакетиндеги ClassA класс
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
    }
}