Полиморфизъм - ООП Магия
- Теория
- Код
Абстрактни Класове и Интерфейси, Полиморфизъм в Java 🔮
Java ни предоставя мощни инструменти за абстракция и гъвкаво управление на кода чрез абстрактни класове, интерфейси и полиморфизъм.
Абстрактни Класове
Абстрактният клас в Java е клас, който не може да се инстанцира и често съдържа абстрактни методи - методи без имплементация, които трябва да бъдат дефинирани в наследниците на класа.
Особености на Абстрактните Класове:
- Съдържат един или повече абстрактни методи.
- Могат да съдържат и конкретни методи с имплементация.
- Не могат да бъдат инстанцирани директно.
- Подкласовете трябва да предоставят имплементация на абстрактните методи, освен ако не са също абстрактни.
Пример:
public abstract class Animal {
public abstract void makeSound();
public void breathe() {
System.out.println("I'm breathing.");
}
}
Интерфейси
Интерфейсите дефинират контракт, който класовете могат да имплементират. В Java, интерфейсите са напълно абстрактни и могат да съдържат само абстрактни методи до Java 7, след което в Java 8 се добавят и default методи с имплементация.
Основи на Интерфейсите:
- Всеки метод в интерфейс е
public
иabstract
по подразбиране. - С Java 8, интерфейсите могат да имат и default методи с имплементация.
- Интерфейсите не могат да имат инстанционни променливи.
Пример:
public interface Flyable {
void fly();
default void glide() {
System.out.println("Gliding in the air.");
}
}
Полиморфизъм
Полиморфизмът е концепция, която позволява обектите да бъдат разглеждани чрез интерфейс на суперкласа или интерфейса, който имплементират.
Основи на Полиморфизма:
- Един интерфейс, множество имплементации.
- Обектите могат да бъдат реферирани чрез референция на суперклас или интерфейс.
- Позволява на кода да бъде гъвкав и повторно използваем.
Пример:
public class Bird implements Flyable {
@Override
public void fly() {
System.out.println("Bird is flying.");
}
}
Flyable myBird = new Bird();
myBird.fly(); // Изпълнява метода fly() на Bird, въпреки че референцията е от тип Flyable.
Интересни Факти и Съвети
- Абстрактните класове и интерфейсите не могат да бъдат инстанцирани, но т
е предоставят основа, върху която да се построят конкретни класове.
- Интерфейсите поддържат множествено наследяване, докато класовете в Java - само единично.
- Полиморфизмът улеснява добавянето на нови функционалности, като същевременно се запазва съществуващата функционалност.
АБСТРАКТНИ КЛАСОВЕ
Абстрактните класове са класове, от които не можем да създаваме инстанции (обекти) директно. Те обикновено се използват като базови класове за наследяване.
Пример:
abstract class Фигура {
abstract double площ();
}
class Кръг extends Фигура {
double радиус;
Кръг(double радиус) {
this.радиус = радиус;
}
@Override
double площ() {
return Math.PI * радиус * радиус;
}
}
ИНТЕРФЕЙСИ
Интерфейсите дефинират "договор", който класовете, които ги имплементират, трябва да спазват. Те могат да съдържат методи без тяло (абстрактни методи) и от Java 8 нататък - и default методи.
Пример:
interface Говорещ {
void говори();
default void представиСеКатоГоворещ() {
System.out.println("Аз мога да говоря!");
}
}
class Човек implements Говорещ {
@Override
public void говори() {
System.out.println("Здравей!");
}
}
Обяснение: Интерфейсите са полезни, тъй като позволяват на множество класове да приемат общ набор от поведения. Това улеснява полиморфизма и модуларността в кода.
Интересен факт:
От Java 8 нататък, интерфейсите могат да имат default методи. Това позволява да добавяме нови методи към интерфейсите, без да нарушаваме класовете, които вече ги имплементират.
ПОЛИМОРФИЗЪМ
Полиморфизмът е способността на един обект да бъде третиран като обект от родителския му клас или като обект от някоя от базовите му интерфейсни класове.
Пример:
Фигура мояКръг = new Кръг(5);
System.out.println("Площта на кръга е: " + мояКръг.площ());
Говорещ човек = new Човек();
ч овек.говори();
ЗАДАЧИ:
1. Класове
Задача: Създайте клас Книга
със свойства заглавие
и автор
. Добавете метод прочети()
, който извежда съобщение "Прочитане на [заглавие] от [автор]".
Решение:
class Книга {
String заглавие;
String автор;
Книга(String заглавие, String автор) {
this.заглавие = заглавие;
this.автор = автор;
}
void прочети() {
System.out.println("Прочитане на " + заглавие + " от " + автор);
}
}
2. Абстрактни класове
Задача: Създайте абстрактен клас Животно
с абстрактен метод звук()
. Направете два производни класа Котка
и Куче
, които имплементират абстрактния метод звук()
.
Решение:
abstract class Животно {
abstract void звук();
}
class Котка extends Животно {
@Override
void звук() {
System.out.println("Мяу, мяу!");
}
}
class Куче extends Животно {
@Override
void звук() {
System.out.println("Бау, бау!");
}
}
3. Интерфейси
Задача: Създайте интерфейс Плуващ
с метод плувай()
. Направете клас Риба
, който имплементира този интерфейс.
Решение:
interface Плуващ {
void плувай();
}
class Риба implements Плуващ {
@Override
public void плувай() {
System.out.println("Рибата плува.");
}
}
4. Полиморфизъм
Задача: Използвайте класовете и интерфейсите от предишните задачи, за да демонстрирате полиморфизъм.
Решение:
public class Демо {
public static void main(String[] args) {
Животно мое_животно = new Котка();
мое_животно.звук(); // Извежда "Мяу, мяу!"
Плуващ моята_риба = new Риба();
моята_риба.плувай(); // Извежда "Рибата плува."
}
}