Інкапсуляція в Java — це фундаментальна концепція в об’єктно-орієнтованому програмуванні (ООП), яка відноситься до об’єднання даних і методів, які працюють з цими даними, в одній одиниці, яка в Java називається класом. Інкапсуляція Java — це спосіб приховати деталі реалізації класу від зовнішнього доступу та відкрити лише публічний інтерфейс, який можна використовувати для взаємодії з класом.
У Java інкапсуляція досягається шляхом оголошення змінних примірника класу як приватних, що означає, що до них можна отримати доступ лише в межах класу. Щоб дозволити зовнішній доступ до змінних екземпляра, визначено загальнодоступні методи, що називаються геттерами та сеттерами, які використовуються для отримання та зміни значень змінних екземпляра відповідно. Використовуючи геттери та сетери, клас може застосовувати власні правила перевірки даних і гарантувати, що його внутрішній стан залишається послідовним.
Реалізація Java Encapsulation
Нижче наведено приклад інкапсуляції Java:
Java
// Java Program to demonstrate> // Java Encapsulation> // Person Class> class> Person {> > // Encapsulating the name and age> > // only approachable and used using> > // methods defined> > private> String name;> > private> int> age;> > public> String getName() {> return> name; }> > public> void> setName(String name) {> this> .name = name; }> > public> int> getAge() {> return> age; }> > public> void> setAge(> int> age) {> this> .age = age; }> }> // Driver Class> public> class> Main {> > // main function> > public> static> void> main(String[] args)> > {> > // person object created> > Person person => new> Person();> > person.setName(> 'John'> );> > person.setAge(> 30> );> > // Using methods to get the values from the> > // variables> > System.out.println(> 'Name: '> + person.getName());> > System.out.println(> 'Age: '> + person.getAge());> > }> }> |
java передає int до рядка
>
>Вихід
Name: John Age: 30>
Інкапсуляція визначається як згортання даних в єдиний блок. Це механізм, який поєднує код і дані, якими він маніпулює. Інший спосіб думати про інкапсуляцію полягає в тому, що це захисний щит, який запобігає доступу до даних кодом поза цим щитом.
- Технічно в інкапсуляції змінні або дані класу приховані від будь-якого іншого класу і доступ до них можливий лише через будь-яку функцію-член власного класу, в якому вони оголошені.
- Як і в інкапсуляції, дані в класі приховані від інших класів за допомогою концепції приховування даних, яка досягається шляхом надання членів або методів класу приватним, і клас відкритий для кінцевого користувача або світу без надання будь-яких деталей за реалізацією з використанням концепції абстракції, тому вона також відома як a поєднання приховування даних і абстракції .
- Інкапсуляція може бути досягнута шляхом оголошення всіх змінних у класі як приватних і написання публічних методів у класі для встановлення та отримання значень змінних.
- Це більш визначено за допомогою методу встановлення та отримання.
Переваги інкапсуляції
- Приховування даних: це спосіб обмежити доступ членів наших даних шляхом приховування деталей реалізації. Інкапсуляція також забезпечує спосіб приховування даних. Користувач не матиме уявлення про внутрішню реалізацію класу. Користувачеві не буде видно, як клас зберігає значення в змінних. Користувач лише знатиме, що ми передаємо значення методу налаштування, а змінні ініціалізуються цим значенням.
- Підвищена гнучкість: Ми можемо зробити змінні класу лише для читання або лише для запису залежно від наших вимог. Якщо ми хочемо зробити змінні доступними лише для читання, ми маємо виключити такі методи налаштування, як setName(), setAge() тощо, у наведеній вище програмі, або якщо ми хочемо зробити змінні доступними лише для запису, тоді ми маємо опустити отримати такі методи, як getName(), getAge() тощо з наведеної вище програми
- Повторне використання: Інкапсуляція також покращує можливість повторного використання та легко змінюється відповідно до нових вимог.
- Перевірити код легко: Інкапсульований код легко протестувати для модульного тестування.
- Свобода для програміста в реалізації деталей системи: Однією з головних переваг інкапсуляції є те, що вона дає програмісту свободу реалізації деталей системи. Єдине обмеження для програміста — підтримувати абстрактний інтерфейс, який бачать сторонні.
Наприклад: Програміст коду меню редагування в графічному інтерфейсі текстового редактора може спочатку реалізувати операції вирізання та вставлення шляхом копіювання реальних екранних зображень у зовнішній буфер і з нього. Пізніше він/вона може бути незадоволений цією реалізацією, оскільки вона не дозволяє компактно зберігати виділення та не розрізняє текстові та графічні об’єкти. Якщо програміст розробив інтерфейс «вирізання та вставлення» з урахуванням інкапсуляції, перемикання базової реалізації на таку, яка зберігає текст як текст і графічні об’єкти у відповідному компактному форматі, не повинно викликати жодних проблем для функцій, які потребують взаємодії з цим графічним інтерфейсом користувача. . Таким чином, інкапсуляція забезпечує адаптивність, оскільки дозволяє змінювати деталі реалізації частин програми без негативного впливу на інші частини.
Недоліки інкапсуляції в Java
- Може призвести до збільшення складності, особливо якщо не використовується належним чином.
- Може ускладнити розуміння того, як працює система.
- Може обмежити гнучкість реалізації.
Приклади інкапуляції даних у Java
Приклад 1:
Нижче наведено реалізацію вищезазначеної теми:
Java
// Java Program to demonstrate> // Java Encapsulation> // fields to calculate area> class> Area {> > int> length;> > int> breadth;> > // constructor to initialize values> > Area(> int> length,> int> breadth)> > {> > this> .length = length;> > this> .breadth = breadth;> > }> > // method to calculate area> > public> void> getArea()> > {> > int> area = length * breadth;> > System.out.println(> 'Area: '> + area);> > }> }> class> Main {> > public> static> void> main(String[] args)> > {> > Area rectangle => new> Area(> 2> ,> 16> );> > rectangle.getArea();> > }> }> |
>
>Вихід
Area: 32>
приклад 2:
Програма доступу до змінних класу EncapsulateDemo показана нижче:
Java
баш сон
// Java program to demonstrate> // Java encapsulation> class> Encapsulate {> > // private variables declared> > // these can only be accessed by> > // public methods of class> > private> String geekName;> > private> int> geekRoll;> > private> int> geekAge;> > // get method for age to access> > // private variable geekAge> > public> int> getAge() {> return> geekAge; }> > // get method for name to access> > // private variable geekName> > public> String getName() {> return> geekName; }> > // get method for roll to access> > // private variable geekRoll> > public> int> getRoll() {> return> geekRoll; }> > // set method for age to access> > // private variable geekage> > public> void> setAge(> int> newAge) { geekAge = newAge; }> > // set method for name to access> > // private variable geekName> > public> void> setName(String newName)> > {> > geekName = newName;> > }> > // set method for roll to access> > // private variable geekRoll> > public> void> setRoll(> int> newRoll) { geekRoll = newRoll; }> }> public> class> TestEncapsulation {> > public> static> void> main(String[] args)> > {> > Encapsulate obj => new> Encapsulate();> > // setting values of the variables> > obj.setName(> 'Harsh'> );> > obj.setAge(> 19> );> > obj.setRoll(> 51> );> > // Displaying values of the variables> > System.out.println(> 'Geek's name: '> + obj.getName());> > System.out.println(> 'Geek's age: '> + obj.getAge());> > System.out.println(> 'Geek's roll: '> + obj.getRoll());> > // Direct access of geekRoll is not possible> > // due to encapsulation> > // System.out.println('Geek's roll: ' +> > // obj.geekName);> > }> }> |
>
>Вихід
Geek's name: Harsh Geek's age: 19 Geek's roll: 51>
приклад 3:
У наведеній вище програмі клас Encapsulate інкапсульовано, оскільки змінні оголошено приватними. Такі методи get, як getAge(), getName() і getRoll() встановлені як загальнодоступні, ці методи використовуються для доступу до цих змінних. Методи встановлення, такі як setName(), setAge(), setRoll(), також оголошені як публічні та використовуються для встановлення значень змінних.
Нижче наведено реалізацію визначеного прикладу:
Java
// Java Program to demonstrate> // Java Encapsulation> class> Name {> > // Private is using to hide the data> > private> int> age;> > // getter> > public> int> getAge() {> return> age; }> > // setter> > public> void> setAge(> int> age) {> this> .age = age; }> }> // Driver Class> class> GFG {> > // main function> > public> static> void> main(String[] args)> > {> > Name n1 => new> Name();> > n1.setAge(> 19> );> > System.out.println(> 'The age of the person is: '> > + n1.getAge());> > }> }> |
>
>Вихід
The age of the person is: 19>
Приклад 4:
Нижче наведено реалізацію Java Encapsulation:
Java
цикл for у bash
// Java Program to demonstrate> // Java Encapsulation> class> Account {> > // private data members to hide the data> > private> long> acc_no;> > private> String name, email;> > private> float> amount;> > // public getter and setter methods> > public> long> getAcc_no() {> return> acc_no; }> > public> void> setAcc_no(> long> acc_no)> > {> > this> .acc_no = acc_no;> > }> > public> String getName() {> return> name; }> > public> void> setName(String name) {> this> .name = name; }> > public> String getEmail() {> return> email; }> > public> void> setEmail(String email)> > {> > this> .email = email;> > }> > public> float> getAmount() {> return> amount; }> > public> void> setAmount(> float> amount)> > {> > this> .amount = amount;> > }> }> // Driver Class> public> class> GFG {> > // main function> > public> static> void> main(String[] args)> > {> > // creating instance of Account class> > Account acc => new> Account();> > // setting values through setter methods> > acc.setAcc_no(90482098491L);> > acc.setName(> 'ABC'> );> > acc.setEmail(> '[email protected]'> );> > acc.setAmount(100000f);> > // getting values through getter methods> > System.out.println(> > acc.getAcc_no() +> ' '> + acc.getName() +> ' '> > + acc.getEmail() +> ' '> + acc.getAmount());> > }> }> |
>
>Вихід
90482098491 ABC [email protected] 100000.0>