описание В чем разница между общедоступными, защищенными, пакетными и частными в Java?




в чем разница между модификаторами видимости public и protected (20)

Частный

  • Методы, переменные и конструкторы

Методы, переменные и конструкторы, объявленные частными, могут быть доступны только в объявленном классе.

  • Класс и интерфейс

Модификатор частного доступа является самым ограничивающим уровнем доступа. Класс и интерфейсы не могут быть частными.

Заметка

Переменные, объявленные как private, могут быть доступны вне класса, если в классе присутствуют общедоступные методы getter. Переменные, методы и конструкторы, объявленные защищенными в суперклассе, могут быть доступны только подклассам другого пакета или любого класса в пакете класса защищенных членов.

защищенный

  • Класс и интерфейс

Модификатор защищенного доступа не может применяться к классу и интерфейсам.

Методы, поля могут быть объявлены защищенными, однако методы и поля в интерфейсе не могут быть объявлены защищенными.

Заметка

Защищенный доступ дает подклассу возможность использовать вспомогательный метод или переменную, не мешая тому, чтобы не связанный класс пытался его использовать.

общественного

Доступ к классу, методу, конструктору, интерфейсу и т. Д. Может быть доступен из любого другого класса.

Поэтому поля, методы, блоки, объявленные внутри открытого класса, могут быть доступны из любого класса, принадлежащего к Java Universe.

  • Различные пакеты

Однако, если открытый класс, к которому мы пытаемся получить доступ, находится в другом пакете, тогда публичный класс по-прежнему необходимо импортировать.

Из-за наследования классов все общедоступные методы и переменные класса наследуются подклассами.

По умолчанию - Нет ключевого слова:

Модификатор доступа по умолчанию означает, что мы явно не объявляем модификатор доступа для класса, поля, метода и т. Д.

  • В пределах тех же пакетов

Переменная или метод, объявленный без модификатора управления доступом, доступен для любого другого класса в одном пакете. Поля в интерфейсе неявно являются публичными статическими, а методы в интерфейсе по умолчанию являются общедоступными.

Заметка

Мы не можем переопределить статические поля. Если вы пытаетесь переопределить его, он не показывает никаких ошибок, но он не работает, кроме нас.

Ответы на вопросы

Ссылки ссылки

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html http://www.tutorialspoint.com/java/java_access_modifiers.htm

В Java существуют ли четкие правила, когда использовать каждый из модификаторов доступа, а именно, по умолчанию (закрытый пакет), public , protected и private , делая class и interface и занимаясь наследованием?


Разницу можно найти в уже упомянутых ссылках, но тот, который используется, обычно сводится к «Принципу наименьшего знания». Только разрешите минимальную видимость, которая необходима.


Официальный учебник может быть вам полезен.

            │ Class │ Package │ Subclass │ Subclass │ World
            │       │         │(same pkg)│(diff pkg)│ 
────────────┼───────┼─────────┼──────────┼──────────┼────────
public      │   +   │    +    │    +     │     +    │   +     
────────────┼───────┼─────────┼──────────┼──────────┼────────
protected   │   +   │    +    │    +     │     +    │         
────────────┼───────┼─────────┼──────────┼──────────┼────────
no modifier │   +   │    +    │    +     │          │    
────────────┼───────┼─────────┼──────────┼──────────┼────────
private     │   +   │         │          │          │    

+ : accessible
blank : not accessible

Эта страница хорошо пишет об защищенном и стандартном модификаторе доступа

.... Protected: Защищенный модификатор доступа немного сложнее, и вы можете сказать, что это надмножество модификатора доступа по умолчанию. Защищенные члены такие же, как и члены по умолчанию, в отношении доступа в одном пакете. Разница в том, что защищенные члены также доступны для подклассов класса, в которых объявлен член, который находится вне пакета, в котором присутствует родительский класс.

