Informatik

Java lernen: Grundlagen und Objektorientierung

Java lernen: Grundlagen und Objektorientierung
Java lernen: Grundlagen und Objektorientierung
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

Java ist eine objektorientierte Programmiersprache. Du schreibst Quellcode, lässt ihn in Bytecode übersetzen und startest ihn in einer passenden Java-Umgebung. Für den Einstieg reichen kleine Programme: So lernst du, Daten zu speichern, Entscheidungen zu treffen, Wiederholungen zu steuern und Objekte mit geschütztem Zustand zu bauen.

Deine Lernziele

Hake ab, was du schon kannst — und komm am Ende hierher zurück!

Vom Quelltext zur Ausgabe

Du möchtest den Text „Hallo Welt!“ ausgeben. Dieses vollständige Einführungsprogramm genügt:

java public class HelloWorld { public static void main(String[] args) { System.out.println("Hallo Welt!"); } }

  • class HelloWorld beschreibt eine Klasse. Die geschweiften Klammern begrenzen ihren Inhalt.
  • main ist hier der Startpunkt. static bedeutet, dass Java die Methode ohne vorher erzeugtes HelloWorld-Objekt aufrufen kann.
  • void zeigt an, dass die Methode keinen Wert zurückgibt.
  • System.out.println(...) schreibt eine Zeile auf die Konsole. Das Semikolon beendet die Anweisung.

Speichere das Beispiel als HelloWorld.java. Dann besteht der Ablauf aus zwei Schritten:

text javac HelloWorld.java java HelloWorld

javac kompiliert den Quellcode und erzeugt HelloWorld.class. Der zweite Befehl startet die Klasse ohne Dateiendung.

Definition

Syntaxfehler

Ein Syntaxfehler verletzt die Schreibregeln der Sprache, etwa durch eine fehlende Klammer oder ein fehlendes Semikolon. Der Compiler kann daraus keinen gültigen Bytecode erzeugen.

Definition

Bug

Ein Bug ist ein Fehler im Verhalten. Das Programm kann gültig sein und laufen, aber trotzdem etwas anderes tun als beabsichtigt.

Teste dich
Frage 1 von 2LeichtWas geschieht bei javac HelloWorld.java?
Lösung: Der Quellcode wird kompiliert und eine Klassendatei erzeugt. — Trenne Übersetzen und Ausführen: javac kompiliert, java startet.
Frage 2 von 2MittelDas Programm läuft, gibt aber „Hallo!“ statt „Hallo Welt!“ aus. Wie ordnest du das ein?
Lösung: als Bug im Verhalten — Eine falsche, aber ausführbare Ausgabe weist auf einen logischen Fehler hin.
Daten speichern und Entscheidungen treffen

Eine Variable verbindet einen Namen mit einem Wert. Ihr Datentyp legt fest, welche Art von Wert sie aufnehmen kann.

java int alter = 16; double temperatur = 21.5; boolean volljaehrig = false; String name = "Mira";

int speichert ganze Zahlen, double Fließkommazahlen und boolean genau true oder false. String steht für eine Zeichenkette. Deshalb ist "789" Text und nicht die Zahl 789.

Mit einer Bedingung wählt das Programm einen von mehreren Wegen:

java if (alter >= 18) { System.out.println("volljährig"); } else { System.out.println("minderjährig"); }

Vergleiche können prüfen, ob Werte größer, kleiner, gleich oder ungleich sind. Sie ergeben einen Wahrheitswert. Mehrere Bedingungen lassen sich mit && für UND, || für ODER und ! für NICHT verbinden.

Merke

Vergleiche den Inhalt von Strings mit equals, zum Beispiel name.equals("Mira"). Nutze dafür nicht ==.

Beispiel

Das folgende Programmstück prüft zwei Dinge: Der Name muss passen und das Alter muss mindestens 16 sein.

java if (name.equals("Mira") && alter >= 16) { System.out.println("Zugang erlaubt"); }

Die Ausgabe erfolgt nur, wenn beide Teilbedingungen true sind. Genau das verlangt der UND-Operator &&.

