JavaRush /Java блог /Random UA /Концепція об'єктно-орієнтованого програмування JAVA
shabnahm
18 рівень

Концепція об'єктно-орієнтованого програмування JAVA

Стаття з групи Random UA
JAVA ґрунтується на концепціях об'єктно-орієнтованого програмування, що дозволяє перейти на вищий рівень абстракції, щоб вирішити будь-яку проблему реалістичним шляхом. Об'єктно-орієнтований підхід концептуалізує вирішення проблеми у площині об'єктів реального світу, які легше повторно використовувати у додатку. Наприклад, Chair(стілець), Fan(вентилятор), Dog(Собака),Computer(комп'ютер) тощо. В JAVA клас є макет, шаблон або прототип, який визначає загальну поведінку об'єкта даного типу. Примірник - це окрема реалізація класу, і всі екземпляри класу мають однакові властивості, які описані у визначенні класу. Наприклад, ви можете визначити клас з ім'ям House (будинок) з кількістю кімнат як атрибут і створити екземпляри класу, такі як будинок з двома кімнатами, будинок з трьома кімнатами і так далі. Концепції об'єктно-орієнтованого програмування JAVA-1Переваги: ​​Нижче наведено деякі плюси об'єктно-орієнтованої розробки програмного забезпечення (ПЗ).
  • Зниження витрат за підтримку ПЗ, в основному за рахунок того, що вона здійснюється модульно.
  • Удосконалене повторне використання коду завдяки таким якостям, як успадкування, і, як результат, швидше розробка ПЗ.
  • Підвищена надійність та гнучкість коду.
  • Легкість розуміння внаслідок моделювання реального світу.
  • Найкраща абстракція на рівні об'єкта.
  • Зменшення складності переходу від однієї фази розробки до іншої.
Є чотири основні характеристики ООП:
  • Інкапсуляція
  • успадкування
  • Поліморфізм
  • Абстракція

Інкапсуляція

Інкапсуляція виступає договором для об'єкта, що він повинен приховати, а відкрити для доступу іншими об'єктами. У JAVA ми використовуємо модифікатор доступу privateдля того, щоб приховати метод та обмежити доступ до змінної із зовнішнього світу. JAVA також має різні модифікатори доступу: public, за замовчуванням, protected, private, які використовуються для обмеження видимості на різних рівнях. Але кінцевою метою є інкапсуляція тих речей, які повинні бути змінені. Найкраще працює підхід, у якому, у класу має лише одна причина зміни, і інкапсулювання втілює у реальність проектування цієї “однієї причини”. Правильним в інкапсуляції вважається приховування речей, що часто змінюються, щоб уникнути пошкодження інших класів. Переваги: Нижче наведено деякі переваги інкапсуляції:
  • Ми можемо захистити внутрішній стан об'єкта за допомогою приховування його атрибутів.
  • Це покращує модульну побудову коду, оскільки запобігає взаємодії об'єктів несподіваними способами.
  • Підвищується практичність коду.
  • Це підтримує договірні відносини конкретного об'єкта.
  • Інкапсуляція полегшує підтримку програмного забезпечення.
  • Зміни в коді можуть проводитись незалежно один від одного.

Поліморфізм

Поліморфізм у програмуванні — це здатність надавати той самий інтерфейс для різних базових форм (типів даних). Це означає, що класи, що мають різну функціональність, спільно використовують той самий інтерфейс і можуть бути динамічно викликані передачею параметрів за посиланням. Класичний приклад - це клас Shape(фігура) і всі класи, що успадковуються від нього: square(квадрат), circle(коло), dodecahedron(додекаедр), irregular polygon(неправильний багатокутник), splat(ляпка) і так далі. У цьому прикладі кожен клас матиме власний метод Draw()і клієнтський код може просто робити:
Shape shape = new Shape();
Shape.area()Щоб отримати коректну поведінку будь-якої фігури Краса поліморфізму полягає в тому, що код, працюючи з різними класами, не повинен знати, який клас він використовує, тому що всі вони працюють за одним принципом. Процес, застосовуваний об'єктно-ориентированными мовами програмування реалізації динамічного поліморфізму, називається динамічним зв'язуванням. Примітка: Поліморфізм – це здатність вибирати більш конкретні методи виконання залежно від об'єкта. Поліморфізм здійснюється тоді, коли задіяні абстракні класи. Переваги:
  • Створення повторно використовуваного коду. Тобто, як тільки клас створений, реалізований і протестований, може вільно використовуватися без турботи у тому, що у ньому написано.
  • Це забезпечує більш універсальний і слабопов'язаний код.
  • Знижується час компіляції, що прискорює розробку.
  • Динамічний зв'язування.
  • Один і той же інтерфейс може бути використаний для створення методів із різними реалізаціями.
  • Вся реалізація може бути замінена за допомогою використання однакових методів сигнатури.