Но эти защищенные члены «доступны вне пакета только через наследование». т.е. вы можете получить доступ к защищенному элементу класса в своем подклассе, присутствующем в каком-либо другом пакете, непосредственно, как если бы член присутствовал в самом подклассе. Но этот защищенный член не будет доступен в подклассе вне пакета, используя ссылку родительского класса. ....


Public Protected Default и private - это модификаторы доступа.

Они предназначены для инкапсуляции или скрытия и отображения содержимого класса.

  1. Класс может быть общедоступным или по умолчанию
  2. Члены класса могут быть общедоступными, защищенными, дефолтными или частными.

Частное недоступно вне класса. По умолчанию доступен только в пакете. Защищен в пакете, а также в любом классе, который его расширяет. Общественность открыта для всех.

Обычно переменные-члены определяются частными, но методы-члены являются общедоступными.


Видимый для пакета. По умолчанию. Модификаторы не нужны.

Видимый только для класса ( закрытый ).

Видно миру ( общественность ).

Видимый для пакета и всех подклассов ( защищенных ).

Переменные и методы могут быть объявлены без каких-либо модификаторов, которые вызываются. Примеры по умолчанию:

String name = "john";

public int age(){
    return age;
}

Модификатор частного доступа - частный:

Методы, переменные и конструкторы, объявленные частными, могут быть доступны только в объявленном классе.Модификатор частного доступа является самым ограничивающим уровнем доступа. Класс и интерфейсы не могут быть частными.

Переменные, объявленные как private, могут быть доступны вне класса, если в классе присутствуют общедоступные методы getter.

Использование частного модификатора - это основной способ, которым объект инкапсулирует себя и скрывает данные из внешнего мира.

Примеры:

Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

Модификатор общедоступного доступа - общедоступный:

Доступ к классу, методу, конструктору, интерфейсу и т. Д. Может быть доступен из любого другого класса. Поэтому поля, методы, блоки, объявленные внутри открытого класса, могут быть доступны из любого класса, принадлежащего к юниверситету Java.

Однако, если открытый класс, к которому мы пытаемся получить доступ, находится в другом пакете, тогда публичный класс по-прежнему необходимо импортировать.

Из-за наследования классов все общедоступные методы и переменные класса наследуются подклассами.

Пример:

public void cal(){

}

Защищенный защитник доступа - защищен:

Переменные, методы и конструкторы, которые объявлены защищенными в суперклассе, могут быть доступны только подклассам в другом пакете или любом классе внутри пакета класса защищенных членов.

Модификатор защищенного доступа не может применяться к классу и интерфейсам. Методы, поля могут быть объявлены защищенными, однако методы и поля в интерфейсе не могут быть объявлены защищенными.

Защищенный доступ дает подклассу возможность использовать вспомогательный метод или переменную, не мешая тому, чтобы не связанный класс пытался его использовать.

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}

                | highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
 \ xCanBeSeenBy | this          | any class | this subclass | any
  \__________   | class         | in same   | in another    | class
             \  | nonsubbed     | package   | package       |    
Modifier of x \ |               |           |               |       
————————————————*———————————————+———————————+———————————————+———————
public          |       ✔       |     ✔     |       ✔       |   ✔   
————————————————+———————————————+———————————+———————————————+———————
protected       |       ✔       |     ✔     |       ✔       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
package-private |               |           |               |
(no modifier)   |       ✔       |     ✔     |       ✘       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
private         |       ✔       |     ✘     |       ✘       |   ✘    

Все дело в инкапсуляции (или, как сказал Джо Филлипс, наименьшее знание ).

Начните с самого ограничительного (частного) и посмотрите, не понадобится ли вам менее ограничивающие модификаторы.

Мы все используем модификаторы метода и члена, такие как private, public, ... но одна вещь, которую слишком мало разработчиков делают, это использовать пакеты для логического упорядочения кода.