Teste dich
Frage 1 von 2LeichtWelcher Wert passt zum Datentyp boolean?
Lösung: false — Ein boolean besitzt in Java einen der beiden Werte true oder false.
Frage 2 von 2MittelWelche Bedingung prüft, ob name den Inhalt „Mira“ hat?
Lösung: name.equals("Mira")equals vergleicht die Zeichenfolge mit dem angegebenen Inhalt.
Werte wiederholen, sammeln und zerlegen

Eine Schleife wiederholt Anweisungen. Ein Array sammelt mehrere Werte desselben Datentyps. Eine Methode bündelt einen benannten Arbeitsschritt.

```java static int summePositive(int[] zahlen) { int summe = 0;

for (int i = 0; i != zahlen.length; i++) { if (zahlen[i] > 0) { summe = summe + zahlen[i]; } }

return summe; } ```

Die Methode hat den Rückgabetyp int und erhält ein int-Array als Parameter. Die Schleifenvariable i beginnt bei 0, weil der erste Arrayindex 0 ist. Sie läuft bis unmittelbar vor zahlen.length: Bei einem Array mit drei Elementen sind nur die Indizes 0, 1 und 2 gültig.

Beispiel

Für das Array {5, -2, 7} arbeitet die Methode so:

  1. Sie startet mit summe = 0.
  2. Sie addiert 5, überspringt -2 und addiert 7.
  3. Sie gibt mit return den Wert 12 zurück.

Der entscheidende Gedanke ist nicht die Addition allein: Die if-Bedingung filtert vorher alle nicht positiven Werte aus.

Lückentext

Wähle in jeder Lücke die passende Form und prüfe anschließend deine Antworten.

Der erste Index eines Arrays ist . Bei Startwert 0 und Erhöhung um 1 bleibt die Schleife mit innerhalb des Arrays. Eine Methode mit Rückgabewert liefert ihr Ergebnis mit zurück.

Lösungen: Lücke 1: 0; Lücke 2: i != zahlen.length; Lücke 3: return. Der letzte gültige Index liegt immer eins unter length. Die Schleife endet deshalb, sobald i der Arraylänge entspricht.
Klassen, Objekte und gekapselten Zustand bauen

Eine Klasse ist ein Bauplan. Ein Objekt ist eine konkrete Instanz dieses Bauplans. Attribute speichern seinen Zustand, Methoden beschreiben sein Verhalten.

```java class Auto { private String marke; private boolean an;

Auto(String marke) { this.marke = marke; }

public void starte() { an = true; }

public boolean istAn() { return an; } } ```

private schützt die Attribute vor direktem Zugriff aus anderen Klassen. Zustandsänderungen laufen hier über öffentliche Methoden. Das nennt man Kapselung: Die Klasse kontrolliert selbst, wie ihr Zustand gelesen oder verändert wird.

Der Konstruktor Auto(String marke) trägt denselben Namen wie die Klasse und hat keinen Rückgabetyp. Er erhält den Startwert. this.marke bezeichnet das Attribut des aktuellen Objekts; marke bezeichnet hier den Parameter.

Beispiel

So entstehen zwei eigenständige Objekte:

```java Auto auto1 = new Auto("Mini"); Auto auto2 = new Auto("VW");

auto1.starte(); System.out.println(auto1.istAn()); System.out.println(auto2.istAn()); ```

Beide Objekte folgen demselben Bauplan, besitzen aber eigenen Zustand. Der Aufruf auto1.starte() verändert nur auto1.

Gut zu wissen

Sobald du selbst einen Konstruktor mit Parametern definierst, stellt Java nicht zusätzlich automatisch einen parameterlosen Konstruktor bereit. Soll auch new Auto() möglich sein, musst du Auto() { } ausdrücklich ergänzen.

Teste dich
Frage 1 von 3LeichtWelche Aussage unterscheidet Klasse und Objekt richtig?
Lösung: Die Klasse ist der Bauplan; ein Objekt ist eine konkrete Instanz. — Mit new Auto("Mini") erzeugst du nach dem Bauplan Auto ein Objekt.
Frage 2 von 3MittelWarum ist an im Beispiel private?
Lösung: Damit die Klasse den Zugriff auf ihren Zustand kontrolliert. — Kapselung schützt Zustand und bietet gezielte öffentliche Methoden als Schnittstelle.
Frage 3 von 3SchwerWas passiert bei new Auto(), wenn nur Auto(String marke) definiert ist?
Lösung: Der Aufruf kann so nicht kompiliert werden. — Ein passender Konstruktor muss vorhanden sein; hier erwartet der vorhandene Konstruktor einen String.
Vom Beispiel zur eigenen Lösung

Eine fertige Lösung zu verstehen ist ein Anfang. Sicher anwenden kannst du sie erst, wenn du den Denkweg auf eine veränderte Aufgabe überträgst.

Gehe bei kleinen Java-Aufgaben so vor:

  1. Formuliere die gewünschte Eingabe und Ausgabe.
  2. Zerlege die Aufgabe in eindeutige Teilschritte.
  3. Wähle für jeden Schritt eine passende Struktur: Bedingung, Schleife, Array, Methode oder Klasse.
  4. Schreibe zuerst einen kleinen vollständigen Fall.
  5. Kompiliere und behebe Syntaxfehler.
  6. Teste normale Fälle und Randfälle gegen das gewünschte Verhalten.
Beispiel

Aufgabe: Schreibe eine Methode, die prüft, ob eine ganze Zahl gerade ist.

java static boolean istGerade(int zahl) { return zahl % 2 == 0; }

% liefert den Rest einer Division. Die Methode prüft, ob beim Teilen durch 2 der Rest 0 bleibt. Sie gibt deshalb einen Wahrheitswert zurück.

Aussagekräftige Namen, gleichmäßige Einrückung und maßvolle Kommentare helfen beim Prüfen. Ein Kommentar soll den Zweck oder einen nicht offensichtlichen Gedanken erklären, nicht jede sichtbare Codezeile wiederholen.

Teste dich
Frage 1 von 2MittelDu willst die Methode summePositive so ändern, dass sie nur negative Werte addiert. Welche einzelne Bedingung passt?
Lösung: 0 > zahlen[i] — Die Entscheidung betrifft das aktuelle Element zahlen[i], nicht die Länge des Arrays.
Frage 2 von 2SchwerEine Methode kompiliert, liefert aber für einen Testfall das falsche Ergebnis. Was ist der nächste sinnvolle Schritt?
Lösung: Erwartetes und tatsächliches Verhalten für den Testfall Schritt für Schritt vergleichen. — Weil der Code kompiliert, suchst du nun im Lösungsweg und in den Bedingungen nach dem Bug.
Karteikasten
Karteikasten

Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.

Alles auf einen Blick
Mindmap
  • Java
    • Quellcode wird kompiliert und anschließend gestartet
    • Variablen und Strings speichern Werte
    • Bedingungen und Schleifen steuern den Ablauf
    • Arrays sammeln Werte und Methoden zerlegen Aufgaben
    • Klassen erzeugen Objekte mit eigenem Zustand
    • Kapselung schützt Zustand durch klare Schnittstellen
    • Tests unterscheiden Syntaxfehler von Bugs
Abschluss-Check
Teste dich
Frage 1 von 3LeichtWelcher Befehl startet nach dem Kompilieren die Klasse HelloWorld?
Lösung: java HelloWorldjavac HelloWorld.java kompiliert; java HelloWorld startet.
Frage 2 von 3MittelWelche Schleife durchläuft ein Array werte vollständig, wenn i bei 0 startet und jeweils um 1 steigt?
Lösung: for (int i = 0; i != werte.length; i++) — Gültige Indizes beginnen bei 0; die Schleife endet, sobald i die Arraylänge erreicht.
Frage 3 von 3SchwerEine Klasse soll verhindern, dass andere Klassen ihren Zustand beliebig verändern. Welcher Entwurf passt am besten?
Lösung: private Attribute und gezielte public Methoden — Kapselung kombiniert geschützten Zustand mit einer bewusst gestalteten öffentlichen Schnittstelle.

Passend dazu