Professionell von Beginn an!

Java-Kurs für Einsteiger – Teil 3: Objektorientierte Programmierung in Java

Dr. Veikko Krypczyk, Olena Bochkor

(c) Shutterstock / Curioso

Einführungskurse in die Sprache Java gibt es viele – offline in Form von Büchern oder auch online. Hier präsentieren wir Ihnen ein Java-Tutorial für den anspruchsvollen Einsteiger, der daran interessiert ist, Java-Anwendungen jenseits des “Hello-World” zu programmieren. Haben wir uns im zweiten Teil mit den wichtigen Sprachmerkmalen von Java beschäftigt, geht es nun um die Objektorientierte Programmierweise.

Objekte, Objekte, Objekte

Die objektorientierte Programmierung gilt heute als Standard für die Programmentwicklung. Objektorientierung ist auch das wichtigste Konzept in Java. Mit Hilfe dieses Programmieransatzes ist es möglich, die Komplexität von Software zu reduzieren und somit gut zu wartende Software zu erstellen. Dieser Teil unseres Java-Kurses führt in die objektorientierte Denkweise und deren Umsetzung in Java ein. Zunächst geben wir einen knappen Überblick über verschiedene Programmierparadigmen.

Java-Tutorial für Einsteiger: Professionell von Beginn an!

java tutorialDieses Java-Tutorial führt Sie Schritt für Schritt in die Programmierung mit Java ein. Anhand einer durchgängigen GUI-Beispielanwendung werden die wichtigsten Programmierkonzepte, Sprachkonstrukte und Werkzeuge in einem professionellen Setting vorgestellt.

Java-Kurs Teil 3: Objektorientierte Programmierung in Java

Programmierparadigmen

In den Anfängen der Programmentwicklung hat man sich sehr wenige Gedanken über die Art und Weise der Programmierung gemacht. Die Projekte waren überschaubar und es ging primär darum, ein lauffähiges Programm zu erzeugen. Man kann auch sagen, ein intuitives „Drauflos-Programmieren“ war das übliche Vorgehen.

Mit der Zeit sind jedoch die Anforderungen an Software in Größe und Komplexität in einem erheblichen Maß gestiegen. In allen Bereichen hat sich die Art und Weise der Programmierung hin zu einem professionellen Vorgehen angepasst. Spezielle Methoden des modernen Projektmanagements sorgen dafür, dass die Softwareentwicklung planvoll abläuft. Umfassende und hoch integrierte Entwicklungsumgebungen helfen dem Entwicklerteam bei der Erstellung des Programmcodes.

Eine weitere wichtige und sehr entscheidende Frage betrifft die Art und Weise der Programmerstellung. Computerprogramme sind dabei ein Modell der realen Welt. Sie bilden einen Teilaspekt unser Umwelt in digitaler Form ab. Je nach Problem existieren unterschiedliche Ansätze, wie dieses Modell aufgebaut wird. Diese Ansätze werden als Programmierparadigmen bezeichnet. Moderne Programmiersprachen unterstützen i.d.R. mehrere Paradigmen, welche auch kombiniert eingesetzt werden. In Theorie und Praxis unterscheidet man:

  • Imperativ: Das Programm besteht aus einer Folge von Anweisungen, die streng sequentiell abgearbeitet werden. Das Konzept des imperativen Programmierparadigmas beruht auf Funktionen und Prozeduren zur Abbildung der Funktionalität und Wiederverwendung von Quellcode.
  • Objektbasiert: Diese Programmiersprachen kennen Objekte zur Kapselung von Daten und Funktionalität. Weitergehende Konzepte, wie beispielsweise Vererbung oder die Darstellung von Beziehungen zwischen Objekten, werden jedoch nicht angeboten. Objektbasierte Sprachen können damit als Vorstufe der objektorientierten Programmierung aufgefasst werden.
  • Objektorientiert: Programmiersprachen dieser Gattung erweitern das objektbasierte Programmierparadigma um die typischen Konzepte der Objektorientierung, wie Vererbung und Polymorphie.
  • Funktional: Ein funktionales Programm besteht nur aus einer Reihe von Funktionsaufrufen. Eigenständige Wertzuweisungen existieren nicht. Alle Elemente können als Funktionen aufgefasst werden. Einsatzgebiete sind Anwendungen der künstlichen Intelligenz, Compilerbau und Computeralgebra-Systeme.
  • Logisch: Im Mittelpunkt steht der Aufbau einer Datenbasis, die aus Fakten und Regeln besteht. Fakten sind dabei wahre Aussagen im Sinne der Mathematik. Im Fokus steht die Problemformulierung, nicht der Lösungsalgorithmus.
  • Deklarativ: Überbegriff für das funktionale und das logische Paradigma.

