# Jaka jest różnica między interfejsem a klasą abstrakcyjną?
## Wprowadzenie
W dziedzinie programowania obiektowego, szczególnie w języku Java, często spotykamy się z pojęciami interfejsu i klasy abstrakcyjnej. Choć oba te koncepty mają na celu organizację kodu i zapewnienie elastyczności, istnieją pewne istotne różnice między nimi. W tym artykule przyjrzymy się bliżej tym dwóm pojęciom i wyjaśnimy, czym się różnią.
## Interfejs
### Definicja
Interfejs jest to konstrukcja językowa, która umożliwia deklarację zestawu metod, które klasa musi zaimplementować. Interfejsy w Javie są zadeklarowane za pomocą słowa kluczowego **interface**. Interfejsy mogą zawierać tylko deklaracje metod, ale nie mogą zawierać implementacji tych metod.
### Cechy interfejsu
1. **Abstrakcyjność**: Interfejsy są abstrakcyjne, co oznacza, że nie można tworzyć ich instancji. Służą one jedynie jako szablony dla klas, które je implementują.
2. **Wielokrotne dziedziczenie**: Klasa może implementować wiele interfejsów jednocześnie, co umożliwia wielokrotne dziedziczenie metod.
3. **Kontrakt**: Interfejsy definiują kontrakt, który musi być spełniony przez klasy implementujące. Oznacza to, że klasy muszą dostarczyć implementację wszystkich metod zadeklarowanych w interfejsie.
4. **Polimorfizm**: Interfejsy umożliwiają polimorfizm, co oznacza, że można używać różnych klas implementujących ten sam interfejs w sposób jednolity.
### Przykład użycia interfejsu
„`java
public interface Zwierze {
void dajGlos();
void poruszajSie();
}
public class Pies implements Zwierze {
@Override
public void dajGlos() {
System.out.println(„Hau hau!”);
}
@Override
public void poruszajSie() {
System.out.println(„Biegam na czterech łapach.”);
}
}
public class Kot implements Zwierze {
@Override
public void dajGlos() {
System.out.println(„Miau miau!”);
}
@Override
public void poruszajSie() {
System.out.println(„Chodzę na czterech łapach.”);
}
}
„`
W powyższym przykładzie mamy interfejs o nazwie „Zwierze”, który deklaruje dwie metody: „dajGlos()” i „poruszajSie()”. Klasy „Pies” i „Kot” implementują ten interfejs i dostarczają implementacje tych metod. Dzięki temu możemy traktować obiekty typu „Pies” i „Kot” jako obiekty typu „Zwierze” i wywoływać na nich te same metody.
## Klasa abstrakcyjna
### Definicja
Klasa abstrakcyjna jest to klasa, która może zawierać zarówno deklaracje metod, jak i ich implementacje. Klasa abstrakcyjna w Javie jest zadeklarowana za pomocą słowa kluczowego **abstract**. Klasa abstrakcyjna może zawierać zarówno metody abstrakcyjne, które nie mają implementacji, jak i metody z implementacją.
### Cechy klasy abstrakcyjnej
1. **Abstrakcyjność**: Klasy abstrakcyjne są również abstrakcyjne, co oznacza, że nie można tworzyć ich instancji. Służą one jako szablony dla klas dziedziczących.
2. **Dziedziczenie**: Klasy abstrakcyjne mogą być dziedziczone przez inne klasy. Klasy dziedziczące muszą dostarczyć implementację wszystkich metod abstrakcyjnych z klasy abstrakcyjnej.
3. **Implementacja metod**: Klasy abstrakcyjne mogą zawierać zarówno metody abstrakcyjne, jak i metody z implementacją. Metody z implementacją mogą być wywoływane bezpośrednio z klasy dziedziczącej.
### Przykład użycia klasy abstrakcyjnej
„`java
public abstract class Figura {
protected String kolor;
public Figura(String kolor) {
this.kolor = kolor;
}
public abstract double obliczPole();
public void wyswietlKolor() {
System.out.println(„Kolor figury: ” + kolor);
}
}
public class Kwadrat extends Figura {
private double bok;
public Kwadrat(String kolor, double bok) {
super(kolor);
this.bok = bok;
}
@Override
public double obliczPole() {
return bok * bok;
}
}
public class Kolo extends Figura {
private double promien;
public Kolo(String kolor, double promien) {
super(kolor);
this.promien = promien;
}
@Override
public double obliczPole() {
return Math.PI * promien * promien;
}
}
„`
W powyższym przykładzie mamy klasę abstrakcyjną o nazwie „Figura”, która zawiera pole „kolor” oraz deklarację metody abstrakcyjnej „obliczPole()”. Klasa „Figura” zawiera również metodę z implementacją „wyswietlKolor()”. Klasy „Kwadrat” i „Kolo” dziedziczą po klasie „Figura” i dostarczają implementacje metody „obliczPole()”. Dzięki temu
Różnica między interfejsem a klasą abstrakcyjną polega na tym, że interfejs definiuje jedynie sygnatury metod, które klasa implementująca musi zaimplementować, natomiast klasa abstrakcyjna może zawierać zarówno zaimplementowane metody, jak i metody abstrakcyjne.
Link do strony Venture Day: https://ventureday.pl/