Перевизначення методів як частину поліморфізму. Перевизначення взаємодіє з двома методами: методом батьківського класу та методом похідного класу. Ці методи мають поодинокі ім'я та сигнатури. Перевизначення дозволяє вам робити ту саму операцію різними шляхами для різних типів об'єктів. Наприклад:
while(it.hasNext()) {
Shape s = (Shape) it.next();
totalArea += s.area(dim); //будет применен полиморфизм и вызван нужный метод для каждого об'єкта.
}
Концепції об'єктно-орієнтованого програмування JAVA-2Перезавантаження методів або ad-hoc поліморфізм або статичний поліморфізм Перезавантаження взаємодіє з кількома методами одного класу, які однаково названі, але мають різні методи сигнатури. Перезавантаження дозволяє вам описати ту саму операцію різними шляхами для різних даних. Іноді її називають статичним поліморфізмом, але фактично поліморфізм вона не є. Це ніщо інше як просто наявність двох методів з однаковими іменами, але різним списком аргументів. Перезавантаження немає нічого спільного з наслідуванням і поліморфізмом. І перезавантажений метод зовсім не те саме, що перевизначений метод. Параметричний поліморфізм через узагальнення у JAVA При оголошенні класу поле імені може асоціюватися з різними типами, а ім'я методу може асоціюватися з різними параметрами та типами, що повертаються. JAVA підтримує параметричний поліморфізм, застосовуючи узагальнення (дженерики).
List<String> list = new ArrayList<String>();
Чому ми не можемо перевизначити статичний метод у JAVA? Перевизначення залежить від наявності екземпляра класу. Ідея поліморфізму полягає в тому, що ви можете створити підклас, і об'єкти, що реалізуються тими підкласами, поводитимуться по-іншому з тими самими методами батьківського класу (перевизначеними в підкласах). Статичний метод не асоціюється до жодних екземплярів класу, таким чином, сама концепція перевизначення не може бути застосована. Творцями JAVA керували дві міркування, які вплинули такий підхід. По-перше, це проблеми виконання коду: лилося дуже багато критики на адресау Smalltalk через повільну роботу (збирач сміття та поліморфізм були частиною цієї проблеми), і в проектуванні JAVA намагалися цього уникнути. Другим міркуванням було рішення, що цільовою аудиторією JAVA стануть С++ розробники. Те, що статичні методи працюють саме таким чином, було дуже знайоме C++ програмістам, а також прискорювало роботу, оскільки не було необхідності проходити вгору по ієрархії класів, щоб з'ясувати, який метод викликати. Ви йдете прямо до класу та викликаєте конкретний метод.

успадкування

Спадкування - це включення поведінки (тобто методів) і стану (тобто змінних) базового класу до похідного класу, таким чином вони стають доступними в цьому похідному класі. Головна перевага успадкування в тому, що воно забезпечує формальний механізм повторного використання коду та уникає дублювання. Успадкований клас розширює функціональність програми завдяки копіюванню поведінки батьківського класу та додавання нових функцій. Це робить код дуже пов'язаним. Якщо ви захочете змінити суперклас, вам доведеться знати всі деталі підкласів, щоб не зруйнувати код. Спадкування — це форма повторного використання програмного забезпечення, коли з вже існуючого класу (суперкласу) створюється новий клас (підклас), який розширює свою функціональність і використовує деякі властивості суперкласу. Переваги:
  • Удосконалене повторне використання коду.
  • Встановлюється логічне ставлення «is a» (є кимось, чимось). Наприклад: Dog is a n animal . (Собака є твариною).
  • Модуляризація коду.
  • Виключаються повторення.
Недолік:
  • Сильна пов'язаність: підклас залежить від батьківського класу, що робить код сильно пов'язаним.