Je nach Problemsituation ist der eine oder der andere Ansatz gut oder weniger gut geeignet. Java ist vom Wesen her eine objektorientierte Programmiersprache. Dennoch bietet sie auch Möglichkeiten, bestimmte Teilaufgaben weitgehend funktional zu lösen. Ob man diese funktionalen Aspekte letztendlich auch nutzt, ist oft eine Frage der Kenntnisse und Erfahrung des Entwicklers. Möchte man dagegen hauptsächlich funktional programmieren, würde man eher zu einer anderen Programmiersprache greifen.

Aus heutiger Perspektive kann man jedoch sagen, dass sich die objektorientierte Programmierung seit langen etabliert und bewährt hat. Sie gilt als State of the Art in nahezu allen Bereichen der Programmentwicklung. Wir geben nachfolgend einen Überblick über die objektorientierten Möglichkeiten in der Sprache Java. An der einen oder anderen Stelle zeigen wir dieses gleich an unserem Beispiel. Zunächst müssen wir jedoch ein paar theoretische Hintergründe erläutern.

Die objektorientierte Denkweise

In der objektorientierten Programmierung erfolgt die Modellbildung durch die Erstellung von Klassen und daraus abgeleiteten Objekten. Was versteht man darunter? Klassen fassen gleiche oder ähnliche Objekte zusammen. Es wird zwischen Ober- und Unterklassen unterschieden. Abbildung 1 zeigt den Zusammenhang.

Abbildung_1

Abbildung 1: Klassen bilden eine hierarchische Struktur des Programms.

 

Ganz allgemein formuliert, werden in einer Klasse die Daten eines bestimmten Objektes und das Verhalten zusammengefasst. Ein Beispiel: Eine Klasse Auto verfügt über die Eigenschaften Typ und Geschwindigkeit. Eigenschaften werden gleichzeitig als Attribute bezeichnet. Das Verhalten der Objekte wird über Methoden abgebildet. In Bezug auf das Auto sind es beispielsweise Beschleunigen und Bremsen. Unterklassen werden von den Oberklassen abgeleitet. Dabei kann die Unterklasse neue Attribute und Methoden hinzufügen. Durch den Mechanismus der Vererbung werden alle Methoden und Attribute der Oberklasse an die Unterklasse „weitergereicht“, d.h. diese sind auch in der Unterklasse verfügbar. Beispielsweise ist Fahrzeug eine mögliche Oberklasse. Elektroauto, Benzinauto, Dieselauto und Hybridauto sind Unterklassen (Abbildung 2).

Abbildung_2

Abbildung 2: Ein Beispiel für eine Oberklasse mit mehreren Unterklassen.

 

Einzelne Fahrzeuge werden als Objekte bezeichnet und gehören zu einer bestimmten Klasse. Die konkreten Eigenschaftswerte sind jedoch von Objekt zu Objekt unterschiedlich. So hat das Modell A ggf. eine Höchstgeschwindigkeit von 220 km/h und das Modell B von 195km/h.

Insgesamt basiert die objektorientierte Programmierung auf die in Abbildung 3 dargestellten Grundpfeiler.

Abbildung_3

Abbildung 3: Grundprinzipien der objektorientierten Programmierung [1].

Dazu sind die folgenden Anmerkungen zu beachten:

  • Generalisierung: Gleiche und ähnliche Objekte werden in einer Klasse zusammengeführt. Zum Beispiel werden alle mit elektrischer Energie betriebenen Autos in der Klasse Elektroauto zusammengefasst. Das Gegenteil zur Generalisierung ist die Spezialisierung, bei der die zu einem Oberbegriff zugehörigen Objekte spezielleren Subklassen zugewiesen werden. So umfasst die Oberklasse Fahrzeug die oben genannten Unterklassen.
  • Vererbung: Durch die Vererbung werden die Eigenschaften und Methoden einer Oberklasse allen abgeleiteten Unterklassen zur Verfügung gestellt. Diese müssen somit nur ein einziges Mal definiert werden. Weisen die Unterklassen Abweichungen gegenüber der Oberklasse auf, so kann man bei Bedarf die Eigenschaften und Methoden neu definieren. Dieser Vorgang wird als Überschreiben bezeichnet. Vererbung schafft die Möglichkeit, ganze Klassenbibliotheken zu erstellen. Die Programmierung in Java basiert maßgeblich auf dem Einsatz der Java-Standardbibliothek. Verfügt die Oberklasse Fahrzeug beispielsweise über die Methoden Beschleunigen und Bremsen, so ist es nicht notwendig, diese in den abgeleiteten Klassen Elektroauto, Benzinauto, Dieselauto und Hybridauto erneut zu definieren. Ein Überschreiben wäre nur dann notwendig, wenn sich der Bremsmechanismus zwischen den einzelnen Fahrzeugtypen unterscheidet. Eigenschaften und Methoden sind also beim Entwurf der Klassenhierarchie so weit wie möglich oben anzuordnen.
  • Kapselung: Darunter wird das Verstecken von Daten gegenüber einem Zugriff von außen verstanden. Das Innere der Klasse ist weitgehend geheim und von außen nicht sichtbar. Der Zugriff wird über Schnittstellen durchgeführt. Dadurch wird das Auftreten von Fehlern im Programm minimiert. Der Benutzer einer Klasse muss nicht deren genaue innere Funktionsweise kennen, um sie anzuwenden. Ein Objekt der Klasse Elektroauto verfügt aufgrund der Vererbung von der Klasse Fahrzeug automatisch über die Methode Bremsen. Man kann diese Methode aufrufen, ohne sich darum zu kümmern, wie sie im konkreten Fall programmiert wurde.
  • Polymorphismus: Polymorphismus umschreibt die Tatsache, dass Eigenschaften und Methoden einer Oberklasse bei Bedarf in einer Subklasse gegen eine speziellere Variante ersetzt werden können. Erfolgt dieses nicht, so kommt automatisch die Implementierung der Oberklasse beim Aufrufen zum Einsatz.