Например: вы можете ввести чувствительные методы защиты в пакет безопасности. Затем поместите открытый класс, который обращается к некоторому коду безопасности, содержащемуся в этом пакете, но сохраняет другие классы классов безопасности частными . Таким образом, другие разработчики смогут использовать общедоступный класс вне этого пакета (если только они не изменят модификатор). Это не функция безопасности, но будет определять использование.

Outside world -> Package (SecurityEntryClass ---> Package private classes)

Другое дело, что классы, которые сильно зависят друг от друга, могут оказаться в одном пакете и в конечном итоге могут быть реорганизованы или объединены, если зависимость слишком сильная.

Если, наоборот, вы устанавливаете все как общедоступные , неясно, к чему следует или не следует обращаться, что может привести к написанию большого количества javadoc (что ничего не может сделать с помощью компилятора ...).


Самый непонятый модификатор доступа в Java protected . Мы знаем, что он похож на модификатор по умолчанию с одним исключением, в котором подклассы могут его видеть. Но как? Вот пример, который, надеюсь, прояснит путаницу:

  • Предположим, что у нас есть 2 класса; Father и Son , каждый в своем собственном пакете:

    package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
    
  • Давайте добавим защищенный метод foo() к Father .

    package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
    
  • Метод foo() можно вызвать в четырех контекстах:

    1. Внутри класса, который находится в том же пакете, где определен foo() ( fatherpackage ):

      package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
      
    2. Внутри подкласса, в текущем экземпляре с помощью this или super :

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod()
          {
              this.foo();
              super.foo();
          }
      }
      
    3. На ссылке, тип которой является одним и тем же классом:

      package fatherpackage;
      
      public class Father
      {
          public void fatherMethod(Father f)
          {
              f.foo(); // valid even if foo() is private
          }
      }
      
      -------------------------------------------
      
      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Son s)
          {
              s.foo();
          }
      }
      
    4. На ссылке, тип которой является родительским классом, и находится внутри пакета, где определен foo() ( fatherpackage ) [Это может быть включено внутри контекста no. 1]:

      package fatherpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo();
          }
      }
      
  • Следующие ситуации недействительны.

    1. В ссылке, тип которой является родительским классом, и она находится вне пакета, где определяется foo() ( fatherpackage ):

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo(); // compilation error
          }
      }
      
    2. Неподкласс в пакете подкласса (подкласс наследует защищенные члены от его родителя и делает их частными для не-подклассов):

      package sonpackage;
      
      public class SomeClass
      {
          public void someMethod(Son s) throws Exception
          {
              s.foo(); // compilation error
          }
      }
      

Вот лучшая версия таблицы. (Будущее доказательство с колонкой для модулей.)

Пояснения

  • Частный член доступен только в том же классе, который был объявлен.

  • Член без модификатора доступа доступен только в классах одного и того же пакета.

  • Защищенный член доступен во всех классах одного и того же пакета и внутри подклассов в других пакетах.

  • Публичный член доступен для всех классов (если он не находится в module , который не экспортирует пакет, в котором он объявлен).

Какой модификатор выбрать?

Модификаторы доступа - это инструмент, который поможет вам предотвратить случайное нарушение инкапсуляции (*) . Спросите себя, хотите ли вы, чтобы член был чем-то внутренним для класса, пакета, иерархии классов или вообще не был внутренним, и соответственно выберите уровень доступа.

Примеры:

  • long internalCounter запрос должен быть закрытым, поскольку он изменен и детализация реализации.
  • Класс, который должен быть создан только в фабричном классе (в том же пакете), должен иметь конструктор с ограниченным пакетом, поскольку его нельзя будет вызывать непосредственно извне пакета.
  • Внутренний метод void beforeRender() который void beforeRender() непосредственно перед рендерингом и используется как подкласс в подклассах, должен быть защищен.
  • void saveGame(File dst) который вызывается из кода GUI, должен быть общедоступным.

(*) Что такое инкапсуляция?


Примечание. Это только дополнение для принятого ответа.

