Перейти к содержимому

Какая зона видимости у модификатора доступа default

  • автор:

Области видимости и модификаторы доступа

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

Отдельно следует отметить модификатор static, который регулирует не область видимости, а обозначает статические переменные и методы, которые существуют без необходимости создания объекта, обращаться к ним следует через имя класса. Статические переменные существуют все время работы программы, однако это не мешает регулировать область их видимости модификаторами доступа.

Если переменная объявляется в теле метода, в цикле или условной конструкции, то она исчезает после завершения работы метода, цикла или ветки. То же самое касается аргументов методов, переменные-аргументы существуют только в момент выполнения метода. Следовательно, такие локальные переменные не могут быть доступными из других блоков кода. Модификаторы доступа здесь не используются.

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

В программах на языке Java часто используют два модификатора доступа – public и private. Реже – protected. Кроме того, есть так называемый модификатор по умолчанию, который используется, когда не указан ни один другой.

Если к полю, методу или классу применен модификатор public, к ним можно обращаться из любого места программы. То есть public-сущности доступны любым другим классам как в текущем пакете, так и за его пределами. Данное положение не отменяет необходимости импорта пакета.

Модификатор private применяется к переменным или методам, по отношению к классам не имеет смысла. К таким private-сущностям можно обращаться только из того же класса, где они объявлены. Для всех остальных классов, в том числе дочерних, такие поля и методы остаются невидимыми.

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

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

Таким образом степень приватности увеличивается так: public → protected → default → private.

Рассмотрим пример. Файл Main.java:

public class Main  public static void main(String[] args)  Book a = new Book("The Way", -50); System.out.println(a.getTitle()); System.out.println(a.getPage()); > >
class Book  private String t; private int p; Book(String title, int page)  this.t = title; this.p = testPage(page); > String getTitle()  return this.t; > int getPage()  return this.p; > private int testPage(int pg)  if (pg > 0) return pg; else return -pg; > >

Оба файла находятся в одном каталоге, т. е. принадлежать одному пакету. Поэтому в классе Book можно не использовать модификатор public, чтобы предоставить доступ к Book классу Main. Метод testPage может использоваться только внутри класса Book.

Если бы в каталог, где находятся Main.java и Book.java, был вложен другой каталог-пакет с классами, то эти классы должны были бы иметь модификатор public для доступа к ним из Main.

Таким образом, классы в Java могут иметь модификатор public, либо не иметь явно указанного модификатора. У полей и методов может быть один из четырех, считая модификатор по умолчанию. Однако объявление публичного метода в непубличном классе вряд ли имеет смысл.

Также не следует забывать про модификатор static, который, если используется, пишется после модификатора доступа. Следом указывается тип переменной или возвращаемое методом значение. Далее идут имя переменной или метода. Если метод ничего не возвращает используется ключевое слово void.

X Скрыть Наверх

Программирование на Java. Курс

Какая зона видимости у модификатора доступа default

Все члены класса в языке Java — поля и методы — имеют модификаторы доступа. В прошлых темах мы уже сталкивались с модификатором public . Модификаторы доступа позволяют задать допустимую область видимости для членов класса, то есть контекст, в котором можно употреблять данную переменную или метод.

В Java используются следующие модификаторы доступа:

  • public : публичный, общедоступный класс или член класса. Поля и методы, объявленные с модификатором public, видны другим классам из текущего пакета и из внешних пакетов.
  • private : закрытый класс или член класса, противоположность модификатору public. Закрытый класс или член класса доступен только из кода в том же классе.
  • protected : такой класс или член класса доступен из любого места в текущем классе или пакете или в производных классах, даже если они находятся в других пакетах
  • Модификатор по умолчанию . Отсутствие модификатора у поля или метода класса предполагает применение к нему модификатора по умолчанию. Такие поля или методы видны всем классам в текущем пакете.

Рассмотрим модификаторы доступа на примере следующей программы:

public class Program < public static void main(String[] args) < Person kate = new Person("Kate", 32, "Baker Street", "+12334567"); kate.displayName(); // норм, метод public kate.displayAge(); // норм, метод имеет модификатор по умолчанию kate.displayPhone(); // норм, метод protected //kate.displayAddress(); // ! Ошибка, метод private System.out.println(kate.name); // норм, модификатор по умолчанию System.out.println(kate.address); // норм, модификатор public System.out.println(kate.age); // норм, модификатор protected //System.out.println(kate.phone); // ! Ошибка, модификатор private >> class Person < String name; protected int age; public String address; private String phone; public Person(String name, int age, String address, String phone)< this.name = name; this.age = age; this.address = address; this.phone = phone; >public void displayName() < System.out.printf("Name: %s \n", name); >void displayAge() < System.out.printf("Age: %d \n", age); >private void displayAddress() < System.out.printf("Address: %s \n", address); >protected void displayPhone()< System.out.printf("Phone: %s \n", phone); >>