Klassen und Objekte in Java

Jetzt schauen wir uns an, wie die Objektorientierung in Java umgesetzt wird. Dabei beschränken wir uns auf die Kernkonzepte. Zunächst zu einer einzuhaltenden Regel: In Java führen alle Quelldateien die Dateinamenerweiterung .java. Jede Quelldatei enthält nur eine Klasse. Der Klassenname muss mit dem Dateinamen übereinstimmen.

Zur Erläuterung greifen wir sogleich auf unser Beispiel zurück, welches Sie aus dem Repository https://github.com/veikkoEF/WordCloud von GitHub laden können. Diese Vorgehensweise hat den Vorteil, dass wir neben der objektorientierten Programmierung in Java auch gleichzeitig weitere wichtige Grundlagen der Erstellung eines Java-Programms vorstellen können. Lassen Sie uns gleich beginnen:

In unserem Programm haben wir u.a. die Klasse WordCloud, welche den Einstieg bei der Ausführung des Programms darstellt. Werfen wir einen Blick auf den Quellcode:

public class WordCloud {
    public static void main(String[] args) {
        // TODO code application logic here
	…
    }
}

Eine Klasse wird über das Schlüsselwort class definiert. Vor diesem Schlüsselwort muss ein Hinweis auf die so genannte Sichtbarkeit stehen. In diesem Fall public, d.h. die Klasse ist von außen sichtbar. Innerhalb der Klasse gibt es im Moment keine Properties (Attribute) und ausschließlich eine Methode main. Diese Methode ist der Einstiegspunkt bei der Ausführung eines Java-Programms, d.h. sie wird aufgerufen, wenn man das Programm startet. Von außen können dem Programm Argumente übergeben werden, welche dann im Java-Programm als Array in der Form String[] args ankommen. Innerhalb der Methode main ist später die Programmlogik zu implementieren, beispielsweise wird das Hauptformular erzeugt und angezeigt.

Weitere wichtige Prinzipien der Objektorientierung in Java können wir anhand einer anderen – ebenso schon existierenden Klasse – untersuchen. Dazu wechseln wir in den Ordner ui (die Bezeichnung steht für User-Interface) und betrachten die Klasse MainFrame. In dieser ist der Quellcode für die Erzeugung des Hauptformulars unseres Beispiels zusammengefasst:

public class MainFrame extends javax.swing.JFrame {

    private List<String> words;
    public MainFrame() {
        initComponents();
        words = new ArrayList<String>();
    }

    
    private void initComponents() {

        jToolBar1 = new javax.swing.JToolBar();
        jButton2 = new javax.swing.JButton();
        ...
        ...
        ...
    }

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) 
        // TODO add your handling code here:
        ...
        ...
        ...
    }
}

Auch dazu wieder die notwendigen Erläuterungen: Zunächst wird in der Zeile 1 (public class MainFrame extends javax.swing.JFrame) die Klasse MainFrame definiert. Nun kommt aber die Besonderheit hinzu, dass diese Klasse von der bereits existierenden Basisklasse JFrame abgeleitet wird. Die Klasse JFrame wiederrum ist in der Bibliothek javax.swing definiert.

Mit anderen Worten: Unsere Klasse MainFrame wird eine Subklasse der Klasse JFrame und erbt von dieser alle Elemente. Die Klasse JFrame enthält bereits standardmäßig alle Funktionalitäten, die für das Erstellen von Fenstern (Formularen) auf dem Desktop notwendig sind. Dazu zählen zum Beispiel Eigenschaften mit Angaben zu Größe und Farbe oder Methoden zum Anzeigen und Schließen des Fensters.