Это связано с модификаторами доступа Java .

Из модификаторов доступа Java :

Модификатор доступа Java определяет, какие классы могут получить доступ к данному классу и его полям, конструкторам и методам. Модификаторы доступа могут быть указаны отдельно для класса, его конструкторов, полей и методов. Модификаторы доступа Java иногда также упоминаются в ежедневной речи как спецификаторы доступа Java, но правильное имя - модификаторы доступа Java. Классы, поля, конструкторы и методы могут иметь один из четырех различных модификаторов доступа Java:

  • Элемент списка
  • частный
  • default (пакет)
  • защищенный
  • общественности

Из раздела «Контроль доступа к членам класса» :

Модификаторы уровня доступа определяют, могут ли другие классы использовать конкретное поле или вызвать конкретный метод. Существует два уровня контроля доступа:

  • На верхнем уровне - общедоступный или пакетно-закрытый (без явного модификатора).
  • На уровне участника - общедоступный, закрытый, защищенный или пакетно-закрытый (без явного модификатора).

Класс может быть объявлен публичным модификатором, и в этом случае этот класс будет виден всем классам. Если класс не имеет модификатора (по умолчанию, также известного как private-package), он отображается только в пределах его собственного пакета

В следующей таблице показан доступ к членам, разрешенным каждым модификатором.

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ Modifier    ║ Class ║ Package ║ Subclass ║ World ║
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
║ public      ║ Y     ║ Y       ║ Y        ║ Y     ║
║ protected   ║ Y     ║ Y       ║ Y        ║ N     ║
║ no modifier ║ Y     ║ Y       ║ N        ║ N     ║
║ private     ║ Y     ║ N       ║ N        ║ N     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

Первый столбец данных указывает, имеет ли сам класс доступ к члену, определенному уровнем доступа. Как вы можете видеть, у класса всегда есть доступ к своим членам. Во втором столбце указано, имеют ли классы в том же пакете, что и класс (независимо от их происхождения), доступ к члену. Третий столбец указывает, имеют ли подклассы класса, объявленного вне этого пакета, доступ к элементу. В четвертом столбце указано, имеют ли все классы доступ к элементу.

Уровни доступа влияют на вас двумя способами. Во-первых, когда вы используете классы, которые поступают из другого источника, например классы на платформе Java, уровни доступа определяют, какие члены этих классов могут использовать ваши собственные классы. Во-вторых, когда вы пишете класс, вам нужно решить, какой уровень доступа должен иметь каждая переменная-член и каждый метод в вашем классе.


Часто я осознавал, что запоминание основных понятий любого языка может быть сделано путем создания реальных аналогов. Вот моя аналогия для понимания модификаторов доступа в Java:

Предположим, что вы студент в университете, и у вас есть друг, который приезжает к вам в выходные. Предположим, существует большая статуя основателя университета в центре кампуса.

  • Когда вы приведете его в университетский городок, первое, что вы и ваш друг видите, это эта статуя. Это означает, что любой, кто ходит в кампусе, может смотреть на статую без разрешения университета. Это делает статую ОБЩЕСТВЕННОЙ .

  • Затем вы хотите забрать своего друга в общежитие, но для этого вам нужно зарегистрировать его в качестве посетителя. Это означает, что он получает пропуск доступа (который такой же, как ваш), чтобы попасть в различные здания на территории кампуса. Это сделало бы его карточку доступа ЗАЩИЩЕННОЙ .

  • Ваш друг хочет войти в университетский городок WiFi, но у него нет никаких учетных данных. Единственный способ, по которому он может выйти в интернет, - это поделиться своим логином с ним. (Помните, что каждый студент, который идет в университет, также обладает этими учетными данными). Это приведет к тому, что ваши учетные данные не будут отображаться как NO MODIFIER .

  • Наконец, ваш друг хочет прочитать ваш отчет о проделанной работе за семестр, который размещен на веб-сайте. Однако каждый студент имеет свой личный логин для доступа к этому разделу веб-сайта кампуса. Это сделает эти учетные данные как ЧАСТНЫЕ .

