logo

Абстракція в Java

Абстракція в Java це процес, у якому ми показуємо користувачеві лише основні деталі/функції. Несуттєві деталі впровадження не відображаються користувачеві.

У цій статті ми дізнаємося про абстракцію та про те, що таке абстракція.

Простий приклад для розуміння абстракції:

Пульт дистанційного керування телевізором є відмінним приклад абстракції . Це спрощує взаємодію з телевізором, приховуючи складність за простими кнопками та символами, що робить її легкою без необхідності розуміти технічні деталі функціонування телевізора.



Що таке абстракція в Java?

У Java абстракція досягається за допомогою інтерфейси і абстрактні класи . Ми можемо досягти 100% абстракції за допомогою інтерфейсів.

Абстракцію даних також можна визначити як процес ідентифікації лише необхідних характеристик об’єкта, ігноруючи нерелевантні деталі. Властивості та поведінка об’єкта відрізняють його від інших об’єктів подібного типу, а також допомагають у класифікації/групуванні об’єктів.

Реальний приклад абстракції:

Розглянемо реальний приклад чоловіка за кермом автомобіля. Людина знає тільки те, що натискання на акселератор збільшить швидкість автомобіля або застосування гальм зупинить машину, але він не знає, як при натисканні на акселератор швидкість насправді збільшується, він не знає про внутрішній механізм автомобіля або застосування акселератора, гальм тощо в автомобілі. Ось що таке абстракція.

Класи Java Abstract і методи Java Abstract

  1. Абстрактний клас — це клас, який оголошується за допомогою ключового слова abstract.
  2. Абстрактний метод — це метод, який оголошується без реалізації.
  3. Абстрактний клас може мати або не мати всіх абстрактних методів. Деякі з них можуть бути конкретними методами
  4. Анотацію, визначену методом, завжди потрібно перевизначати в підкласі, таким чином створюючи переважний обов'язкове або робить сам підклас абстрактним.
  5. Будь-який клас, який містить один або більше абстрактних методів, також повинен бути оголошений за допомогою ключового слова abstract.
  6. Не може бути об’єкта абстрактного класу. Тобто абстрактний клас не може бути безпосередньо створений за допомогою новий оператор .
  7. Абстрактний клас може мати параметризовані конструктори, і конструктор за замовчуванням завжди присутній в абстрактному класі.

Алгоритм реалізації абстракції в Java

  1. Визначте класи або інтерфейси, які будуть частиною абстракції.
  2. Створіть абстрактний клас або інтерфейс, який визначає спільну поведінку та властивості цих класів.
  3. Визначте абстрактні методи в абстрактному класі або інтерфейсі, які не мають жодних деталей реалізації.
  4. Реалізувати конкретні класи, які розширюють абстрактний клас або реалізовувати інтерфейс.
  5. Перевизначте абстрактні методи в конкретних класах, щоб забезпечити їх конкретні реалізації.
  6. Використовуйте конкретні класи для реалізації логіки програми.

Коли використовувати абстрактні класи та абстрактні методи?

Бувають ситуації, коли ми хочемо визначити суперклас, який оголошує структуру даної абстракції, не забезпечуючи повну реалізацію кожного методу. Іноді ми хочемо створити суперклас, який визначає лише форму узагальнення, яка буде спільною для всіх його підкласів, залишаючи кожному підкласу заповнення деталей.

Розглянемо приклад класичної форми, яка, можливо, використовується в системі автоматизованого проектування або ігровому моделюванні. Основним типом є форма, і кожна фігура має колір, розмір тощо. Звідси походять (успадковуються) певні типи фігур — коло, квадрат, трикутник тощо — кожна з яких може мати додаткові характеристики та поведінку. Наприклад, певні фігури можна перевертати. Деякі дії можуть відрізнятися, наприклад, коли ви хочете обчислити площу фігури. Ієрархія типів втілює як схожість, так і відмінності між формами.

Абстрактний клас на Java

Приклад абстракції Java

Приклад 1:

Java


динамічний масив java



// Java program to illustrate the> // concept of Abstraction> abstract> class> Shape {> >String color;> > >// these are abstract methods> >abstract> double> area();> >public> abstract> String toString();> > >// abstract class can have the constructor> >public> Shape(String color)> >{> >System.out.println(>'Shape constructor called'>);> >this>.color = color;> >}> > >// this is a concrete method> >public> String getColor() {>return> color; }> }> class> Circle>extends> Shape {> >double> radius;> > >public> Circle(String color,>double> radius)> >{> > >// calling Shape constructor> >super>(color);> >System.out.println(>'Circle constructor called'>);> >this>.radius = radius;> >}> > >@Override> double> area()> >{> >return> Math.PI * Math.pow(radius,>2>);> >}> > >@Override> public> String toString()> >{> >return> 'Circle color is '> +>super>.getColor()> >+>'and area is : '> + area();> >}> }> class> Rectangle>extends> Shape {> > >double> length;> >double> width;> > >public> Rectangle(String color,>double> length,> >double> width)> >{> >// calling Shape constructor> >super>(color);> >System.out.println(>'Rectangle constructor called'>);> >this>.length = length;> >this>.width = width;> >}> > >@Override> double> area() {>return> length * width; }> > >@Override> public> String toString()> >{> >return> 'Rectangle color is '> +>super>.getColor()> >+>'and area is : '> + area();> >}> }> public> class> Test {> >public> static> void> main(String[] args)> >{> >Shape s1 =>new> Circle(>'Red'>,>2.2>);> >Shape s2 =>new> Rectangle(>'Yellow'>,>2>,>4>);> > >System.out.println(s1.toString());> >System.out.println(s2.toString());> >}> }>

