Сколько существует различных модификаторов доступа в java
Перейти к содержимому

Сколько существует различных модификаторов доступа в java

  • автор:

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

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

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

public int i; private static double j; private int myMethod (int а , char b ) < / / . . .

Существует три модификатора доступа: public , private и protected и четыре уровня доступа:

  1. public (открытый) - когда член объявляется с модификатором доступа public , он становится доступным из любого другого кода.
  2. private (закрытый) - когда член класса объявляется с модификатором доступа private , он доступен только другим членам этого же класса.
  3. protected (защищенный) - применяется только при наследовании.
  4. Уровень доступа, предоставляемый по умолчанию - в отсутствие модификатора доступа по умолчанию член класса считается открытым в своем пакете, но недоступным для кода, находящегося за пределами этого пакета.

Ограничение уровня доступа к членам класса - это еще один механизм реализации принципа инкапсуляции.

2. Отличие уровня доступа по умолчанию, public и private

Рассмотрим отличие уровня доступа по умолчанию, public и private на следующем примере. В классе Modificators объявлено три переменные с разным уровнем доступа. Внутри самого класса Modificators можно обратится к любой из этих переменных, как показано в методе toString() :

package oop; public class Modificators < public int publicVar; // открытый уровень доступа private int privateVar; // закрытый уровень доступа int defaultVar; // уровень доступа по умолчанию public String toString() < return "Modificatorspackage oop; public class ModificatorsDemo1 < public static void main(String[] args) < Modificators object = new Modificators(); object.defaultVar = 10; object.publicVar = 20; //object.privateVar = 100; // Ошибка компиляции! >>

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

package oop.p2; import oop.Modificators; public class ModificatorsDemo2 < public static void main(String[] args) < Modificators object = new Modificators(); //object.defaultVar = 10;// Ошибка компиляции! object.publicVar = 20; //object.privateVar = 100; // Ошибка компиляции! >>

3. Уровень доступа protected в Java

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

Рассмотрим разницу между уровнями доступа на следующем примере.

Объявим в классе Parent три метода с разными уровнями доступа:

package oop.p1; public class Parent < public void publicAccessMethod() < >void defaultAccessMethod() < >protected void protectedAccessMethod() < >> 

Определяем класс наследник в другом пакете:

package oop.p2; import oop.p1.Parent; public class Child extends Parent < public void someMethod() < publicAccessMethod(); //defaultAccessMethod(); protectedAccessMethod(); >>

Из класса Child нет доступа к default членам класса Parent , но есть доступ к protected и public членам класса Parent .

Рассмотрим следующий класс - AccessClass , находящийся в пакете отличном от класса Parent . Он не является наследником Parent , поэтому доступ из него разрешен только к public методам:

package oop.p2; import oop.p1.Parent; public class AccessClass < public static void main(String[] args) < Parent parent = new Parent(); parent.publicAccessMethod(); // parent.defaultAccessMethod(); // parent.protectedAccessMethod(); >>

Перенесем класс AccessClass в пакет, в котором находится класс Parent , и мы получим доступ не только к public членам класса, но и к protected и default :

package oop.p1; public class AccessClass < public static void main(String[] args) < Parent parent = new Parent(); parent.publicAccessMethod(); parent.defaultAccessMethod(); parent.protectedAccessMethod(); >> 

4. Уровни доступа для класса

Для класса, не являющегося вложенным, может быть указан только один из двух возможных уровней доступа:

  • По умолчанию - если у класса имеется уровень доступа по умолчанию, такой класс оказывается доступным только для кода из данного пакета.
  • Открытый ( public ) - если класс объявлен как public , он доступен из любого другого кода.

Когда мы говорим, что код из одного класса ( class A ) имеет доступ к коду из другого класса ( class B ), это означает что класс A может делать одну из трех вещей:

  • создать экземпляр класса B ,
  • наследовать класс B ,
  • иметь доступ к определенным членам класса B .

В этом примере показана попытка наследовать класс HotBevarage с уровнем доступа по умолчанию из другого пакета. В этом случае возникнет ошибка компиляции:

package oop.p1; class HotBeverage<> 
package oop.p2; //import oop.p1.HotBeverage; public class Tea //extends HotBeverage<> 

Если класс оказывается открытым, он должен быть единственным открытым классом, объявленным в файле, а имя этого файла должно совпадать с именем класса. Например:

public class Beverage <> class HotBeverage<> 
  • Процедурное и объектно-ориентированное программирование
  • Принципы ООП
  • Классы и объекты
  • Конструктор
  • Ключевое слово this
  • Перегрузка
  • Стек и куча
  • Передача объектов в методы
  • Java varargs
  • Рекурсия
  • Сборщик мусора и метод finalize
  • Наследование
  • Ключевое слово super
  • Геттеры и сеттеры
  • Переопределение методов
  • Абстрактные классы и методы
  • Ключевое слово final
  • Задания

#18 – Пакеты, перегрузки, модификатор static

#18 – Пакеты, перегрузки, модификатор static

В ходе урока мы более детально поговорим про пакеты (packages) и их применение в Джава. Дополнительно мы изучим принцип перегрузки методов и рассмотрим на практике модификаторы доступа «static» и «final».

Видеоурок

Пакеты и Джава

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

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

Пример пакетной области:

package some_name;

Название для пакета может быть любым. Также может быть множество пакетов и каждый из них можно импортировать при необходимости.

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

import java.util.*;

В примере мы импортируем из пакетной области java.util полностью все классы. После импорта можно использовать все классы что созданы в этом пакете.