Надеюсь это поможет!


Простое правило. Начните с объявления всех частных. И затем прогресс в отношении общественности по мере возникновения потребностей, и дизайн ее оправдывает.

Когда выставлять участников, спросите себя, подвергаете ли вы выбор выбора или выбор абстракции. Первое - это то, чего вы хотите избежать, поскольку оно будет вводить слишком много зависимостей от фактического представления, а не от его наблюдаемого поведения.

Как правило, я стараюсь избегать переопределения реализации метода путем подкласса; слишком легко испортить логику. Объявите абстрактные защищенные методы, если вы намерены переопределить его.

Кроме того, используйте аннотацию @Override, когда вы переопределяете, чтобы вещи не ломались, когда вы реорганизуете.


Я просто хочу обратиться к деталям, которые чрезвычайно часто ошибаются, в том числе по большинству ответов на этой странице. Доступ «по умолчанию» (когда нет модификатора доступа) не всегда совпадает с пакетом-частным . Это зависит от того, что это такое.

  • Типы нечленов (то есть классы, перечисления, интерфейсы и типы аннотаций, не объявленные внутри другого типа) по умолчанию являются закрытыми по пакетам. ( JLS §6.6.1 )

  • По умолчанию члены класса и конструкторы являются закрытыми по пакетам. ( JLS §6.6.1 )

  • По умолчанию конструкторы Enum являются закрытыми . (В самом деле, enum contructors должны быть частными, и это ошибка, чтобы попытаться сделать их публичными или защищенными). Константы Enum являются общедоступными и не допускают спецификатор доступа. Другие члены перечисления по умолчанию закрыты по пакетам. ( JLS §8.9 )

  • Все члены интерфейсов и типы аннотаций по умолчанию являются общедоступными . (Действительно, члены интерфейсов и типы аннотаций должны быть общедоступными, и это ошибка, чтобы попытаться сделать их частными или защищенными.) ( JLS §9.3 - 9.5 )


Модификаторы доступа в Java.

Модификаторы доступа Java используются для обеспечения контроля доступа на Java.

1. По умолчанию:

Доступно только для классов только в одном пакете.

Например,

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B{
  public static void main(String args[]){
   A obj = new A(); // Compile Time Error
   obj.msg(); // Compile Time Error
  }
}

Этот доступ более ограничен, чем общедоступный и защищенный, но менее ограниченный, чем частный.

2. Общественные

Доступ к ним возможен из любого места. (Глобальный доступ)

Например,

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

Вывод: Привет

3. Частный

Доступно только внутри одного класса.

Если вы попытаетесь получить доступ к закрытым членам одного класса в другом, это приведет к ошибке компиляции. Например,

class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}

4. Защищенный

Доступно только для классов в одном пакете и подклассах

Например,

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

Вывод: Привет


Ответ Дэвида дает смысл каждого модификатора доступа. Что касается того, когда использовать каждый, я предлагаю публиковать все классы и методы каждого класса, предназначенные для внешнего использования (его API), и все остальное частное.

Со временем у вас возникнет смысл, когда нужно сделать некоторые классы private-private и когда объявлять определенные методы, защищенные для использования в подклассах.


(Caveat: Я не программист на Java, я программист Perl. Perl не имеет формальных защит, возможно, поэтому я так хорошо понимаю проблему :))

Частный

Как вы думаете, это может увидеть только класс, в котором он объявлен.

Частный пакет

Может отображаться и использоваться только пакетом, в котором он был объявлен. Это значение по умолчанию в Java (которое некоторые считают ошибкой).

защищенный

Пакет Private + можно увидеть подклассами или членами пакета.

общественного

Все это видят.

Published

Видимый вне кода, который я контролирую. (Хотя это не синтаксис Java, это важно для этого обсуждения).