>

список шрифтів у gimp
>

Вихід

Shape constructor called Circle constructor called Shape constructor called Rectangle constructor called Circle color is Redand area is : 15.205308443374602 Rectangle color is Yellowand area is : 8.0>

приклад 2:

Java




// Java Program to implement> // Java Abstraction> > // Abstract Class declared> abstract> class> Animal {> >private> String name;> > >public> Animal(String name) {>this>.name = name; }> > >public> abstract> void> makeSound();> > >public> String getName() {>return> name; }> }> > // Abstracted class> class> Dog>extends> Animal {> >public> Dog(String name) {>super>(name); }> > >public> void> makeSound()> >{> >System.out.println(getName() +>' barks'>);> >}> }> > // Abstracted class> class> Cat>extends> Animal {> >public> Cat(String name) {>super>(name); }> > >public> void> makeSound()> >{> >System.out.println(getName() +>' meows'>);> >}> }> > // Driver Class> public> class> AbstractionExample {> >// Main Function> >public> static> void> main(String[] args)> >{> >Animal myDog =>new> Dog(>'Buddy'>);> >Animal myCat =>new> Cat(>'Fluffy'>);> > >myDog.makeSound();> >myCat.makeSound();> >}> }>

>

>

Вихід

Buddy barks Fluffy meows>

Пояснення наведеної вище програми Java:

Цей код визначає абстрактний клас Animal з абстрактним методом makeSound(). Класи Dog and Cat розширюють Animal і реалізують метод makeSound(). Метод main() створює екземпляри Dog and Cat і викликає для них метод makeSound().

Це демонструє концепцію абстракції в Java, де ми визначаємо шаблон для класу (у цьому випадку Animal), але залишаємо реалізацію певних методів, які визначаються підкласами (у цьому випадку makeSound()).

Інтерфейс

Інтерфейси — ще один метод реалізації абстракції в Java. Ключова відмінність полягає в тому, що за допомогою інтерфейсів ми можемо досягти 100% абстракції в класах Java. У Java чи будь-якій іншій мові інтерфейси включають як методи, так і змінні, але не мають тіла методу. Окрім абстракції, інтерфейси також можна використовувати для реалізації інтерфейсів у Java.

Реалізація: Щоб реалізувати ан інтерфейс ми використовуємо ключове слово реалізує з кл.

Java


рідхіма тіварі



// Define an interface named Shape> interface> Shape {> >double> calculateArea();>// Abstract method for> >// calculating the area> }> > // Implement the interface in a class named Circle> class> Circle>implements> Shape {> >private> double> radius;> > >// Constructor for Circle> >public> Circle(>double> radius) {>this>.radius = radius; }> > >// Implementing the abstract method from the Shape> >// interface> >public> double> calculateArea()> >{> >return> Math.PI * radius * radius;> >}> }> > // Implement the interface in a class named Rectangle> class> Rectangle>implements> Shape {> >private> double> length;> >private> double> width;> > >// Constructor for Rectangle> >public> Rectangle(>double> length,>double> width)> >{> >this>.length = length;> >this>.width = width;> >}> > >// Implementing the abstract method from the Shape> >// interface> >public> double> calculateArea() {>return> length * width; }> }> > // Main class to test the program> public> class> Main {> >public> static> void> main(String[] args)> >{> >// Creating instances of Circle and Rectangle> >Circle myCircle =>new> Circle(>5.0>);> >Rectangle myRectangle =>new> Rectangle(>4.0>,>6.0>);> > >// Calculating and printing the areas> >System.out.println(>'Area of Circle: '> >+ myCircle.calculateArea());> >System.out.println(>'Area of Rectangle: '> >+ myRectangle.calculateArea());> >}> }>

сортування java arraylist
>

>

Вихід

Area of Circle: 78.53981633974483 Area of Rectangle: 24.0>

Переваги абстракції