Абстракція

Абстракція означає розробку класів виходячи з їх інтерфейсів та функціональності, не беручи до уваги реалізацію деталей. Абстрактний клас є інтерфейси без включення фактичної реалізації. Він відрізняє реалізацію об'єкта з його поведінки. Абстракція полегшує код, приховуючи несуттєві деталі. Переваги:
  • Застосовуючи абстракцію, ми можемо відокремити те, що може бути згруповано за будь-яким типом.
  • Часто змінювані властивості та методи можуть бути згруповані в окремий тип, таким чином основний тип не буде змінюватися. Це посилює принцип ОВП: «Код має бути відкритим для Розширення, але закритим для Змін» .
  • Абстракція полегшує представлення доменних моделей.
Відмінність між абстракцією та інкапсуляцією Інкапсуляція – це стратегія, яка використовується як частина абстракції. Інкапсуляція відноситься до структури об'єкта: об'єкти інкапсулюють свої властивості та приховують їх від доступу ззовні. Користувачі класу взаємодіють із ним з допомогою його методів, але мають доступу безпосередньо до структури класу. Отже клас абстрагує деталі реалізації, які стосуються його будову. Абстракція є загальнішим терміном. Вона також може досягатись серед іншого за допомогою підкласів. Наприклад, клас List(список) у стандартній бібліотеці є абстракцією для послідовності елементів, проіндексованих відповідно до їх місця у списку. Конкретними прикладами списку Listє ArrayListабо LinkedList. Код, який взаємодіє зі спискомListабстрагується від деталей, який саме список він використовує. Часто абстракція неможлива без приховування основного стану за допомогою інкапсуляції. Якщо клас розкриває свою внутрішню структуру, він може змінити свої внутрішні операції, отже, неспроможна абстрагуватися. Що таке абстрактний клас та абстрактний метод? Трапляється, що під час розробки ви хочете, щоб базовий клас представляв лише інтерфейс для його похідних класів. Тобто ви не хочете, щоб будь-хто створював екземпляри базового класу. Вам необхідно використовувати інтерфейс таким чином, щоб тільки приводити до нього об'єкти (це неявне приведення, яке забезпечує поліморфну ​​поведінку). Це досягається шляхом створення даного класу абстрактним за допомогою ключового словаabstract. Це накладає деякі обмеження, такі як неможливість створювати екземпляри абстрактного класу, під час використання абстрактного класу необхідно реалізовувати абстрактні методи. Цим забезпечується поліморфізм. Абстрактний клас може містити і абстрактні та конкретні методи. Якщо хоч один метод у класі оголошений абстрактним, весь клас має бути оголошений абстрактним. Тим не менш, у зворотний бік правило не повинно дотримуватися. Якщо клас оголошений абстрактним, може і містити абстрактні методи. Метод, який лише визначає свої сигнатури і не забезпечує реалізацію, називається абстрактним. Фактична його реалізація залишена його підкласами, які розширюють абстрактний клас. Абстрактний метод може бути використаний об'єктом, лише інший клас може його розширити. Коли потрібно використовувати абстрактний клас? Абстрактні класи дозволяють визначити певну поведінку за замовчуванням і змусити підкласи забезпечити будь-яку конкретну поведінку. Наприклад: List(список) є інтерфейсом, у свою чергу AbstractListвизначає основну поведінку Списку, яке може бути використане як є або уточнено в підкласі, наприклад, ArrayList(списковий масив). Що таке інтерфейс? У концепції інтерфейсу лежить абстрактний клас, але інтерфейс (визначається ключовим словомinterface) ступив далі. Він запобігає взагалі будь-якій реалізації методу або функції. Ви можете лише оголошувати метод або функцію, але не забезпечувати їхню реалізацію. Клас, який реалізує даний інтерфейс, повинен таки подбати про фактичну реалізацію. Інтерфейси дуже корисні та повсюдно використовуються в ОВП. Так як вони поділяють сам інтерфейс та реалізацію, вони надають багато переваг свого використання:
  1. Множинне успадкування .
  2. Слабка пов'язаність . Відбувається абстракція операції, така як поділ на рівні, а конкретною реалізацією може бути будь-що: JDBC, JPA, JTA і т.д.
  3. Програма-інтерфейс не реалізується .
  4. Поліморфізм з динамічним зв'язуванням : розкривається програмний інтерфейс об'єкта без розкриття його фактичної реалізації.
  5. Абстрактні рівні , поділ функціональностей.
Різниця між інтерфейсом та абстрактним класом.
  • Інтерфейс - це договірні відносини з класами, які цей інтерфейс реалізують, про те, що реалізація відбувається шляхом позначеного інтерфейсом. Це порожня оболонка із оголошеними методами.
  • Абстрактний клас визначає деяку загальну поведінку та просить свої підкласи визначити нетипову чи конкретну поведінку для свого класу.
  • Способи та члени абстрактного класу може бути позначені будь-яким модифікатором доступу, своєю чергою всі способи інтерфейсу мали бути зацікавленими відкритими (public).
  • Коли відбувається успадкування абстрактного класу, клас-спадкоємець повинен визначити абстрактні методи, тоді як інтерфейс може успадковувати інший інтерфейс і навіть не обов'язково визначати його методи.
  • Клас-спадкоємець може розширювати лише один абстрактний клас, а інтерфейс може розширювати або клас може реалізовувати безліч інших інтерфейсів.
  • Клас-спадкоємець може визначати абстрактні методи з тим же менш обмеженим модифікатором доступу, при цьому клас, що реалізує інтерфейс, повинен визначати методи з тим же рівнем видимості.
  • Інтерфейс не містить конструктори, у той час як вони є в абстрактному класі.
  • Змінні, оголошені в інтерфейсі Java за замовчуванням є final. Анотація клас може містити змінні, які не є final.
  • Всі учасники Java-інтерфейсу за промовчанням є public. Учасники абстрактного класу можуть дозволити собі бути public, protectedта ін.

Композиція

Повторне використання коду може бути досягнуто за допомогою успадкування, так і композиції. Але при цьому задіяння композиції забезпечує більш високий рівень інкапсуляції, ніж успадкування, тому що зміни в класі back-end не обов'язково торкнуться код, який відноситься до front-end класу. Композиція - це техніка проектування, що застосовує у класах відносини типу "has-a" (має, включає в себе). Для повторного використання коду можуть застосовуватися як успадкування java, так і композиція об'єкта. Суть композиції полягає у вираженні відносини "has a" між об'єктами. Подумайте про стільці. У стільця є (has a) сидіння. У випорожнення є (has a) спинка. У випорожнення є (has a) певна кількість ніжок. Фраза ”has a” / “є” передбачає відносини, у яких стілець має чи, як мінімум, використовує інший об'єкт. Переваги:
  • Контроль видимості
  • Реалізація може бути замінена під час виконання (run-time)
  • Слабка пов'язаність, оскільки клас-інтерфейс залежить від реалізації.
Відмінності між композицією та успадкуванням
Композиція (has a / має) Спадкування (is a / є)
1 Підтримує поліморфізм та повторне використання коду. Підтримує поліморфізм та повторне використання коду.
2 Об'єкт під час виконання (run-time) вже створено. Об'єкт створюється динамічно під час компіляції.
3 Реалізація може бути замінена під час виконання (run-time). Реалізація може бути замінена під час компіляції.
4 Підклас залежить від класу-батька, що сприяє слабкому зв'язування (особливо під керівництвом інтерфейсу). Підклас є завізистом від реалізації класу-батька, тому зв'язування вважається сильним.
5 Використання: у Будинку є Ванна кімната. Неправильно говорити, що Будинок – це Ванна кімната. Спадкування є односпрямованим: Будинок – це Будівля. Але будівля не є домівкою.
Примітка: Не використовуйте успадкування лише для того, щоб забезпечити повторне використання коду. Якщо немає відношень “is a“ (є), для цих цілей використовується композиція. Різниця між композицією та агрегацією у відносинах об'єктів. Агрегація — це взаємозв'язок, коли один клас вписується в колекцію. Це частина цілого відношення, де частина може бути без цілого. Такі відносини набагато слабші. Немає циклічної залежності. Наприклад: замовлення та продукт. Композиція— це взаємозв'язок, коли один клас вписується в колекцію. Це частина цілого відношення, коли частина не може існувати без цілого. Якщо ціле знищується, всі його складові також будуть знищені. Це сильніші стосунки. Наприклад: багатокутник та його вершини, замовлення та його компонент.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