Grundstrukturen eines Java-Programms

In den bisherigen Java-Artikeln drehte sich alles um die Installation von Java und um beliebte Editoren bzw. Entwicklungsumgebungen wie Visual Studio Code und IntelliJ IDEA. Darüber hinaus wurde gezeigt, wie ein Hello-World-Programm in Java aussieht.

In diesem Blogbeitrag möchte ich nun etwas tiefer in die Materie einsteigen. Anhand eines kleinen Programms sollen grundlegende Aspekte, wie beispielsweise die Struktur eines Java-Programms, erklärt werden. Bei dem besagten Programm geht es um die Berechnung der Fläche eines Rechtecks. Die Formel dafür lautet:

$ A = a * b $

In Code gegossen könnte dies so aussehen:

package de.niftycode;

public class Rectangle {

    public static void main(String[] args) {

        // Variables
        int a = 4;
        int b = 4;

        // Print the result
        System.out.println(a * b);
    }
}

Packages

Auch wenn es nur wenige Zeilen Code sind, gibt es hierzu bereits eine Menge zu sagen. Da wäre gleich die erste Zeile:

package de.niftycode;

Es beginnt mit dem Schlüsselwort package. In Java können die Klassen in Paketen gruppiert werden. Neben Paketen, die Bestandteil von Java sind — den Built-in Packages — kann man auch eigene Pakete erzeugen. Auch die selbst erstellten Klassen können unter einem eigenen Paket zusammengefasst. Die Angabe eines solchen Pakets ist aber optional. Nichtsdestotrotz bietet es sich aber an, auf diese Weise ein Projekt zu strukturieren. Außerdem wird hierüber ein Namenskonflikt mit den Code-Dateien anderer Entwickler vermieden.

Manche Entwicklungsumgebungen — wie IntelliJ IDEA — legen bei der Erstellung eines neuen Projekts automatisch ein Paket an (mit dem Standardnamen „com.company“). Visual Studio Code macht dies hingegen nicht.

Zurück zum Projekt: In diesem Beispiel verwende ich ein Paket, das die Bezeichnung de.niftycode erhalten hat. Hierbei handelt sich um eine umgekehrte DNS-Notation (Reverse domain name notation), also eine Zeichenfolge, die mit der Top-Level-Domain beginnt (hier: „de“). Die Verzeichnisstruktur eines Java-Projekts, wie beispielsweise im Projektbaum von IntelliJ IDEA dargestellt, spiegelt dies wieder:

Rectangle
    |-src
        |-de.niftycode
            |-Rectangle

Sämtliche Code-Dateien befinden sich im Verzeichnis src. Dieses Verzeichnis enthält wiederum ein Unterverzeichnis, das den Namen des eigenen Pakets trägt. In diesem Verzeichnis befinden sich wiederum die (eigenen) Code-Dateien, mithin die erzeugten Klasse.

Hinweis: Solltet Ihr IntelliJ IDEA verwenden, lasst Euch nicht irritieren. In der Projektstruktur steht zwar „de.niftycode“ (bzw. die von Euch gewählte Bezeichnung), im Dateisystem handelt es sich aber um das Verzeichnis „de“ mit dem Unterverzeichnis „niftycode“. Der komplette Pfad lautet also:

/Rectangle/src/de/niftycode

Wie erwähnt, sieht die Struktur in VS Code nach dem Anlegen eines neuen Projekts etwas anders aus:

Rectangle
    |-src
        |-App.java

Im Gegensatz zu IntelliJ IDEA wird keine „Paketstruktur“ angelegt. Möchte man die Klassen in einem eigenen Paket zusammenfassen (z.B. „com.company“), kann dies (nachträglich) wie folgt erreicht werden:

  1. Am Anfang der Java-Datei (in VS Code ist das standardmäßig „App.java“) wird package com.company; hinzugefügt.
  2. Dies führt zu einer Fehlermeldung, da VS Code mit dieser Bezeichnung bisher nichts anfangen kann. Wenn nun der Mauszeiger auf den Paketnamen bewegt wird, erscheint die besagte Fehlermeldung. Ein Klick auf „Quick Fix“ unterhalb dieser Fehlermeldung und die Auswahl der Option „Move ‚App.java‘ to package ‚com.company'“ führt dazu, dass eine entsprechende Projektstruktur erzeugt wird. Gleichzeitig wird „App.java“ in diese Struktur integriert.
Java-Projektstruktur in VS Code

Wie der Abbildung entnommen werden kann, wird in VS Code der Pfad angezeigt, also src/com/company.

