Zusammenfassung: Objektorientierte Prinzipien in Java
OO-Prinzipien
Die objektorientierte Programmierung (OOP) basiert auf vier grundlegenden Prinzipien:
- Abstraktion: Verbergen der komplexen Implementierung und Bereitstellung einer einfachen Schnittstelle.
- Kapselung: Das Verstecken der inneren Zustände eines Objekts und das Bereitstellen von Methoden, um darauf zuzugreifen oder diese zu ändern.
- Vererbung: Ermöglicht es einer Klasse, Eigenschaften und Methoden einer anderen Klasse zu übernehmen.
- Polymorphismus: Ermöglicht es, dass Objekte unterschiedliche Formen annehmen können, was zu flexiblerem Code führt.
Vererbung
Vererbung ist ein Mechanismus, bei dem eine Klasse (Unterklasse) die Eigenschaften und Methoden einer anderen Klasse (Oberklasse) erbt. In Java wird die Vererbung mit dem Schlüsselwort extends
implementiert.
1
2
3
4
5
6
7
8
9
10
11
class Animal {
void eat() {
System.out.println("Eating...");
}
}
class Dog extends Animal {
void bark() {
System.out.println("Barking...");
}
}
Vorteile:
- Code-Wiederverwendung.
- Hierarchie der Klassen.
Einschränkungen:
- Eine Klasse kann nur von einer anderen Klasse erben (Einzelvererbung).
Polymorphismus
Polymorphismus bedeutet, dass ein Objekt viele Formen annehmen kann. In Java gibt es zwei Hauptarten von Polymorphismus:
- Methodenüberladung (Compile-Time Polymorphism): Mehrere Methoden mit dem gleichen Namen, aber unterschiedlichen Parametern.
- Methodenüberschreibung (Run-Time Polymorphism): Eine Methode der Unterklasse überschreibt eine Methode der Oberklasse.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Animal {
void sound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Bark");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
animal.sound(); // Ausgabe: Bark
}
}
Vorteile:
- Erhöhte Flexibilität und Erweiterbarkeit.
Design Patterns
Design Patterns sind wiederverwendbare Lösungen für häufig auftretende Probleme in der Softwareentwicklung. In Java gibt es viele gängige Muster, hier einige Beispiele:
Singleton: Stellt sicher, dass eine Klasse nur eine Instanz hat und global darauf zugegriffen werden kann.
1 2 3 4 5 6 7 8 9 10 11 12
public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
Factory Pattern: Stellt eine Methode zur Verfügung, um Objekte zu erstellen, ohne die genaue Klasse des Objekts zu spezifizieren.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
interface Animal { void sound(); } class Dog implements Animal { public void sound() { System.out.println("Bark"); } } class AnimalFactory { public Animal getAnimal(String type) { if (type.equals("Dog")) { return new Dog(); } return null; } }
Observer Pattern: Ermöglicht es, dass ein Objekt (Subject) eine Liste von Beobachtern (Observers) hat, die benachrichtigt werden, wenn sich der Zustand des Objekts ändert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
interface Observer { void update(String message); } class ConcreteObserver implements Observer { @Override public void update(String message) { System.out.println("Received: " + message); } } class Subject { private List<Observer> observers = new ArrayList<>(); public void addObserver(Observer observer) { observers.add(observer); } public void notifyObservers(String message) { for (Observer observer : observers) { observer.update(message); } } }
Fazit: OOP, mit Vererbung und Polymorphismus, und Design Patterns bieten robuste Konzepte, die den Code modular, wartbar und erweiterbar machen.