Ось деякі переваги абстракції:

  1. Це зменшує складність перегляду речей.
  2. Уникає дублювання коду та підвищує можливість повторного використання.
  3. Допомагає підвищити безпеку програми чи програми, оскільки користувачеві надаються лише важливі відомості.
  4. Це покращує підтримку програми.
  5. Це покращує модульність програми.
  6. Удосконалення стане дуже простим, оскільки ми зможемо вносити будь-які зміни у внутрішній системі, не впливаючи на кінцевих користувачів.
  7. Покращує можливість багаторазового використання та обслуговування коду.
  8. Приховує деталі реалізації та показує лише релевантну інформацію.
  9. Забезпечує зрозумілий і простий інтерфейс для користувача.
  10. Підвищує безпеку, запобігаючи доступ до деталей внутрішнього класу.
  11. Підтримує модульність, оскільки складні системи можна розділити на менші та більш керовані частини.
  12. Абстракція надає спосіб приховати складність деталей реалізації від користувача, полегшуючи розуміння та використання.
  13. Абстракція забезпечує гнучкість реалізації програми, оскільки можна вносити зміни до базових деталей реалізації, не впливаючи на інтерфейс користувача.
  14. Абстракція забезпечує модульність і відокремлення проблем, що робить код більш зручним для обслуговування та легшим для налагодження.

Недоліки абстракції в Java

Ось основні недоліки абстракції в Java:

  1. Абстракція може ускладнити розуміння того, як працює система.
  2. Це може призвести до збільшення складності, особливо якщо не використовується належним чином.
  3. Це може обмежити гнучкість реалізації.
  4. Абстракція може додати коду непотрібної складності, якщо її не використовувати належним чином, що призведе до збільшення часу та зусиль на розробку.
  5. Абстракція може ускладнити налагодження та розуміння коду, особливо для тих, хто не знайомий із рівнями абстракції та деталями реалізації.
  6. Надмірне використання абстракції може призвести до зниження продуктивності через додаткові рівні коду та непрямість.

Читайте також:

Абстракція в Java – поширені запитання

Q1. Чому ми використовуємо анотацію?

Однією з ключових причин, чому ми використовуємо абстрактні поняття, є спрощення складності. Уявіть собі спробу пояснити весь Всесвіт з кожним окремим атомом і зіркою! Анотації дозволяють зменшити масштаб, захопити основні ідеї, такі як сила тяжіння та енергія, і зрозуміти все це, не гублячись у деталях.

Ось деякі інші причини, чому ми використовуємо абстрактні в Java:

1. Абстракція : Абстрактні класи використовуються для визначення загального шаблону для інших класів. Вони визначають набір правил і вказівок, яких повинні дотримуватися їхні підкласи. Надаючи абстрактний клас, ми можемо гарантувати, що класи, які його розширюють, мають послідовну структуру та поведінку. Це робить код більш організованим і його простіше підтримувати.

2. Поліморфізм : абстрактні класи та методи забезпечують поліморфізм у Java. Поліморфізм - це здатність об'єкта набувати багатьох форм. Це означає, що змінна абстрактного типу може містити об’єкти будь-якого конкретного підкласу цього абстрактного класу. Це робить код більш гнучким і адаптованим до різних ситуацій.

3. Фреймворки та API: Java має численні фреймворки та API, які використовують абстрактні класи. Використовуючи абстрактні класи, розробники можуть заощадити час і зусилля, створюючи існуючий код і зосереджуючись на аспектах, характерних для їхніх програм.

Q2. Яка різниця між Інкапсуляція та абстракція даних?

Ось деякі ключові відмінності між ч/б інкапсуляцією та абстракцією:

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

Абстракція

Інкапсуляція - це приховування даних (приховування інформації) Абстракція - це приховування деталей (приховування реалізації).
Інкапсуляція об’єднує дані та методи, які діють на них Абстракція даних відкриває користувачеві інтерфейс і приховує деталі реалізації
Інкапсульовані класи — це класи Java, які слідують приховуванню й абстракції даних Реалізація абстракції здійснюється за допомогою абстрактних класів та інтерфейсу
Інкапсуляція — це процедура, яка відбувається на рівні реалізації абстракція – це процес на рівні проектування

Q3. Що таке реальний приклад абстракції даних?

Пульт дистанційного керування телевізором є чудовим реальним прикладом абстракції. Це спрощує взаємодію з телевізором, приховуючи складність за простими кнопками та символами, що робить її легкою без необхідності розуміти технічні деталі функціонування телевізора.

Q4. Яка різниця між абстрактними класами та інтерфейсами в Java?

Ось деякі ключові відмінності між абстрактними класами та інтерфейсами в Java:

Абстрактний клас

хешування в структурі даних

Інтерфейси

Абстрактні класи підтримують абстрактні та неабстрактні методи Інтерфейс підтримує лише абстрактні методи.
Не підтримує множинне успадкування Підтримує множинне успадкування
Абстрактні класи можуть бути розширені за допомогою класів Java і кількох інтерфейсів Інтерфейс можна розширити лише інтерфейсом Java.
Члени абстрактного класу в Java можуть бути приватними, захищеними тощо. За замовчуванням інтерфейси загальнодоступні.

приклад:

публічний абстрактний клас Vechicle{
public abstract void drive()
}

приклад:

публічний інтерфейс Animal{
void speak();
}