Klassen und die Methode main()

Jedes Java-Programm hat mindestens eine Klasse. Hier ist es eine Klasse mit dem Namen Rectangle. Ohne an dieser Stelle in die objektorientierte Programmierung einsteigen zu wollen, kann festgehalten werden, dass eine Klasse eine Sammlung von Variablen und Methoden enthält.

Diese Klasse verfügt über die Methode: main(). Jedes Java-Programm hat eine Methode mit dieser Bezeichnung. Es ist der Einstiegspunkt in die Anwendung.

Variablen

Für die Flächenberechnung werden zwei Werte benötigt, einen für die Länge und einen für die Breite des Rechtecks. Hierzu werden zwei Variablen a und b vom Datentyp Integer (kurz: int) definiert. Der Datentyp int kommt bei Ganzzahlen zur Anwendung.

Da in diesem Programm als Datentyp int gewählt wurde, können also Gleitkommazahlen, z.B. 5.2, nicht verwendet werden.

Die Methode main()

Die Methode main() stellt den Einstieg in das Programm dar. Vor dem Namen main steht noch public static void. Diese Schlüsselwörter haben folgende Bedeutung:

  • public: Da diese Methode als public deklariert wurde, kann sie auch außerhalb der Klasse verwendet werden.
  • static: Dies führt dazu, dass auf die Methode zugegriffen werden kann, ohne dass zuvor ein Objekt erzeugt werden müsste.
  • void: Dies zeigt an, dass diese Methode keinen Wert zurückgibt.

Kommen wir jetzt noch zu String[] args. Hierbei spricht man von Parametern, die diese Methode bei der Ausführung akzeptiert. Es handelt sich dabei um ein Array mit Elementen vom Typ String. Wenn das Programm in der Shell ausgeführt wird, können Elemente dieses String-Arrays übergeben werden.

System.out.println();

Dieser Code ist sozusagen der Standardweg, um etwas in der Konsole auszugeben. Wie im Hello-World-Programm gezeigt, kann dies eine Zeichenkette sein („Hello, World!“), möglich ist aber auch — so wie in diesem Beispiel — das Ergebnis einer Multiplikation.

Tipp: In IntelliJ IDEA ist es nicht notwendig diese Zeile komplett zu auszuschreien. Stattdessen steht die Kurzform sout zur Verfügung. Nach der Bestätigung mit der Enter-Taste wird dann sout zu System.out.println(); vervollständigt.

Das Programm ausführen

Sowohl in IntelliJ IDEA als auch in Visual Studio Code, wird der Code durch einen Klick auf den Play-Button zunächst kompiliert und dann das Programm ausgeführt. Im Ergebnis wird hier im Terminal-Fenster der Wert 16 angezeigt.

Ausgabe im Terminal der IntelliJ IDEA

Vom Sourcecode zum Bytecode

Java-Code wird kompiliert. Abgesehen vom Klick auf den Play-Button, kann dieser Vorgang auch im Terminal mit dem Befehl javac ausgelöst werden. Befindet sich der Sourcecode in einer Datei mit der Bezeichnung „Main.java“, würde die Anweisung zum Kompilieren also wie folgt lauten:

$ javac Main.java

Das Ergebnis dieses Vorgangs ist eine Datei gleichlautenden Namens mit der Endung „class“, in diesem Fall also „Main.class“. Diese Datei enthält den Bytecode, der von jeder Java Virtual Machine (JVM) auf unterschiedlichen Betriebssystemen ausgeführt werden kann.

Fazit

Selbst zu so einem einfachen Java-Programm, wie dem hier vorgestellten, lässt sich eine Menge sagen. An diesem Beispiel zeigt sich denn auch die Komplexität, die Java mit sich bringt. Zum Vergleich: In Python würde eine Zeile Code ausreichen:

>>> print(4 * 4);
16

Nichtsdestotrotz sollten sich Einsteiger davon nicht abschrecken lassen. Die Einarbeitung in eine neue Programmiersprache erfordert nun mal Zeit. Außerdem hat Java auch eine ganze Reihe von Vorteilen. So ist es eine plattformunabhängige, objektorientierte Programmiersprache, bei der man sich nicht mit Zeigern herumärgern muss. Außerdem hat Java eine automatische Speicherverwaltung mit an Bord. Und nicht zuletzt ist diese Sprache sehr weit verbreitet. Tatsächlich zählt Java seit Jahren zu den beliebtesten Programmiersprachen.