Dadurch, dass wir von dieser Klasse abgleitet haben, hat unser Formular MainFrame sogleich ebenso diese Funktionalität. Diese muss also nicht eigenständig programmiert werden. Unsere Klasse wird später das Hauptformular der Anwendung werden und muss deshalb um eigene Funktionalität erweitert werden.

Gehen wir weiter im Quelltext: Es folgt mit private List<String> words die Definition einer lokalen Liste vom Datentyp String. Diese wird später die Wörter speichern, welche in der Präsentation der Word-Cloud angezeigt werden. Das Schlüsselwort private bedeutet, dass ein Zugriff von außen nicht möglich ist und die Liste nur innerhalb der Klasse verwendet werden kann.

Kommen wir nun zum Quellcodeausschnitt:

public MainFrame() {

initComponents();

words = new ArrayList<String>();

}

Diese Codezeilen stellen den sogenannten Konstruktor der Klasse dar. Zum einem wird darin eine weitere Methode namens initComponents aufgerufen. Diese Methode erzeugt die anderen Komponenten der Benutzeroberfläche wie Buttons, Labels usw. Diese Komponenten sind natürlich wiederum eigene Klassen, welche in der Standardbibliothek für UI-Komponenten javax.swing definiert sind.

Um also einen eigenen Button zu erstellen, muss man ein Objekt der Klasse JButton erzeugen, dieses geschieht dann wiederum mit Hilfe des new-Operators. Wie es oben ersichtlich ist, also ganz simpel nach dem Muster:

jToolBar1 = new javax.swing.JToolBar().

Im Übrigen sind in der Swing-Bibliothek fast alle Komponenten zusammengefasst, die benötigt werden, um moderne Java-Programme zu erstellen.

Verbleibt noch die Erläuterung der letzten Methode, welche mit dem folgenden Header beginnt:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt).

Hierbei handelt es sich um eine spezielle Methode, die auf ausgewählte UI-Ereignisse reagiert. Grundsätzlich sind Ereignisse der dritte wichtige Bestandteil neben Eigenschaften und Methoden von Klassen. Sie werden durch externe Ereignisse z.B. durch das Drücken eines Buttons oder durch Mausbewegung ausgelöst. Innerhalb der Methode muss dann der Programmcode abgelegt werden, welcher die Reaktion auf das Ereignis beschreibt.

Zusammenfassung und Ausblick

In diesem Teil der Artikelserie haben wir die Grundlagen der objektorientierten Programmierung in der Sprache Java vorgestellt. Programme entstehen, indem man die eigene Fragestellung in ein System aus Klassen und daraus abgeleitete Objekte überführt. Die Verwendung der Standardklassenbibliothek ist dabei stets der Ausgangspunkt, um ein eigenes Programm zu bauen. Diese ist umfangreich und bietet mit einem großen Fundus an Klassen Lösungen für (fast) alle Standardfragen der Programmentwicklung.

Die objektorientierte Programmierung ist ein guter Ansatz für die allseits geforderte Wiederverwendung in der Softwareentwicklung. Werden Lösungen für wiederkehrende Probleme zu allgemeinen Klassenbibliotheken zusammengefasst, können sie erfolgreich in einer Vielzahl von Programmen eingesetzt werden. Ein sehr gutes Beispiel ist die Entwicklung moderner Benutzeroberflächen auf der Basis vordefinierter Steuerelemente. Diese kommen in nahezu allen Programmen vor und werden zur angedachten Oberfläche zusammengesetzt. Ein Thema, das wir im kommenden Teil unseres Online-Tutorials betrachten wollen. Bis dahin wünschen wir viel Spaß beim Experimentieren in Ihrem Java-Programm.

Hier geht’s zum Teil 4 des Tutorials: Moderne Benutzeroberflächen

Verwandte Themen:

Geschrieben von
Dr. Veikko Krypczyk
Dr. Veikko Krypczyk
Dr. Veikko Krypczyk studierte und promovierte in Betriebswirtschaftslehre mit dem Schwerpunkt Wirtschaftsinformatik. Er ist Entwickler und Fachautor. Aktuell beschäftigt er sich mit der App-Programmierung für Windows Phone und Android.
Olena Bochkor
Olena Bochkor
Olena Bochkor studierte Betriebswirtschaftslehre u. a. mit dem Schwerpunkt Wirtschaftsinformatik. Weitere Informationen zu diesen und anderen Themen der IT finden Sie unter http://it-fachartikel.de.
Kommentare

Hinterlasse einen Kommentar

2 Kommentare auf "Java-Kurs für Einsteiger – Teil 3: Objektorientierte Programmierung in Java"

avatar
400
  Subscribe  
Benachrichtige mich zu: