Обяснение на модификаторите на достъпа в Java

Какво представляват модификаторите на достъп?

Искали ли сте някога да определите как хората ще имат достъп до някои от вашите имоти? Не бихте искали някой да използва вашето бельо. Вашите близки приятели и роднини обаче могат да използват вашия пуловер и може би вашата кола.

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

Java предоставя 4 нива на модификатори за достъп. Това означава, че можете да промените достъпа до променлива, метод или клас по 4 начина. Тези 4 начина са частни, публични, защитени и по подразбиране.

Тези модификатори на достъпа могат да бъдат приложени към полета, методи и класове (Класовете са специален случай, ще ги разгледаме в края на този член). Ето кратък преглед1 за това какво Access Levelsпредставляват за всеки Access Modifier:

Препратка към таблицата с модификатори на достъп:

Таблица с модификатори на достъп

Модификатор на частния достъп

Позволява достъп до променлива или метод само в класа, в който е създаден. Никой друг клас извън класа, създал променливата или метода, няма достъп до нея. Това е много подобно на вашите вътрешни органи. Те са достъпни само за собственика. За да направите променлива или метод частни, просто добавете ключовата дума private преди променливата или типа метод. Нека използваме private в пример за кодиране. Ако банка иска да предостави лихвен процент от 10% по своите заеми, тя ще се увери, че променливата на лихвения процент (нека предположим int int_rate;) ще остане частна, тъй като никой друг клас не би се опитал да получи достъп до нея и да я промени. Например;

private String name;

Горният пример създава променлива, наречена name, и гарантира, че тя е достъпна само в класа, от който е създадена.

Друг пример за метод е

private void setAge(){ System.out.println("Set Age"); }

Горният пример гарантира, че методът setAge е достъпен само в класа, от който е създаден, и никъде другаде.

Модификатор на публичния достъп

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

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

Например, за да декларирате клас като обществен, всичко, от което се нуждаете, е:

public class Animal{ }

Като такъв, класът Animal може да бъде достъпен от всеки друг клас.

public int age; public int getAge(){ }

По-горе са начини за определяне на променлива и метод като публични.

Модификаторът по подразбиране за достъп

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

Например, за да използвате модификатора за достъп по подразбиране за клас, който използвате

class Bird{ }

Това по същество означава, че използвате модификатора за достъп по подразбиране. Модификаторът по подразбиране за достъп позволява променлива, метод или клас да бъдат достъпни от други класове в рамките на същия пакет. Пакетът е колекция от свързани класове във файлова директория. За повече информация относно пакетите, вижте раздела за пакетите.

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

int age; void setNewAge(){ }

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

Модификатор на защитен достъп

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

Променливата и методът са единствените, които използват модификатора на защитения достъп. Малкото подобрение е, че клас извън пакета клас, от който е декларирана променливата или методът, може да има достъп до споменатата променлива или метод. Това е възможно САМО ако то наследява от Класа, обаче.

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

Забележете, без предимството на наследяване, модификатор на достъп по подразбиране има точно същия достъп като защитен модификатор на достъп.

Примери за използване на модификатора на защитен достъп са показани по-долу:

protected int age; protected String getName(){ return "My Name is You"; }

Достъп до модификатори на класове

По подразбиране класовете могат да имат само 2 модификатора:

  • публично
  • няма модификатор (модификатор по подразбиране)

Това означава, че класовете никога не могат да бъдат настроени на privateили protected?

Това е логично, защо бихте искали да направите частен клас? Никой друг клас не би могъл да го използва. Но понякога можете да вградите клас в друг клас. Тези специални класове, inner classesмогат да бъдат зададени като частни или защитени, така че само околният клас да има достъп до него:

public class Car { private String brand; private Engine engine; // ... private class Engine { // ... } }

В горния пример само Carкласът може да използва Engineкласа. Това може да бъде полезно в някои случаи.

Други класове никога не могат да бъдат настроени на protectedили private, защото няма смисъл. В protectedдостъп модификатор се използва за да направим нещата package-private, но с опция да бъде достъпна за подкласове. Няма понятие като „подпакети“ или „наследяване на пакети“ в java.