Everything is an Object (Java)
Datum: November 2020
Lesedauer: 4 Minuten
Nach diesem Blogpost verstehst du die Grundlagen der Objektorientierten Programmierung.
OOP
Es gibt verschieden Arten zu programmieren. Der funktionale Ansatz ist eine davon. Dabei schreibt man möglichst viel Code in Funktionen. Dies hat Vorteile. Ein Nachteil ist aber, dass der Code extrem komplex und unübersichtlich werden kann.
Die Objektorientierte Programmierung (Object-oriented programming) löst dieses Problem.
Grundlagen
In der OOP versucht man die Gegebenheiten möglichst realitätsnah umzusetzen.
Klasse
Im Mittelpunkt stehen die Klassen. Eine Klasse ist vergleichbar mit einem Bauplan. Daraus kann dann ein Objekt instanziiert werden.
Objekt
Ein Objekt repräsentiert ein Gegenstand oder Begriff. Es enthält, die in der Klasse definierten, Eigenschaften.
Attribute und Methoden
In Java spricht man von Methoden (Funktionen) und Attributen (Variablen).
Attribut
Dies sind die Eigenschaften eines Objektes. Mit einem Attribut kann man also ein Gegenstand Beschreiben. Beispiel:
Das Objekt Person hat ein Attribut name
.
Methode
Mit Methoden können Operationen durchgeführt werden. Später wird noch genauer beschrieben, wozu sie verwendet werden.
UML
Die Unified Modeling Language ist zur Visualisierung eines Systems. Sie wird in zwei Teilte unterteilt.
Strukturdiagramme
- Klassendiagramm
- Objektdiagramm
- Komponentendiagramm
- Entwicklungsdiagramm
- Paketdiagramm
- Profildiagramm
- Zusammengesetztes Strukturdiagramm
Verhaltensdiagramme
- Sequenzdiagramm
- Anwendungsfall-Diagramm
- Aktivitätsdiagramm
- Zustandsmaschinen-Diagramm
- Sequenzdiagramm
- Kommunikationsdiagramm
- Übersichtsdiagramm der Interaktion
- Zeitdiagramm
In diesem Blogpost wird das Klassen- und Objektdiagramm verwendet.
Beispiel
Ich habe einen Auftrag erhalten, ein Programm zu schreiben. Dafür erhalte ich ein UML Klassendiagramm. Dies Zeigt mir den Namen, die Attribute und die Methoden der Klasse. So sieht das Diagramm aus:
Neben Attribute und Methoden können Klassendiagramme noch folgendes enthalten:
- Sichtbarkeit
- Typ
- Multiplizität
- Vorgabewert
- Eigenschaftswert
Ich gehe nicht weiter auf diese ein, da der Fokus auf der OOP liegen soll. Dieser Abschnitt (opens in a new tab) des Wikipedia-Artikels ist aber empfehlenswert.
Aus diesem Bauplan können nun mehrere Objekte erstellt werden. Alle haben die Attribute name
und alter
. Dies sind die passenden Objektdiagramme:
Klasse Programmieren
public class Person {
private String name;
private int alter;
}
Objekt instanziieren
public class MainProgramm {
public static void main(String[] args) {
Person kwild;
kwild = new Person();
}
}
Vorteile
Vererbung
Ich benötige in meinem Programm zwei Arten von Menschen:
- Verkäufer
- Käufer
So sehen meine Klassendiagramme aus:
Der Verkäufer und der Käufer haben unterschiedliche Aufgaben (Methoden). Es gibt aber auch Überschneidungen bei den Methoden. Beide Personen essen, trinken und schlafen.
Auch bei den Attributen gibt es Gemeinsamkeiten. Beide Personen haben einen Namen, Vornamen und Geburtstag. Hier erkennt man also Redundanzen. Diese können durch die Vererbung entfernt werden.
Man erstellt einen Mensch. Dieser hat alle Attribute und Methoden, die ein Mensch besitzt. Nun können alle Menschen davon erben: Käufer, Verkäufer, Lagerist, Fussballer, Zahnarzt, ...
Datenkapselung
In der OOP kommt das Geheimnisprinzip zum tragen. In einer Klasse wird alles so programmiert, dass die Daten vor dem Zugriff von aussen geschützt werden.
private int kontostand = 1200;
public int getKontostand() {
return kontostand;
}
Das kontostand
Attribut wurde mit private gegen aussen geschützt. Es ist nur durch die getter Methode erreichbar, da diese auf public gesetzt wurde.
Abstraktion
Ausserhalb einer Klasse ist nur wichtig, was eine Methode macht. Wie diese das erledigt, ist nicht entscheidend und bleibt im Verborgenen. Dies bietet folgende Vorteile:
- Das Programm ist leichter zu verwenden
- Programm kann leichter verändert werden
- Nur wichtige Informationen werden preisgegeben
Reales Beispiel
Wenn ich auf einer TV Fernbedienung "Play" drücke, wird der Film abgespielt. Das ist wichtig für mich. Was beim Tippen auf die Taste im inneren der Fernbedienung geschieht, ist nicht ersichtlich für mich.
Code Beispiel
Das Objekt Kunde hat eine Methode getMail()
. Diese benötigt einen Namen und gibt eine E-Mail-Adresse zurück. Wie die Methode das kann, muss mir nicht bekannt sein, um sie zu verwenden.
System.out.println(Kunde.getMail("john"));
Polymorphismus
"Als Polymorphismus (griechisch πολυμορφισμός Polymorphismos "Vielgestaltigkeit") bezeichnet man im Bereich Genetik das Auftreten mehrerer Genvarianten innerhalb einer Population." - Wikipedia
Doch was hat das mit Programmieren zu tun?
Bei der Vererbung haben wir gesehen, dass Klassen voneinander erben können. Der Mensch vererbt dem Käufer seine Attribute und Methoden. Der Käufer kann aber auch kaufen()
und korbFassen()
. Ich darf ihm also diese Methoden hinzufügen.
Mit extends
zeige ich, von welcher Klasse der Käufer erben soll. Er erhalt alle Attribute und Methoden dieser Klasse. Trotzdem darf dieser Klasse noch weitere hinzufügen.
public class Kaeufer extends Mensch {
public void kaufen() {}
public void korbFassen() {}
}
Im Hauptprogramm kann ich nun einen Käufer mit dem Namen Karl instanziieren. Dieser kann Essen und Kaufen. Das Essen vererbt ihm der Mensch, eine Methode zum Kaufen hat er selbst.
public class Programm {
public static void main(String[] args) {
Kaeufer karl = new Kaeufer();
karl.essen();
karl.kaufen();
}
}
Überschreiben von Methoden
Dem Verkäufer wird ebenfalls vererbt. Dar er immer sehr hungrig ist, muss essen()
angepasst werden.
Mit @Override
kann man geerbte Methoden überschreiben. Diese wird nicht auf der Mensch Klasse überschrieben und gilt damit nur für den Verkaeufer.
public class Verkaeufer extends Mensch {
public void verkaufen() {}
public void rueckgeldGeben() {}
@Override
public void essen(){
System.out.println("Ich esse viel, da ich den ganzen Tag an der Kasse sitze.");
}
}
Fazit
Wenn ein Programm die Realität abbilden muss, sollte man Objektorientiert programmieren. Dadurch verbessert sich die:
- Wartbarkeit
- Wiederverwendbarkeit
- Sicherheit der Methoden und Attributen
Ich finde die OOP spannend und habe beim Schreiben dieses Posts einiges dazugelernt.