C ++ определяет дополнительный уровень, называемый «friend», и чем меньше вы знаете, тем лучше.

Когда вы должны использовать что? Вся идея заключается в инкапсуляции, чтобы скрыть информацию. Насколько это возможно, вы хотите скрыть детали того, как что-то делается от ваших пользователей. Зачем? Потому что тогда вы можете изменить их позже и не нарушать чей-то код. Это позволяет оптимизировать, реорганизовывать, реорганизовывать и исправлять ошибки, не опасаясь, что кто-то использует этот код, который вы только что пересмотрели.

Таким образом, эмпирическое правило заключается в том, чтобы сделать вещи такими же видимыми, какими они должны быть. Начните с частных и только добавьте больше видимости по мере необходимости. Публикуйте только то, что абсолютно необходимо для пользователя, чтобы знать, каждая деталь, которую вы делаете публичными судорогами, позволяет вам перепроектировать систему.

Если вы хотите, чтобы пользователи могли настраивать поведение, а не открывать внутренности, чтобы они могли переопределить их, часто лучше перетащить эти кишки в объект и сделать этот интерфейс общедоступным. Таким образом, они могут просто подключить новый объект. Например, если вы пишете проигрыватель компакт-дисков и хотите, чтобы бит «идти найти информацию об этом компакт-диске» настраивался, а не публиковать эти методы, вы включили бы все эти функции в свой собственный объект и сделали бы свой объект getter / setter общедоступным , Таким образом, скупость о том, чтобы разоблачить ваши кишки, поощряет хороший состав и разделение проблем

Лично я придерживаюсь только «частных» и «публичных». У многих языков OO есть это. «Защищенный» может пригодиться, но это действительно чит. Когда интерфейс более чем частный, он находится вне вашего контроля, и вам нужно искать в коде других людей, чтобы найти пользу.

Здесь возникает идея «опубликования». Изменение интерфейса (рефакторинг) требует, чтобы вы нашли весь код, который его использует, и также измените его. Если интерфейс частный, то проблем нет. Если он защищен, вам нужно найти все ваши подклассы. Если это общедоступно, вам нужно найти весь код, который использует ваш код. Иногда это возможно, например, если вы работаете с корпоративным кодом, который используется только для внутреннего использования, не имеет значения, открыт ли интерфейс. Вы можете извлечь весь код из корпоративного репозитория. Но если интерфейс «опубликован», если есть код, использующий его вне вашего контроля, тогда вы будете закрыты. Вы должны поддерживать этот интерфейс или код нарушения риска. Даже защищенные интерфейсы можно считать опубликованными (поэтому я не беспокоюсь о защите).

Многие языки находят иерархическую природу public / protected / private слишком ограничивающей и не соответствующей действительности. С этой целью существует концепция класса признаков , но это еще одно шоу.


Частный : ограниченный доступ только к классу

По умолчанию (без модификатора) : ограниченный доступ к классу и пакету

Защищенный : ограниченный доступ к классу, пакету и подклассам (как внутри, так и снаружи пакета)

Публикация : доступ к классу, пакету (все) и подклассам ... Короче, везде.


  • общедоступный - доступный из любого места приложения.

  • default - доступен из пакета.

  • protected - доступный из пакета и подклассов в другой пакет. также

  • доступный только из своего класса.


Когда вы думаете о модификаторах доступа, просто подумайте об этом таким образом (применительно к обеим переменным и методам ):

public-> доступно из любого места
private-> доступно только в том же классе, где он объявлен

Теперь возникает путаница , когда речь идет defaultиprotected

default-> Нет ключевого слова модификатора доступа. Это означает, что он доступен строго в пакете класса. Нигде за пределами этого пакета он доступен.

protected-> Чуть менее строгий, чем defaultи кроме тех же классов пакетов, к ним можно получить доступ под классами вне объявленного пакета .





access-modifiers