Область видимости

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

Что такое перегрузка методов?

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

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

Отличным примером является метод «print» или «println». В данный метод мы можем передавать различные типы данных, но при этом вывод информации происходит без каких-либо ошибок. Так происходит из-за того, что в классе System есть множество перегрузок методов «print» и «println».

Как создать перегрузку?

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

public static String getInfo(String some) < return some + "!"; >public static int getInfo(int a, int b)

Теперь при вызове метода компилятор будет понимать какие параметры были переданы и в зависимости от этого будут вызываться разные методы.

Модификатор static

В Java есть несколько модификаторов доступа. Про модификаторы public , protected и private мы уже говорили. Теперь настал черед final и static.

Благодаря static мы можем создать переменную или метод, что будет принадлежать к классу в целом. Это означает, что можно обратиться к статическому методу или статическому полю напрямую через класс без создания объекта.

Это удобно и подобная схема реализована во многих встроенных классах Java.

Для примера возьмем класс Math (класс связан с математическими формулами). Через класс можно обратить к методам и к значениям без создания объекта на основе класса:

int i = -10; int iAbs = Math.abs(i); // Будет 10

Для создания поля или метода с модификатором static необходимо дописать ключевое слово static перед типом данных:

public static String some = "Просто текст";

Модификатор final

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

final int a = 2; a = 5; // Такого делать нельзя и будет ошибка

Если final прописать перед названием класса, то класс не сможет иметь классов-наследников.

Сколько существует различных модификаторов доступа в java

Все члены класса в языке 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), так как с их помощью мы получаем значение поля.

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

Модификаторы доступа Java – Public, Private, Protected

Во время работы с Java встречаются public, protected and private – это модификаторы доступа. Модификатор доступа в Java(Access Modifiers) ограничивает доступ к классу, конструктору, данным и методам в другом классе. Есть четыре типа:

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

Модификатор доступа по умолчанию

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

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

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

Пример модификатора доступа по умолчанию в Java

В этом примере у нас есть два класса, класс Test пытается получить доступ к методу по умолчанию класса Addition, поскольку класс Test принадлежит другому пакету, эта программа выдаст ошибку компиляции, поскольку область действия модификатора по умолчанию ограничена одним и тем же пакетом в котором он объявлен.

package abcpackage; public class Addition < /* Так как здесь мы не упомянули модификатор доступа, * он считается по умолчанию. */ int addTwoNumbers(int a, int b)< return a+b; >>
package xyzpackage; /* Мы импортируем abcpackage * но все равно мы получим ошибку, потому что * класс, который мы пытаемся использовать, имеет доступ по умолчанию */ import abcpackage.*; public class Test < public static void main(String args[])< Addition obj = new Addition(); /* Это вызовет ошибку, потому что мы пытаемся получить доступ * метод по умолчанию в другом пакете */ obj.addTwoNumbers(10, 21); >>

Вывод:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method addTwoNumbers(int, int) from the type Addition is not visible
at xyzpackage.Test.main(Test.java:12)

наглядная таблица модификаторов доступа

Модификатор личного(private) доступа

Область применения модификатора private ограничена только классом.

  1. Методы доступны только внутри класса.
  2. Класс и интерфейс не могут быть объявлены как private.
  3. Если класс имеет закрытый конструктор, вы не можете создать объект этого класса извне класса.

Пример использования private

В этом примере выдается ошибка компиляции, поскольку мы пытаемся получить доступ к частному члену данных и методу класса ABC в классе Example. Элемент данных и метод private доступны только внутри класса.

class ABC < private double num = 100; private int square(int a)< return a*a; >> public class Example < public static void main(String args[])< ABC obj = new ABC(); System.out.println(obj.num); System.out.println(obj.square(10)); >>

Output:
Compile - time error

Protected – защищенный доступ

Элемент данных и метод protected доступны только классам одного и того же пакета и подклассам, присутствующим в любом пакете. Также можно сказать, что модификатор защищенного доступа похож на модификатор доступа по умолчанию, за одним исключением, что он имеет видимость в подклассах.

Классы не могут быть объявлены protected. Этот модификатор обычно используется в родительских дочерних отношениях.

Пример protected

В этом примере класс Test, присутствующий в другом пакете, может вызвать метод addTwoNumbers(), который объявлен как protected. Это связано с тем, что класс Test расширяет класс Addition, а protected разрешает доступ защищенным членам в подклассах (в любых пакетах).

package abcpackage; public class Addition < protected int addTwoNumbers(int a, int b)< return a+b; >>
package xyzpackage; import abcpackage.*; class Test extends Addition < public static void main(String args[])< Test obj = new Test(); System.out.println(obj.addTwoNumbers(11, 22)); >>

Public – публичный доступ

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

Пример применения public

Давайте возьмем тот же пример, который мы видели выше, но на этот раз метод addTwoNumbers() имеет public модификатор, и класс Test может получить доступ к этому методу, даже не расширяя класс Addition.

Это потому, что публичный модификатор виден везде.
Addition.java

package abcpackage; public class Addition < public int addTwoNumbers(int a, int b)< return a+b; >>
package xyzpackage; import abcpackage.*; class Test < public static void main(String args[])< Addition obj = new Addition(); System.out.println(obj.addTwoNumbers(100, 1)); >>

Средняя оценка 4.4 / 5. Количество голосов: 5

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Помогите улучшить статью.

Напишите комментарий, что можно добавить к статье, какой информации не хватает.

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

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