Java/Видимость

Материал из Викиучебника

Перейти к: навигация, поиск
Java в примерах

Лучше один раз увидеть, чем сто раз услышать!

Содержание

[править] public

Пример определения публичных элементов:

class A {
  public int m;
  public void f() {
  }
  public static String name = "Test";
}

Теперь посмотрим как этим пользуются:

class B {
  void someFunction(){
    String myString = A.name; /* К публичным статическим членам можно обращаться даже не имея экземпляра */
    A a = new A();            /* Создаем экземпляр */
    a.m = 10;                 /* Доступ к публичному целому члену в точности такой же как к обычной целой переменной */
    a.m++; 
    a.f();                    /* Функция так же доступна из любого места */
  }
}

[править] protected

class A {
  protected int x;
  protected void f() {}
  protected static String name = "Ku-Ku";
}
 
class B extends A {
  public void someFunc() {
    x = 10; //Доступ к защищённому члену материнского класса
    f(); 
    A ref = new A();
    ref.x = 13; //В контексте дочернего класса отношение к защищённым членам как к публичным
    String bebe = A.name; //Статические переменные - не исключение
  }
}
 
class C {
  public void someFunc() {
    String mmm = A.name; //Неверный вызов. Переменная name - защищена и не видна извне (Только если класс С находится 
                         //в другом пакете. Если класс С находится в том же пакете, что и А, то будет доступна)
    A a = new A();
    int myX = a.x; //Неверный вызов. Переменная x - не видна извне (Только если класс С находится в другом пакете. Если 
                   //класс С находится в том же пакете, что и А, то будет доступна)
    a.x = 1; //Неверный вызов. Переменная x - не видна извне (Только если класс С находится в другом пакете. Если класс С 
             //находится в том же пакете, что и А, то будет доступна)}}
    a.f(); //Неверный вызов. Функция f - не видна извне (Только если класс С находится в другом пакете. Если класс С находится 
           //в том же пакете, что и А, то будет доступна)}}
  }
}

[править] package protected

Присваивается по умолчанию, действует как Public в пределах пакета (package).

class A { //Этот класс виден только в пакете, в котором находится сам
  int x;  //Члены класса видны как публичные для всех классов данного пакета
}

[править] private

class A {
  private int x; //переменную x видно исключительно внутри класса A
 
  public void setX(int val) { //обычно такую функцию называют "setter"
    x = val;
  }
 
  public int getX() { //обычно такую функцию называют "getter"
    return x;
  }
}
 
class B extends A {
  public void someFunc() {
    this.x = 10; //Ошибка! Приватные переменные не видны даже наследникам
  }
}

getX и setX - являются функциями доступа к приватной переменной. Если мы решим, что переменная x может содержать исключительно числа от 1 до 100, то нам не понадобится искать все обращения к x по всем классам, а просто добавить проверку между строками 4 и 5.