2020
Everything is an Object (Java)

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:

person

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:

kay

james

Klasse Programmieren
Person
public class Person {
    private String name;
    private int alter;
}
Objekt instanziieren
MainProgramm
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:

klassen

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, ...

mensch

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.

Datenkapselung
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.

remote

Quelle: https://upload.wikimedia.org/wikipedia/commons/0/0c/Rubber_keyboard_remote_control.jpg (opens in a new tab)

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.

Mail
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.

poly

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.

Kaeufer
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.

MainProgramm
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.

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.