В данном случае оба класса расположены в одном пакете — пакете по умолчанию, поэтому в классе Program мы можем использовать все методы и переменные класса Person, которые имеют модификатор по умолчанию, public и protected. А поля и методы с модификатором private в классе Program не будут доступны.

Если бы класс Program располагался бы в другом пакете, то ему были бы доступны только поля и методы с модификатором public.

Модификатор доступа должен предшествовать остальной части определения переменной или метода.

Инкапсуляция

Казалось бы, почему бы не объявить все переменные и методы с модификатором public , чтобы они были доступны в любой точке программы вне зависимости от пакета или класса? Возьмем, например, поле age, которое представляет возраст. Если другой класс имеет прямой доступ к этому полю, то есть вероятность, что в процессе работы программы ему будет передано некорректное значение, например, отрицательное число. Подобное изменение данных не является желательным. Либо же мы хотим, чтобы некоторые данные были достуны напрямую, чтобы их можно было вывести на консоль или просто узнать их значение. В этой связи рекомендуется как можно больше ограничивать доступ к данным, чтобы защитить их от нежелательного доступа извне (как для получения значения, так и для его изменения). Использование различных модификаторов гарантирует, что данные не будут искажены или изменены не надлежащим образом. Подобное сокрытие данных внутри некоторой области видимости называется инкапсуляцией .

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

public class Program < public static void main(String[] args) < Person kate = new Person("Kate", 30); System.out.println(kate.getAge()); // 30 kate.setAge(33); System.out.println(kate.getAge()); // 33 kate.setAge(123450); System.out.println(kate.getAge()); // 33 >> class Person < private String name; private int age = 1; public Person(String name, int age)< setName(name); setAge(age); >public String getName() < return this.name; >public void setName(String name) < this.name = name; >public int getAge() < return this.age; >public void setAge(int age) < if(age >0 && age < 110) this.age = age; >>

И затем вместо непосредственной работы с полями name и age в классе Person мы будем работать с методами, которые устанавливают и возвращают значения этих полей. Методы setName, setAge и наподобие еще называют мьютейтерами (mutator), так как они изменяют значения поля. А методы getName, getAge и наподобие называют аксессерами (accessor), так как с их помощью мы получаем значение поля.

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

Какая зона видимости у модификатора доступа default

Концовка только была внятно понятно рассказана, не пойму почему примеры такие же доходчивые с protected и default не привели.

Anonymous #3291313 Уровень 51
3 сентября 2023

Я что-то не пойму, здесь всех устраивает что ничего до этого не было в обучающем материале об инкапсуляции, геттерах и сеттерах, а в этой статье об этом так говорят типа все тут уже в курсе на счёт этого?

14 июня 2023

Мне кажется или в статье ошибка? Порядок модификаторов по строгости должен быть: — private — default — protected — public ?

Anatoly Уровень 19
19 мая 2023
3 мая 2023
Очень доходчиво
Ислам Уровень 32
21 апреля 2023
Классная лекция с отличными примерами.
Станислав Ревика Уровень 16
13 февраля 2023
Супердоходчиво
Timur Khasmamedov Уровень 14 Expert
9 января 2023

Можно уж исправить это наконец ? https://www.javatpoint.com/access-modifiers

Андрей Уровень 42
23 декабря 2022

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

Vladimir Уровень 15
4 декабря 2022
Get and Set , мы ещё не изучали �� в данном уровне
Сообщество

JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.

Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2023 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2023 JavaRush

Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.

Какие модификаторы доступа существуют в Java

Изучите 4 модификатора доступа в Java (public, private, protected, default) для обеспечения безопасности и инкапсуляции данных.

Алексей Кодов
Автор статьи
9 июня 2023 в 16:31

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

1. Public

Модификатор public означает, что элемент (класс, метод, переменная или конструктор) доступен из любого места в программе, включая другие пакеты. Это самый открытый уровень доступа, и его следует использовать, когда элемент должен быть видимым для всего кода.

public class MyClass < public int myVariable; public void myMethod() < // . >>

2. Private

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

class MyClass < private int myVariable; private void myMethod() < // . >>

3. Protected

Модификатор protected делает элемент доступным только для классов из того же пакета и всех подклассов. Это полезно, когда нужно предоставить доступ к определенным методам и переменным для наследников, но скрыть их от других классов.

class MyClass < protected int myVariable; protected void myMethod() < // . >>

4. Default (пакетный доступ)

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

class MyClass < int myVariable; // default access void myMethod() < // default access // . >>

Java-разработчик: новая работа через 11 месяцев
Получится, даже если у вас нет опыта в IT

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Luxury Car Rental in Miami | Reserve a Premium Vehicle with RealCar