Die Werkzeugkiste einrichten
Bevor ein Schreiner ein Haus baut, braucht er eine Werkbank, einen Hammer und Nägel. Bevor du Java-Programme baust, brauchst du drei Dinge: das JDK (deine Werkzeugkiste), die Umgebungsvariablen (der Wegweiser, damit der Computer die Werkzeugkiste findet) und eine IDE wie Eclipse (deine Werkbank). Das bauen wir jetzt gemeinsam auf.
1.1 Was ist Java eigentlich?
Stell dir vor, du schreibst einen Brief auf Deutsch, aber dein Freund in Japan kann nur Japanisch lesen. Du brauchst einen Übersetzer. Java funktioniert genauso: Du schreibst deinen Code in der Sprache "Java" — aber dein Computer (egal ob Windows, Mac oder Linux) versteht eigentlich nur seine eigene Maschinensprache. Dazwischen steht ein Übersetzer.
JVM (Java Virtual Machine)
Die JVM ist eine virtuelle (also simulierte) Maschine, die auf deinem echten Computer läuft und deinen übersetzten Java-Code (den Bytecode) Zeile für Zeile ausführt. Jedes Betriebssystem hat seine eigene JVM, aber der Bytecode, den sie ausführt, ist immer identisch. Das ist der Grund für Plattformunabhängigkeit — IHK-Prüfungsfrage-Klassiker.
Bytecode
Wenn du deinen .java-Quellcode kompilierst, entsteht keine fertige .exe-Datei wie bei C, sondern eine .class-Datei mit Bytecode: eine Zwischensprache, die kein Mensch direkt liest, aber jede JVM auf der Welt versteht. Bytecode ist der Grund, warum eine .class-Datei auf Windows, Mac und Linux ohne erneutes Kompilieren läuft.
JDK vs. JRE vs. JVM
JVM = führt Bytecode aus (der "Motor").
JRE (Java Runtime Environment) = JVM + Standardbibliotheken — reicht, um fertige Java-Programme auszuführen, aber nicht, um sie zu schreiben.
JDK (Java Development Kit) = JRE + Compiler (javac) + Entwickler-Werkzeuge — das brauchst du zum Programmieren.
Eselsbrücke: JDK ist wie eine komplette Küche (zum Kochen), JRE ist wie ein Mikrowellen-Fertiggericht-Aufwärmer (nur zum Ausführen fertiger Gerichte).
Compiler
Ein Programm, das deinen für Menschen lesbaren Quellcode (.java) in eine andere Form übersetzt — bei Java in Bytecode (.class). Der Java-Compiler heißt javac und wird über die Kommandozeile oder automatisch von der IDE aufgerufen.
javac kompiliert Quellcode zu Bytecode (Kompilierung), die JVM interpretiert diesen Bytecode zur Laufzeit (Interpretation), oft zusätzlich beschleunigt durch den JIT-Compiler (Just-In-Time-Compiler), der häufig genutzten Bytecode direkt in Maschinencode übersetzt.
1.2 Das JDK installieren
Wir installieren Eclipse Temurin (früher AdoptOpenJDK) — ein kostenloses, freies JDK, das in Ausbildungsbetrieben und der IHK-Praxis Standard ist. Wir nehmen die aktuelle LTS-Version (Long Term Support — eine Version, die besonders lange mit Updates versorgt wird).
- Öffne im Browser
adoptium.net(die offizielle Eclipse-Temurin-Seite). - Wähle dein Betriebssystem (Windows / macOS / Linux) und die aktuelle LTS-Version aus (z. B. Java 21 LTS).
- Lade den JDK-Installer herunter (nicht das JRE — du willst entwickeln, nicht nur ausführen!).
-
Windows: Starte die
.msi-Datei. Wichtig: Im Installationsassistenten bei "Set JAVA_HOME variable" und "Add to PATH" unbedingt aktivieren — dann übernimmt dies der Installer für dich automatisch. -
macOS: Starte die
.pkg-Datei und folge dem Assistenten. macOS registriert das JDK automatisch unter/Library/Java/JavaVirtualMachines/. -
Linux (Debian/Ubuntu): Alternativ per Terminal:
sudo apt install temurin-21-jdk(Paketquelle vorher gemäß Adoptium-Anleitung einbinden). - Installation abschließen und Terminal / Eingabeaufforderung neu öffnen (wichtig — alte Fenster kennen die neuen Einstellungen noch nicht!).
java -version javac -version
Wenn beides eine Versionsnummer ausgibt (z. B. openjdk version "21.0.4"), hat die Installation funktioniert. Kommt stattdessen 'java' is not recognized oder command not found, fehlt der PATH-Eintrag — das reparieren wir im nächsten Schritt von Hand.
LTS (Long Term Support)
Java bringt alle 6 Monate eine neue Version heraus, aber nur bestimmte Versionen (z. B. 8, 11, 17, 21) sind LTS-Versionen, die jahrelang mit Sicherheitsupdates versorgt werden. Ausbildungsbetriebe und die IHK setzen fast immer auf LTS-Versionen, weil sie stabil und lange unterstützt sind.
✅ Checkpoint 1: JDK installiert
1.3 Umgebungsvariablen: PATH & JAVA_HOME
Umgebungsvariable (allgemein)
Eine Umgebungsvariable ist ein benannter Wert, den das Betriebssystem für alle Programme bereithält — vergleichbar mit einem globalen Notizzettel des Systems. Programme können diese Werte auslesen, ohne dass der Nutzer sie jedes Mal neu eingeben muss.
JAVA_HOME
JAVA_HOME zeigt auf den Installationsordner des JDK selbst (z. B. C:\Program Files\Eclipse Adoptium\jdk-21). Viele Programme wie Eclipse, Maven oder Gradle fragen gezielt nach JAVA_HOME, um zu wissen, welches JDK sie benutzen sollen — das ist in der IHK-Praxis besonders wichtig, wenn mehrere Java-Versionen parallel installiert sind.
PATH
PATH ist eine Liste von Ordnern, die das Betriebssystem automatisch durchsucht, wenn du in der Kommandozeile einen Befehl eingibst. Damit java und javac von überall aus aufgerufen werden können (nicht nur im Installationsordner), muss der bin-Unterordner des JDK im PATH eingetragen sein.
| Variable | Zeigt auf | Wird benutzt von |
|---|---|---|
JAVA_HOME | JDK-Hauptordner (z. B. ...\jdk-21) | Eclipse, Maven, Gradle, Build-Tools |
PATH | Liste von Ordnern mit ausführbaren Programmen, inkl. %JAVA_HOME%\bin | Terminal-Befehle java, javac |
Windows — manuell einrichten (falls der Installer es nicht automatisch tat):
- Windows-Taste drücken, "Umgebungsvariablen" eingeben → "Systemumgebungsvariablen bearbeiten" öffnen.
- Im Dialog auf "Umgebungsvariablen..." klicken.
- Unter "Systemvariablen" auf "Neu...": Name
JAVA_HOME, Wert = dein JDK-Installationspfad (z. B.C:\Program Files\Eclipse Adoptium\jdk-21.0.4.7-hotspot). - In der Liste der Systemvariablen
Pathmarkieren → "Bearbeiten..." → "Neu" → eintragen:%JAVA_HOME%\bin. - Alle Fenster mit "OK" bestätigen und jedes offene Terminal neu starten — Umgebungsvariablen werden nur beim Start eines neuen Fensters neu eingelesen.
macOS / Linux — manuell einrichten:
Öffne die Konfigurationsdatei deiner Shell (~/.zshrc bei macOS-Standard-Shell zsh, oder ~/.bashrc bei bash) und füge diese Zeilen hinzu:
export JAVA_HOME=$(/usr/libexec/java_home) export PATH=$JAVA_HOME/bin:$PATH
Danach die Shell mit source ~/.zshrc (bzw. source ~/.bashrc) neu laden, damit die Änderung sofort wirkt, ohne das Terminal zu schließen.
'java' wird nicht als interner oder externer Befehl erkannt" bedeutet fast immer einen fehlenden oder falschen PATH-Eintrag — nicht ein fehlendes JDK. Erste Fehlersuche immer: echo %PATH% (Windows) bzw. echo $PATH (Mac/Linux) prüfen.
✅ Checkpoint 2: Umgebungsvariablen gesetzt
1.4 Eclipse IDE einrichten
IDE (Integrated Development Environment)
Eine integrierte Entwicklungsumgebung bündelt Code-Editor, Compiler-Anbindung, Debugger und Projektverwaltung in einer Anwendung. Eclipse ist eine der in deutschen Ausbildungsbetrieben am weitesten verbreiteten Java-IDEs neben IntelliJ IDEA.
Workspace
Der Workspace ist der Ordner auf deiner Festplatte, in dem Eclipse alle deine Projekte, Einstellungen und Metadaten sammelt. Du kannst mehrere Workspaces haben (z. B. einen pro Ausbildungsjahr), aber Eclipse arbeitet immer nur mit einem gleichzeitig geöffneten Workspace.
- Lade den Eclipse Installer von
eclipse.org/downloadsherunter und starte ihn. - Wähle das Paket "Eclipse IDE for Java Developers" (nicht die riesige "Enterprise"-Variante — die brauchst du für den Einstieg nicht).
- Bestätige den Installationsordner und klicke "Install". Eclipse erkennt dein installiertes JDK automatisch, sofern
JAVA_HOMEkorrekt gesetzt ist. - Starte Eclipse. Beim ersten Start fragt es nach einem Workspace-Ordner — wähle z. B.
C:\Users\DeinName\eclipse-workspaceoder lasse den Vorschlag stehen. - Der "Welcome"-Bildschirm erscheint — klicke oben rechts auf das Icon mit dem Pfeil ("Workbench"), um zur eigentlichen Arbeitsoberfläche zu wechseln.
- Prüfe das installierte JDK: Menü Window → Preferences → Java → Installed JREs. Dort sollte dein JDK mit Häkchen als Standard aufgelistet sein. Falls nicht: "Add..." → "Standard VM" → Pfad zum JDK-Ordner angeben.
✅ Checkpoint 3: Eclipse startet
1.5 Dein erstes Projekt und die erste Klasse
Wir erstellen jetzt ein neues Java-Projekt und darin dein allererstes Programm: HalloWelt.java.
- In Eclipse: File → New → Java Project.
- Projektname eingeben, z. B.
MeinErstesProjekt. Die vorausgewählte JRE sollte deinem installierten JDK entsprechen. Klicke "Finish". - Falls ein Dialog "Open Associated Perspective?" erscheint: mit "Open" bestätigen.
- Im Package Explorer (linke Seitenleiste) das Projekt aufklappen → Rechtsklick auf den Ordner
src→ New → Class. - Als Name
HalloWelteingeben (Achtung: Großschreibung! Klassennamen beginnen in Java per Konvention immer groß). - Häkchen bei "public static void main(String[] args)" setzen — dann erstellt Eclipse das Programmgerüst automatisch für dich.
- Auf "Finish" klicken — die Datei
HalloWelt.javaöffnet sich im Editor.
Package
Ein Package ist ein "Ordner" für Java-Klassen, der verwandte Klassen thematisch bündelt und Namenskonflikte vermeidet — vergleichbar mit Aktenordnern in unterschiedlichen Schubladen, sodass zwei Dokumente denselben Namen tragen dürfen, solange sie in unterschiedlichen Schubladen liegen. Für den Einstieg arbeiten wir zunächst im "Default Package".
Ersetze den generierten Inhalt durch folgenden vollständigen, sofort lauffähigen Code:
1public class HalloWelt { 2 public static void main(String[] args) { 3 System.out.println("Hallo Welt! Mein erstes Java-Programm läuft."); 4 } 5}
public class HalloWelt { — Wir erklären eine neue Klasse namens HalloWelt. public bedeutet: von überall im Programm sichtbar. Der Dateiname HalloWelt.java muss exakt mit dem Klassennamen übereinstimmen — das ist eine feste Java-Regel, keine Empfehlung. Die geschweifte Klammer { öffnet den "Körper" der Klasse.public static void main(String[] args) { — Das ist die main-Methode, der feste Startpunkt jedes Java-Programms. Die JVM sucht beim Start automatisch genau nach dieser Signatur. static bedeutet: Die Methode gehört zur Klasse selbst, es muss dafür kein Objekt erzeugt werden. void bedeutet: Die Methode gibt keinen Wert zurück. String[] args ist ein Array für Kommandozeilenargumente, die dem Programm beim Start mitgegeben werden können.System.out.println(...) — System.out ist der Standard-Ausgabestrom (die Konsole). println ("print line") gibt den Text aus und springt danach in eine neue Zeile. Der Text in Anführungszeichen ist ein String-Literal — ein fest im Code stehender Textwert.} — schließt den Körper der main-Methode.} — schließt den Körper der Klasse HalloWelt.HalloWelt.class (den Bytecode) in einen Speicherbereich namens Method Area. Die JVM sucht darin nach der main-Methode und legt für ihren Aufruf einen Stack Frame auf dem Call Stack an — das ist der "Notizzettel-Stapel", auf dem gerade laufende Methodenaufrufe verwaltet werden. Zeile für Zeile wird jetzt abgearbeitet: System.out.println(...) wird aufgerufen, gibt den Text auf der Konsole aus, und sobald die letzte schließende Klammer erreicht ist, wird der Stack Frame der main-Methode wieder vom Stack entfernt und das Programm beendet sich.✅ Checkpoint 4: Projekt und Klasse erstellt
1.6 Kompilieren und Ausführen
Es gibt zwei Wege, dein Programm zum Laufen zu bringen: über die IDE (bequem, mit einem Klick) und über die Kommandozeile (wichtig, um wirklich zu verstehen, was dahintersteckt — und IHK-relevant, da Prüfungen oft nach dem reinen Kommandozeilen-Ablauf fragen).
Weg A — In Eclipse
- Rechtsklick auf
HalloWelt.javaim Package Explorer. - Run As → Java Application wählen.
- Unten öffnet sich die Konsole (Console-View) mit der Ausgabe deines Programms.
Weg B — Über die Kommandozeile
Öffne ein Terminal im Ordner, der HalloWelt.java enthält, und führe aus:
# Schritt 1: Quellcode zu Bytecode kompilieren javac HalloWelt.java # Schritt 2: Den erzeugten Bytecode mit der JVM ausführen java HalloWelt
HalloWelt.java, prüft die Syntax und erzeugt bei Erfolg eine neue Datei HalloWelt.class im selben Ordner — den Bytecode. Bei einem Syntaxfehler (z. B. vergessenes Semikolon) bricht javac mit einer Fehlermeldung ab, und es entsteht keine .class-Datei..class. Wichtig: Man ruft hier den Klassennamen auf, nicht den Dateinamen — bei javac ist es umgekehrt der Dateiname inklusive .java.javac Dateiname.java (mit Endung, Compiler) vs. java Klassenname (ohne Endung, JVM-Start). Verwechselst du das, meldet die JVM z. B. Error: Could not find or load main class HalloWelt.java.
Warum heißt die Ausgabedatei .class und nicht .exe?
Eine .exe-Datei enthält fertigen Maschinencode für genau ein Betriebssystem/eine Prozessorarchitektur. Eine .class-Datei enthält plattformunabhängigen Bytecode, den jede JVM lesen kann — egal auf welchem Betriebssystem sie läuft. Genau das ist der Kern der Plattformunabhängigkeit von Java.
Die erwartete Ausgabe in beiden Fällen:
Hallo Welt! Mein erstes Java-Programm läuft.
✅ Checkpoint 5: Programm läuft über Eclipse
✅ Checkpoint 6: Programm läuft über die Kommandozeile
Java-Grundlagen: Datentypen, Variablen, Operatoren & Ein-/Ausgabe
Jetzt, wo die Werkstatt steht, bauen wir das Fundament der Sprache selbst: Wie speichert Java Werte, wie rechnet man damit, und wie redet ein Programm eigentlich mit dem Menschen davor? Das sind die Bausteine, aus denen jedes einzelne Java-Programm besteht, das du je schreiben wirst.
2.1 Variablen
Variable
Ein benannter Speicherplatz im Arbeitsspeicher (RAM), der einen Wert eines bestimmten Datentyps enthält und dessen Inhalt sich während der Programmlaufzeit ändern kann. Der Name identifiziert die Variable eindeutig innerhalb ihres Gültigkeitsbereichs (Scope).
Deklaration
Die Ankündigung einer neuen Variable gegenüber dem Compiler: Name und Datentyp werden festgelegt, z. B. int alter;. Ab diesem Zeitpunkt reserviert die JVM Speicherplatz in der passenden Größe für diese Variable, sie enthält aber noch keinen sinnvollen Wert.
Initialisierung
Die erste Wertzuweisung an eine Variable, z. B. alter = 16;. Deklaration und Initialisierung lassen sich in einer Zeile kombinieren: int alter = 16;. Lokale Variablen in Methoden haben — anders als Attribute in Klassen — keinen automatischen Startwert und müssen vor der ersten Nutzung zwingend initialisiert werden, sonst meldet der Compiler einen Fehler.
1public class Variablen { 2 public static void main(String[] args) { 3 int alter; 4 alter = 16; 5 int schuljahr = 11; 6 System.out.println("Alter: " + alter); 7 System.out.println("Schuljahr: " + schuljahr); 8 } 9}
int alter; — Deklaration: Es wird Speicherplatz für eine Ganzzahl reserviert, aber noch kein Wert hineingelegt.alter = 16; — Zuweisung (Initialisierung): Der Wert 16 wird in den zuvor reservierten Speicherplatz geschrieben. = ist hier der Zuweisungsoperator, kein Gleichheitszeichen im mathematischen Sinn!int schuljahr = 11; — Deklaration und Initialisierung in einem Schritt, der in der Praxis übliche Weg.+-Operator verkettet hier Text und Zahl zu einem neuen String — Java wandelt die Zahl dafür automatisch in Text um.camelCase (z. B. maxAnzahlVersuche). Reservierte Schlüsselwörter wie class, public, int oder if dürfen niemals als Bezeichner verwendet werden. Namen dürfen nicht mit einer Ziffer beginnen und enthalten keine Leer- oder Sonderzeichen außer _ und $.
✅ Checkpoint 7: Variablen deklariert und ausgegeben
2.2 Primitive Datentypen
byte) passt nur für ganz kleine Zahlen. Ein riesiger Kleiderschrank (long) passt für gigantische Zahlen — verschwendet aber Platz, wenn du nur eine einzige Murmel hineinlegst.Primitiver Datentyp
Einer von 8 fest in Java eingebauten, elementaren Datentypen. Primitive Variablen speichern ihren Wert direkt im Stack-Speicher (nicht als Verweis) und haben eine feste, garantierte Speichergröße — unabhängig vom Betriebssystem, im Gegensatz z. B. zu C.
| Typ | Größe | Wertebereich | Standardwert |
|---|---|---|---|
byte | 8 Bit | −128 … 127 | 0 |
short | 16 Bit | −32.768 … 32.767 | 0 |
int | 32 Bit | ≈ −2,1 Mrd. … 2,1 Mrd. | 0 |
long | 64 Bit | ≈ −9,2 Trillionen … 9,2 Trillionen | 0L |
float | 32 Bit | Gleitkommazahl, ~7 Nachkommastellen genau | 0.0f |
double | 64 Bit | Gleitkommazahl, ~15 Nachkommastellen genau | 0.0d |
char | 16 Bit | ein einzelnes Unicode-Zeichen ('A', 'ß', …) | '\u0000' |
boolean | 1 Bit (konzeptuell) | true oder false | false |
Type Casting (Typumwandlung)
Implizites Casting (Widening): Eine "kleinere" Kiste passt automatisch in eine "größere" — Java wandelt selbstständig um, z. B. int → double, ohne Datenverlust.
Explizites Casting (Narrowing): Der umgekehrte Weg (große Kiste → kleine Kiste) kann Werte abschneiden und muss deshalb vom Programmierer ausdrücklich erzwungen werden, z. B. (int) 9.7 ergibt 9 — Nachkommastellen werden dabei abgeschnitten, nicht gerundet.
1public class Datentypen { 2 public static void main(String[] args) { 3 double preis = 9.99; 4 int ganzePreis = (int) preis; 5 char note = 'A'; 6 boolean bestanden = true; 7 System.out.println("Gerundet ab: " + ganzePreis); 8 System.out.println("Note: " + note + ", bestanden: " + bestanden); 9 } 10}
(int) preis ist ein explizites Narrowing-Cast: 9.99 wird zu 9 — die Nachkommastellen werden schlicht abgeschnitten (kein Runden!). Das ist eine der häufigsten IHK-Fallen.char-Literale stehen in einfachen Anführungszeichen ('A'), String-Literale in doppelten ("A") — das sind zwei unterschiedliche Datentypen!float-Literale benötigen zwingend das Suffix f (z. B. 3.5f), sonst interpretiert der Compiler die Zahl standardmäßig als double und meldet einen Fehler bei der Zuweisung an eine float-Variable ohne Cast.
✅ Checkpoint 8: Datentypen & Casting verstanden
2.3 Referenztypen & der Sonderfall String
Referenztyp
Variablen von Referenztypen (alle Klassen, also auch String, Arrays, eigene Objekte) speichern im Stack nicht den Wert selbst, sondern eine Referenz (Speicheradresse) auf ein Objekt im Heap-Speicher. Mehrere Variablen können auf dasselbe Objekt zeigen.
String-Pool
Java legt String-Literale (direkt im Code geschriebene Texte) in einem speziellen, wiederverwendbaren Speicherbereich ab, dem String-Pool. Zwei mit "..." geschriebene identische Texte zeigen deshalb oft auf dasselbe Objekt — bei new String("...") wird dagegen immer ein neues, separates Objekt auf dem Heap erzeugt.
null
null ist der spezielle Wert, der besagt: "Diese Referenzvariable zeigt aktuell auf kein Objekt." Nur Referenztypen können null sein — primitive Typen wie int niemals. Der Versuch, auf einem null-Objekt eine Methode aufzurufen, wirft zur Laufzeit eine NullPointerException.
String-Inhalten immer .equals() verwenden, nicht ==! == vergleicht bei Referenztypen nur, ob zwei Variablen auf dasselbe Objekt zeigen — nicht, ob der Inhalt gleich ist. Ein häufiger, gezielt geprüfter Anfängerfehler.
✅ Checkpoint 9: Primitiv vs. Referenz
2.4 Operatoren
Operatoren sind die Rechenzeichen und Vergleichswerkzeuge, mit denen du Werte kombinierst, vergleichst und veränderst.
| Kategorie | Operatoren | Beispiel |
|---|---|---|
| Arithmetisch | + − * / % | 7 % 2 → 1 (Rest der Division) |
| Zuweisung | = += -= *= /= | x += 5; entspricht x = x + 5; |
| Vergleich | == != < > <= >= | alter >= 18 → boolean |
| Logisch | && \|\| ! | istWach && hatKaffee |
| Inkrement/Dekrement | ++ -- | zaehler++; |
Ganzzahlige Division
Teilst du zwei int-Werte, liefert Java ein int-Ergebnis — Nachkommastellen fallen komplett weg (kein Runden): 7 / 2 ergibt 3, nicht 3.5. Soll das Ergebnis eine Kommazahl sein, muss mindestens einer der beiden Operanden ein double/float sein, z. B. 7.0 / 2.
Kurzschlussauswertung (Short-Circuit-Evaluation)
Bei && und || wertet Java den zweiten Operanden nur aus, wenn er das Ergebnis noch beeinflussen kann: Bei false && irgendwas wird irgendwas gar nicht mehr geprüft, da das Gesamtergebnis schon feststeht. Das wird gezielt genutzt, um z. B. NullPointerExceptions zu vermeiden: objekt != null && objekt.methode().
1public class Operatoren { 2 public static void main(String[] args) { 3 int a = 7, b = 2; 4 System.out.println("a / b = " + (a / b)); 5 System.out.println("a % b = " + (a % b)); 6 boolean volljaehrig = a >= 18; 7 System.out.println("Volljährig: " + volljaehrig); 8 a++; 9 System.out.println("a nach a++: " + a); 10 } 11}
a / b → 3: ganzzahlige Division, da beide Operanden int sind.a % b → 1: der Modulo-Operator liefert den Rest der Division (7 = 3×2 + 1).a++ ist gleichbedeutend mit a = a + 1; — a war 7, ist danach 8.✅ Checkpoint 10: Operatoren angewendet
2.5 Konsolen-Ein-/Ausgabe mit Scanner
Scanner ist wie ein Ohr, das an der Tastatur klebt und wartet, bis du etwas eintippst und Enter drückst.Scanner
Scanner ist eine Klasse aus dem Paket java.util, die Eingabequellen (z. B. die Tastatur über System.in) einliest und in nutzbare Datentypen zerlegt. Sie muss vor Gebrauch importiert werden: import java.util.Scanner;.
import
Eine import-Anweisung teilt dem Compiler mit, welche Klasse aus welchem Package du verwenden willst, damit du sie nicht jedes Mal mit ihrem vollen Namen (java.util.Scanner) ausschreiben musst. import-Zeilen stehen immer ganz oben in der Datei, vor der Klassendefinition.
1import java.util.Scanner; 2 3public class Begruessung { 4 public static void main(String[] args) { 5 Scanner eingabe = new Scanner(System.in); 6 System.out.print("Wie heißt du? "); 7 String name = eingabe.nextLine(); 8 System.out.print("Wie alt bist du? "); 9 int alter = eingabe.nextInt(); 10 System.out.println("Hallo " + name + ", mit " + alter + " Jahren geht's los!"); 11 eingabe.close(); 12 } 13}
new Scanner(System.in) erzeugt ein neues Scanner-Objekt auf dem Heap, das an den Tastatur-Eingabestrom System.in gekoppelt ist. Die Referenz darauf wird in eingabe gespeichert.print (ohne "ln") gibt Text ohne Zeilenumbruch aus — praktisch, damit die Nutzereingabe direkt hinter dem Fragetext erscheint.nextLine() liest die komplette Zeile bis zum Zeilenumbruch als String ein und wartet dabei, bis Enter gedrückt wird.nextInt() liest nur das nächste Token als int, der Zeilenumbruch danach bleibt im Eingabepuffer stehen — die klassische Ursache für den unten beschriebenen Fehler.close() gibt die Systemressource des Scanners wieder frei. Guter Stil, sobald keine weitere Eingabe mehr folgt.nextInt(), nextDouble() o. Ä. direkt ein nextLine(), liest dieses scheinbar nur den übrig gebliebenen, leeren Zeilenumbruch ein — die Abfrage wird komplett übersprungen! Lösung: Nach einer Zahlen-Eingabe einmal "blind" eingabe.nextLine(); zum Leeren des Puffers einschieben, bevor die nächste Text-Eingabe folgt.
✅ Checkpoint 11: Scanner benutzt
2.6 Pseudocode-Grundlagen
Pseudocode
Eine informelle, sprachunabhängige Notation zur Beschreibung von Algorithmen, die Programmierlogik (Verzweigungen, Schleifen, Ein-/Ausgabe) klar strukturiert, ohne sich an die genaue Syntax einer bestimmten Sprache zu halten. In der IHK-Prüfung wird Pseudocode oft alternativ zu einem Programmablaufplan (PAP) oder Struktogramm (Nassi-Shneiderman-Diagramm) verwendet, um Algorithmen zu beschreiben oder zu bewerten.
Programmablaufplan (PAP)
Eine genormte, grafische Darstellung eines Algorithmus mit festgelegten Symbolen nach DIN 66001: Rauten für Entscheidungen, Rechtecke für Verarbeitungsschritte, Parallelogramme für Ein-/Ausgabe, Pfeile für den Kontrollfluss. IHK-Prüfungen verlangen regelmäßig, einen PAP in Java-Code zu übersetzen oder umgekehrt.
Struktogramm (Nassi-Shneiderman-Diagramm)
Eine blockorientierte Alternative zum PAP: Der Algorithmus wird als verschachtelte Kästen dargestellt, ohne Pfeile — Reihenfolge ergibt sich rein aus der Anordnung von oben nach unten. Besonders gut geeignet, um Schleifen und Verzweigungen übersichtlich zu verschachteln.
Eine gängige Pseudocode-Konvention für die Bausteine aus diesem Kapitel:
| Java | Pseudocode |
|---|---|
int alter = 16; | DEKLARIERE alter ALS GANZZAHL |
eingabe.nextInt() | LIES alter |
System.out.println(...) | GIB AUS alter |
a + b | a + b (Rechenzeichen bleiben gleich) |
START GIB AUS "Wie heißt du?" LIES name GIB AUS "Wie alt bist du?" LIES alter GIB AUS "Hallo " + name + ", mit " + alter + " Jahren geht's los!" ENDE
Genau dieser Pseudocode wurde in Kapitel 2.5 eins zu eins zu echtem Java-Code (Begruessung.java) ausgebaut. Dieses Muster — erst Pseudocode, dann Java — ziehen wir ab Teil 3 durch alle Kontrollstrukturen konsequent durch, da genau das in der IHK-Prüfung als Übersetzungsaufgabe abgefragt wird.
✅ Checkpoint 12: Pseudocode verstanden
Kontrollstrukturen: Entscheidungen & Wiederholungen
Bisher liefen unsere Programme immer stur von oben nach unten ab. Jetzt lernt dein Programm zwei neue Fähigkeiten: Entscheidungen treffen (je nach Situation etwas anderes tun) und Dinge wiederholen (dieselbe Aufgabe mehrfach erledigen, ohne den Code zu duplizieren). Das sind die Bausteine, die aus einer starren Befehlsliste ein echtes, reagierendes Programm machen.
3.1 Verzweigungen: if / else
if ist wie eine Weiche bei der Modelleisenbahn: Der Zug (dein Programm) rollt bis zur Weiche, und je nachdem, ob eine Bedingung erfüllt ist oder nicht, fährt er nach links (if-Block) oder nach rechts (else-Block) weiter.Boolescher Ausdruck (Bedingung)
Ein Ausdruck, der zu genau einem Wert vom Typ boolean ausgewertet wird — entweder true oder false. Anders als z. B. in C akzeptiert Java in einer if-Bedingung ausschließlich echte boolean-Werte, niemals Ganzzahlen wie 0 oder 1 als Ersatz.
Block (Anweisungsblock)
Eine oder mehrere Anweisungen, die durch geschweifte Klammern { } zu einer logischen Einheit zusammengefasst werden. Bei genau einer Anweisung sind die Klammern optional, werden aus Lesbarkeits- und Fehlervermeidungsgründen in der Praxis aber fast immer trotzdem gesetzt.
1public class Notenpruefung { 2 public static void main(String[] args) { 3 int punkte = 72; 4 if (punkte >= 90) { 5 System.out.println("Note: sehr gut"); 6 } else if (punkte >= 70) { 7 System.out.println("Note: gut"); 8 } else if (punkte >= 50) { 9 System.out.println("Note: befriedigend"); 10 } else { 11 System.out.println("Note: nicht bestanden"); 12 } 13 } 14}
punkte >= 90. Da 72 >= 90 falsch ist, wird der Block in Z. 5 übersprungen und zur nächsten Bedingung gesprungen.punkte >= 70 → 72 >= 70 ist true. Der Block in Z. 7 wird ausgeführt, und die gesamte restliche Kette (Z. 8–12) wird übersprungen — es wird immer nur genau ein Zweig betreten.else ohne eigene Bedingung ist der Auffangzweig — er greift nur, wenn keine vorherige Bedingung true war.else if-Ketten wird immer nur ein einziger Zweig ausgeführt, und die Reihenfolge der Bedingungen ist entscheidend: Stünde punkte >= 50 als erste Prüfung, würden auch alle Schüler mit 95 Punkten fälschlich nur "befriedigend" bekommen, weil die erste zutreffende Bedingung sofort gewinnt.
START
SETZE punkte = 72
WENN punkte >= 90 DANN
GIB AUS "sehr gut"
SONST WENN punkte >= 70 DANN
GIB AUS "gut"
SONST WENN punkte >= 50 DANN
GIB AUS "befriedigend"
SONST
GIB AUS "nicht bestanden"
ENDE WENN
ENDE
✅ Checkpoint 13: if/else-Kette gebaut
3.2 switch-case
switch ist wie eine Drehscheibe im Bahnhof: Statt vieler einzelner Weichen hintereinander gibt es einen zentralen Verteiler, der den Zug direkt zum passenden Gleis schickt — praktisch, wenn du viele feste, konkrete Werte statt Bereiche prüfst.case
Eine mögliche Sprungmarke innerhalb eines switch-Blocks, die mit einem konkreten, konstanten Wert verglichen wird (int, char, String, enum sind zulässig — keine Bereiche wie > 5).
break (im switch)
Beendet den switch-Block sofort und springt hinter die schließende Klammer. Ohne break läuft die Ausführung in den nächsten case-Block weiter durch (Fallthrough) — selbst wenn dessen Bedingung gar nicht mehr geprüft wird!
Fallthrough
Das (oft ungewollte) Durchfallen in den nächsten case-Block, weil das vorherige break fehlt. Manchmal wird das absichtlich genutzt, um mehrere case-Werte dieselbe Aktion ausführen zu lassen (mehrere case-Zeilen direkt untereinander, ohne break dazwischen).
default
Der Auffangzweig eines switch-Blocks, vergleichbar mit else bei if. Wird ausgeführt, wenn kein case-Wert passt. Konvention: default steht meist als letzter Zweig, kann syntaktisch aber an beliebiger Stelle stehen.
1public class Wochentag { 2 public static void main(String[] args) { 3 int tag = 6; 4 switch (tag) { 5 case 6: 6 case 7: 7 System.out.println("Wochenende!"); 8 break; 9 default: 10 System.out.println("Werktag"); 11 } 12 } 13}
case-Zeilen direkt hintereinander ohne break dazwischen: absichtlicher Fallthrough — sowohl 6 als auch 7 landen im selben Ausgabe-Block.break; beendet den switch — ohne dieses break würde die Ausführung auch noch default mit ausführen!START
SETZE tag = 6
WÄHLE tag
FALL 6, 7:
GIB AUS "Wochenende!"
SONST:
GIB AUS "Werktag"
ENDE WÄHLE
ENDE
break ist einer der klassischsten Java-Fehler in Prüfungsaufgaben ("Was ist die Ausgabe?"). Prüfe bei jeder switch-Aufgabe genau, ob und wo break-Anweisungen stehen — ihr Fehlen führt zum Durchfallen in alle folgenden Zweige bis zum nächsten break oder Blockende.
✅ Checkpoint 14: switch-case & Fallthrough verstanden
3.3 Die for-Schleife
for-Schleife ist wie ein Karussell mit einer festgelegten Rundenzahl: Du weißt vorher genau, wie oft es sich dreht (z. B. "genau 10 Runden"), bevor es wieder anhält.Schleifenkopf
Die Kopfzeile einer for-Schleife besteht aus drei durch Semikolon getrennten Teilen: Initialisierung (einmalig vor der ersten Runde), Bedingung (vor jeder Runde geprüft — solange true, läuft die Schleife weiter) und Inkrement/Update (nach jeder Runde ausgeführt).
Zählschleife
Eine Schleife, bei der die Anzahl der Durchläufe bereits vor dem Start feststeht oder berechenbar ist — der klassische Anwendungsfall für for. Im Gegensatz dazu eignen sich while/do-while besser, wenn die Anzahl der Durchläufe von einer sich während der Laufzeit ändernden Bedingung abhängt.
1public class Countdown { 2 public static void main(String[] args) { 3 for (int i = 1; i <= 5; i++) { 4 System.out.println("Runde " + i); 5 } 6 System.out.println("Fertig!"); 7 } 8}
int i = 1 — einmalige Initialisierung der Zählvariable i beim Start. i <= 5 — vor jeder Runde geprüfte Bedingung; ist sie false, endet die Schleife sofort. i++ — nach jeder abgeschlossenen Runde ausgeführtes Update.6<=5 falsch → Schleife endet, "Fertig!" wird ausgegeben).START
FÜR i VON 1 BIS 5 SCHRITTWEITE 1
GIB AUS "Runde " + i
ENDE FÜR
GIB AUS "Fertig!"
ENDE
i < 5 läuft 5-mal, für i = 0 bis 4 (bei Start bei 0). i <= 5 läuft 6-mal, für i = 0 bis 5. Diese "Off-by-one"-Stolperfalle (eine Runde zu viel oder zu wenig) ist einer der häufigsten Fehler bei Schleifen und wird in Prüfungen gezielt mit "Wie oft läuft diese Schleife?"-Fragen abgeprüft.
✅ Checkpoint 15: for-Schleife gebaut
3.4 while- und do-while-Schleife
while ist ein Türsteher, der VOR jedem Betreten des Raums die Bedingung prüft — wer nicht reindarf, kommt gar nicht erst rein. do-while ist ein Türsteher, der erst NACH dem ersten Betreten kontrolliert — jeder darf mindestens einmal rein, egal was die Bedingung sagt.Kopfgesteuerte Schleife
Die Bedingung wird vor jedem Schleifendurchlauf geprüft (while, for). Ist sie von Anfang an false, wird der Schleifenkörper kein einziges Mal ausgeführt.
Fußgesteuerte Schleife
Die Bedingung wird nach jedem Schleifendurchlauf geprüft (do-while). Der Schleifenkörper wird deshalb garantiert mindestens einmal ausgeführt — selbst wenn die Bedingung von Anfang an falsch ist.
Endlosschleife
Eine Schleife, deren Abbruchbedingung niemals false wird (z. B. weil die Zählvariable vergessen wurde zu erhöhen). Führt dazu, dass das Programm "hängt" und nicht mehr reagiert — ein häufiger, gezielt in Prüfungscode versteckter Fehler.
1import java.util.Scanner; 2 3public class Eingabepruefung { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 int zahl = -1; 7 while (zahl < 0 || zahl > 100) { 8 System.out.print("Zahl zwischen 0 und 100: "); 9 zahl = sc.nextInt(); 10 } 11 System.out.println("Danke, du hast " + zahl + " eingegeben."); 12 sc.close(); 13 } 14}
zahl = -1 ist ein bewusst ungültiger Startwert — er sorgt dafür, dass die Bedingung in Z. 7 beim allerersten Check garantiert true ist, damit die Schleife überhaupt einmal betreten wird.zahl außerhalb von 0–100 liegt, wird der Block wiederholt. Die Bedingung wird vor jeder Runde neu geprüft.zahl einen echten, vom Nutzer eingegebenen Wert — der die Bedingung beim nächsten Check eventuell zu false macht und die Schleife beendet.1public class MindestensEinmal { 2 public static void main(String[] args) { 3 int versuch = 0; 4 do { 5 versuch++; 6 System.out.println("Versuch Nr. " + versuch); 7 } while (versuch < 3); 8 } 9}
versuch < 3 bei versuch=3 false wird.SOLANGE zahl < 0 ODER zahl > 100 TU LIES zahl ENDE SOLANGE WIEDERHOLE versuch = versuch + 1 GIB AUS versuch BIS versuch >= 3
while lautet die Antwort 0-mal (kopfgesteuert), bei do-while immer mindestens 1-mal (fußgesteuert). Dieser Unterschied ist ein Standard-Vergleichspaar in FISI/FIAE-Prüfungen.
✅ Checkpoint 16: while & do-while unterschieden
3.5 break & continue
break ist der Notausstieg — sofort raus aus der ganzen Schleife. continue ist eher ein "diese Runde überspringen" — du bleibst im Karussell, lässt aber diese eine Runde aus und machst direkt mit der nächsten weiter.break (in Schleifen)
Beendet die gesamte umschließende Schleife sofort, unabhängig davon, ob die eigentliche Abbruchbedingung erfüllt ist. Die Ausführung springt direkt zur ersten Anweisung nach der Schleife.
continue
Bricht nur den aktuellen Schleifendurchlauf ab und springt direkt zur nächsten Prüfung der Schleifenbedingung (bei for: erst wird noch das Inkrement ausgeführt). Der restliche Code im Schleifenkörper dieser Runde wird übersprungen.
1public class BreakContinue { 2 public static void main(String[] args) { 3 for (int i = 1; i <= 10; i++) { 4 if (i == 7) { 5 break; 6 } 7 if (i % 2 == 0) { 8 continue; 9 } 10 System.out.println(i); 11 } 12 } 13}
1, 3, 5 — bei i=7 beendet break die Schleife komplett (7 wird nie ausgegeben); bei geraden Zahlen (2, 4, 6) überspringt continue nur die Ausgabezeile 10, die Schleife läuft aber weiter.✅ Checkpoint 17: break & continue unterschieden
3.6 Verschachtelung in der Praxis: FizzBuzz
Zum Abschluss kombinieren wir alles aus Teil 3 in einem einzigen, in der IT-Ausbildung berühmten Übungsklassiker: FizzBuzz. Die Regel: Zähle von 1 bis 20. Ist die Zahl durch 3 und 5 teilbar, gib "FizzBuzz" aus. Ist sie nur durch 3 teilbar, gib "Fizz" aus. Nur durch 5 teilbar: "Buzz". Sonst die Zahl selbst.
START
FÜR i VON 1 BIS 20 SCHRITTWEITE 1
WENN (i MOD 3 == 0) UND (i MOD 5 == 0) DANN
GIB AUS "FizzBuzz"
SONST WENN i MOD 3 == 0 DANN
GIB AUS "Fizz"
SONST WENN i MOD 5 == 0 DANN
GIB AUS "Buzz"
SONST
GIB AUS i
ENDE WENN
ENDE FÜR
ENDE
1public class FizzBuzz { 2 public static void main(String[] args) { 3 for (int i = 1; i <= 20; i++) { 4 if (i % 3 == 0 && i % 5 == 0) { 5 System.out.println("FizzBuzz"); 6 } else if (i % 3 == 0) { 7 System.out.println("Fizz"); 8 } else if (i % 5 == 0) { 9 System.out.println("Buzz"); 10 } else { 11 System.out.println(i); 12 } 13 } 14 } 15}
&& verlangt, dass beide Teilausdrücke true sind — Kurzschlussauswertung aus Kapitel 2.4 in Aktion.✅ Checkpoint 18: FizzBuzz läuft
Objektorientierte Programmierung (OOP)
Jetzt kommt das Herzstück von Java. Bisher haben wir Daten und Logik getrennt in einer einzigen main-Methode zusammengewürfelt. OOP bringt beides zusammen in Bausteinen, die reale Dinge abbilden — Hunde, Autos, Bankkonten. Das ist der größte gedankliche Sprung im ganzen Kurs, also nehmen wir ihn Schritt für Schritt.
4.1 Klassen & Objekte
Klasse
Ein Bauplan (Blaupause), der beschreibt, welche Attribute (Zustand/Daten) und Methoden (Verhalten/Fähigkeiten) Objekte dieses Typs besitzen. Eine Klasse selbst belegt zur Laufzeit nur einmal Speicher (im Method Area der JVM) — sie ist der Plan, kein konkretes Ding.
Objekt (Instanz)
Ein konkretes, zur Laufzeit im Heap-Speicher erzeugtes Exemplar einer Klasse mit eigenen, individuellen Attributwerten. Der Vorgang der Erzeugung heißt Instanziierung. Von einer Klasse können beliebig viele unabhängige Objekte existieren.
Attribut (Instanzvariable)
Eine Variable, die innerhalb einer Klasse, aber außerhalb jeder Methode deklariert wird und den Zustand eines Objekts beschreibt. Jedes Objekt besitzt seine eigene, unabhängige Kopie der Attributwerte.
new-Operator
Der Operator, der ein neues Objekt auf dem Heap erzeugt und dessen Konstruktor aufruft. Das Ergebnis ist eine Referenz auf das neue Objekt, die in einer Variablen gespeichert werden kann, z. B. Hund bello = new Hund();.
1public class Hund { 2 String name; 3 String rasse; 4 int alter; 5}
1public class HundeTest { 2 public static void main(String[] args) { 3 Hund bello = new Hund(); 4 bello.name = "Bello"; 5 bello.rasse = "Dackel"; 6 bello.alter = 3; 7 8 Hund rex = new Hund(); 9 rex.name = "Rex"; 10 rex.rasse = "Schäferhund"; 11 rex.alter = 5; 12 13 System.out.println(bello.name + " ist ein " + bello.alter + " Jahre alter " + bello.rasse); 14 System.out.println(rex.name + " ist ein " + rex.alter + " Jahre alter " + rex.rasse); 15 } 16}
new Hund() erzeugt ein eigenständiges Hund-Objekt auf dem Heap. Die Variable bello auf dem Stack speichert nur eine Referenz (Adresse) darauf — nicht das Objekt selbst.bello.name = "Bello" greift über die Referenz auf das Heap-Objekt zu (Punktnotation) und setzt dort das Attribut. Da jedes Attribut ohne explizite Initialisierung automatisch einen Standardwert hätte (null bei String, 0 bei int), müssen wir sie hier bewusst befüllen.rex ist ein komplett separates Objekt an einer anderen Heap-Adresse — Änderungen an rex haben null Einfluss auf bello, obwohl beide vom selben Bauplan (derselben Klasse) stammen.KLASSE Hund ATTRIBUT name: TEXT ATTRIBUT rasse: TEXT ATTRIBUT alter: GANZZAHL ENDE KLASSE START ERZEUGE bello ALS NEUES Hund SETZE bello.name = "Bello" SETZE bello.rasse = "Dackel" SETZE bello.alter = 3 GIB AUS bello.name ENDE
✅ Checkpoint 19: Klasse & zwei Objekte erstellt
4.2 Methoden
Methode
Ein benannter, wiederverwendbarer Codeblock innerhalb einer Klasse, der eine bestimmte Fähigkeit oder Berechnung kapselt. Methoden können Eingabewerte (Parameter) entgegennehmen und optional einen Wert zurückgeben.
Parameter vs. Argument
Parameter ist der Platzhalter-Name in der Methodendefinition (z. B. String neuerName in void umbenennen(String neuerName)). Argument ist der konkrete Wert, der beim tatsächlichen Aufruf übergeben wird (z. B. bello.umbenennen("Fido") — hier ist "Fido" das Argument).
Methodensignatur
Name der Methode + Anzahl, Typ und Reihenfolge ihrer Parameter (der Rückgabetyp zählt NICHT zur Signatur). Zwei Methoden mit gleichem Namen müssen sich in ihrer Signatur unterscheiden — das ist die Grundlage für Method Overloading.
Overloading (Methodenüberladung)
Mehrere Methoden mit demselben Namen, aber unterschiedlicher Parameterliste, innerhalb derselben Klasse. Der Compiler entscheidet anhand der übergebenen Argumente zur Kompilierzeit, welche Version aufgerufen wird — nicht zu verwechseln mit Overriding (Kapitel 4.5).
1public class Hund { 2 String name; 3 int alter; 4 5 void bellen() { 6 System.out.println(name + " sagt: Wuff!"); 7 } 8 9 int jahreAlsMensch() { 10 return alter * 7; 11 } 12 13 void umbenennen(String neuerName) { 14 name = neuerName; 15 } 16}
void bellen() — void heißt: kein Rückgabewert, die Methode gibt lediglich Text aus (einen Seiteneffekt) statt einen Wert zurückzugeben.int jahreAlsMensch() — der Rückgabetyp int verlangt zwingend ein return mit einem passenden Wert. return alter * 7; beendet die Methode sofort und liefert das Ergebnis an den Aufrufer zurück.umbenennen(String neuerName) nimmt einen Parameter entgegen und überschreibt das Attribut name des Objekts, auf dem die Methode aufgerufen wurde.✅ Checkpoint 20: Methoden mit & ohne Rückgabewert
4.3 Konstruktoren
Konstruktor
Eine spezielle, methodenähnliche Struktur, die beim new-Aufruf automatisch ausgeführt wird, um ein Objekt zu initialisieren. Ein Konstruktor trägt denselben Namen wie die Klasse und hat keinen Rückgabetyp — auch nicht void.
Standardkonstruktor
Definiert eine Klasse keinen eigenen Konstruktor, erzeugt der Compiler automatisch einen parameterlosen Standardkonstruktor, der alle Attribute mit ihren Default-Werten belässt. Sobald du irgendeinen eigenen Konstruktor schreibst, entfällt dieser automatische Standardkonstruktor ersatzlos.
this
Ein Schlüsselwort, das innerhalb einer Instanzmethode oder eines Konstruktors auf das aktuelle Objekt selbst verweist. Besonders wichtig, wenn ein Parametername identisch mit einem Attributnamen ist — this.name meint dann das Attribut, name allein meint den Parameter.
1public class Hund { 2 String name; 3 int alter; 4 5 Hund(String name, int alter) { 6 this.name = name; 7 this.alter = alter; 8 } 9 10 Hund(String name) { 11 this(name, 0); 12 } 13}
Hund, hat keinen Rückgabetyp.this.name = name; — links vom = ist this.name das Attribut des Objekts, rechts ist name der Parameter. Ohne this wüsste Java nicht, welches der beiden gemeint ist (Namensgleichheit / "Shadowing").this(name, 0); ruft den anderen Konstruktor (Z. 5) mit alter=0 auf — so wird Code nicht doppelt geschrieben. Ein solcher this(...)-Aufruf muss immer die erste Zeile im Konstruktor sein.new Hund() würde im obigen Beispiel einen Kompilierfehler erzeugen, weil kein passender parameterloser Konstruktor existiert.
✅ Checkpoint 21: Konstruktoren & this
4.4 Kapselung: Getter & Setter
Kapselung (Encapsulation)
Eines der vier Grundprinzipien der OOP: Attribute werden vor direktem Zugriff von außen geschützt (meist private) und nur über kontrollierte, öffentliche Methoden (Getter/Setter) erreichbar gemacht. Ziel: Datenintegrität sichern, interne Umsetzung frei änderbar halten, ohne den Code anderer zu brechen.
Zugriffsmodifizierer
private: nur innerhalb derselben Klasse sichtbar.
(package-private, kein Schlüsselwort): sichtbar innerhalb desselben Packages.
protected: sichtbar im Package + für Unterklassen (auch in anderen Packages).
public: von überall sichtbar.
Getter & Setter
Getter (z. B. getName()) liest ein privates Attribut kontrolliert aus. Setter (z. B. setName(String n)) schreibt es kontrolliert — und kann dabei Prüfungen (Validierung) einbauen, z. B. verhindern, dass ein Alter negativ wird.
1public class Konto { 2 private double kontostand; 3 4 public double getKontostand() { 5 return kontostand; 6 } 7 8 public void einzahlen(double betrag) { 9 if (betrag > 0) { 10 kontostand += betrag; 11 } 12 } 13}
private double kontostand; — von außerhalb der Klasse Konto ist kein direkter Zugriff möglich, weder Lesen noch Schreiben; Compilerfehler bei meinKonto.kontostand = -500; von außen.✅ Checkpoint 22: Kapselung mit Validierung
4.5 Vererbung
Vererbung (Inheritance)
Eine Klasse (Unterklasse/abgeleitete Klasse) übernimmt Attribute und Methoden einer anderen Klasse (Oberklasse/Basisklasse) mit dem Schlüsselwort extends und kann sie erweitern oder anpassen. Java erlaubt pro Klasse nur eine direkte Oberklasse (Einfachvererbung) — anders als bei Interfaces.
super
Verweist innerhalb einer Unterklasse auf die Oberklasse. super(...) ruft explizit den Konstruktor der Oberklasse auf (muss die erste Zeile im Unterklassen-Konstruktor sein), super.methode() ruft eine überschriebene Methode der Oberklasse gezielt auf.
Overriding (Methodenüberschreibung) & @Override
Eine Unterklasse definiert eine Methode mit identischer Signatur wie in der Oberklasse neu, um das geerbte Verhalten zu ersetzen. Die Annotation @Override ist optional, aber dringend empfohlen — sie lässt den Compiler prüfen, ob wirklich eine passende Methode der Oberklasse existiert, und verhindert Tippfehler, die sonst versehentlich eine neue, eigenständige Methode erzeugen würden.
1public class Tier { 2 String name; 3 4 Tier(String name) { 5 this.name = name; 6 } 7 8 void lautGeben() { 9 System.out.println(name + " gibt ein Geräusch von sich."); 10 } 11} 12 13public class Hund extends Tier { 14 Hund(String name) { 15 super(name); 16 } 17 18 @Override 19 void lautGeben() { 20 System.out.println(name + " bellt: Wuff!"); 21 } 22}
class Hund extends Tier — Hund erbt automatisch das Attribut name und alle Methoden von Tier, ohne sie neu zu schreiben.super(name) ruft den Konstruktor von Tier auf, damit name dort korrekt initialisiert wird — jeder Unterklassen-Konstruktor ruft implizit oder explizit immer zuerst einen Konstruktor der Oberklasse auf.@Override markiert, dass lautGeben() die geerbte Version aus Tier bewusst ersetzt — mit identischer Signatur, aber eigenem Verhalten.✅ Checkpoint 23: Vererbung & Overriding
4.6 Polymorphie
Polymorphie
Die Fähigkeit, ein Objekt über den Typ seiner Oberklasse (oder eines Interfaces) anzusprechen, während zur Laufzeit automatisch die tatsächlich passende, überschriebene Methode der konkreten Unterklasse ausgeführt wird — genannt dynamische Bindung.
1public class Tierheim { 2 public static void main(String[] args) { 3 Tier[] tiere = new Tier[2]; 4 tiere[0] = new Hund("Bello"); 5 tiere[1] = new Tier("Unbekannt"); 6 7 for (Tier t : tiere) { 8 t.lautGeben(); 9 } 10 } 11}
Tier — kann trotzdem Objekte jeder Unterklasse von Tier aufnehmen.Hund-Objekt wird über eine Tier-Referenz gespeichert — erlaubt, weil ein Hund laut Vererbung immer auch ein Tier ist ("Ist-ein"-Beziehung).t als Tier deklariert ist, ruft t.lautGeben() zur Laufzeit die tatsächliche, überschriebene Version des jeweils dahinterliegenden Objekts auf — für Bello die Hund-Version ("bellt"), für das zweite Objekt die Tier-Version ("gibt ein Geräusch von sich"). Genau das ist dynamische Bindung.✅ Checkpoint 24: Polymorphie in Aktion
4.7 Abstrakte Klassen
Abstrakte Klasse
Eine mit abstract markierte Klasse, die nicht direkt instanziiert werden kann (new ist verboten). Sie dient als gemeinsame Basis für Unterklassen und kann sowohl fertig implementierte als auch abstrakte Methoden (ohne Methodenkörper) enthalten.
Abstrakte Methode
Eine Methode ohne Implementierung, nur mit Signatur und Semikolon statt geschweiften Klammern: abstract void fliegen();. Jede konkrete (nicht-abstrakte) Unterklasse muss diese Methode zwingend überschreiben, sonst meldet der Compiler einen Fehler.
1public abstract class Form { 2 abstract double flaecheBerechnen(); 3 4 void beschreiben() { 5 System.out.println("Diese Form hat eine Fläche von " + flaecheBerechnen()); 6 } 7} 8 9public class Kreis extends Form { 10 double radius; 11 12 Kreis(double radius) { 13 this.radius = radius; 14 } 15 16 @Override 17 double flaecheBerechnen() { 18 return Math.PI * radius * radius; 19 } 20}
abstract class Form — new Form() wäre ein Kompilierfehler, da Form unvollständig ist (sie enthält eine nicht implementierte Methode).abstract double flaecheBerechnen(); — nur die Signatur, kein Körper, kein { }. Jede konkrete Form-Unterklasse muss selbst festlegen, wie ihre Fläche berechnet wird.beschreiben() nutzt sogar die noch abstrakte flaecheBerechnen() und funktioniert später dank Polymorphie für jede Unterklasse korrekt.Kreis extends Form und implementiert flaecheBerechnen() vollständig — erst dadurch wird Kreis zu einer konkreten, instanziierbaren Klasse.✅ Checkpoint 25: Abstrakte Klasse verstanden
4.8 Interfaces
Interface
Ein rein abstrakter Bauplan, der ausschließlich Methodensignaturen (und Konstanten) festlegt, aber keine eigene Implementierung und keinen Objektzustand besitzt. Eine Klasse verpflichtet sich mit implements, alle im Interface geforderten Methoden konkret umzusetzen.
implements
Das Schlüsselwort, mit dem eine Klasse angibt, ein bestimmtes Interface zu erfüllen. Anders als bei extends (nur eine Oberklasse erlaubt) kann eine Klasse beliebig viele Interfaces gleichzeitig implementieren, getrennt durch Komma.
Unterschied: abstrakte Klasse vs. Interface
Abstrakte Klasse: kann Zustand (Attribute) und fertige Methoden besitzen, aber nur eine pro Klasse erbbar. Interface: klassisch zustandslos, rein vertraglich, aber eine Klasse kann mehrere Interfaces gleichzeitig implementieren. Seit Java 8 dürfen Interfaces zusätzlich default-Methoden mit fertigem Methodenkörper enthalten.
1public interface Fliegbar { 2 void fliegen(); 3} 4 5public interface Schwimmbar { 6 void schwimmen(); 7} 8 9public class Ente implements Fliegbar, Schwimmbar { 10 @Override 11 public void fliegen() { 12 System.out.println("Die Ente fliegt tief über den Teich."); 13 } 14 15 @Override 16 public void schwimmen() { 17 System.out.println("Die Ente schwimmt auf dem Teich."); 18 } 19}
public abstract.implements Fliegbar, Schwimmbar — Ente erfüllt zwei Verträge gleichzeitig, was mit Einfachvererbung (extends) unmöglich wäre.Ente als vollständige (konkrete) Klasse zu akzeptieren.SCHNITTSTELLE Fliegbar
METHODE fliegen()
ENDE SCHNITTSTELLE
KLASSE Ente ERFÜLLT Fliegbar, Schwimmbar
METHODE fliegen()
GIB AUS "Die Ente fliegt tief über den Teich."
ENDE METHODE
ENDE KLASSE
✅ Checkpoint 26: Interfaces angewendet
Fortgeschrittene IHK-Themen
Der letzte inhaltliche Teil: Wir lernen, viele Werte auf einmal zu verwalten (Arrays, ArrayLists, HashMaps), unser Programm gegen Fehler abzusichern (Exception Handling) und Code zu schreiben, den auch andere Menschen in einem Jahr noch verstehen (Clean Code). Danach wartet das große Abschluss-Quiz.
5.1 Arrays
Array
Eine Datenstruktur fester Länge, die mehrere Werte desselben Datentyps unter einem gemeinsamen Namen speichert. Arrays sind in Java Referenztypen und liegen auf dem Heap, selbst wenn sie primitive Werte wie int enthalten.
Index
Die Position eines Elements im Array, beginnend bei 0 für das erste Element. Ein Array der Länge n hat gültige Indizes von 0 bis n-1. Der Zugriff auf einen ungültigen Index wirft zur Laufzeit eine ArrayIndexOutOfBoundsException.
.length
Ein Attribut (kein Methodenaufruf, also ohne Klammern!) jedes Arrays, das seine feste Länge zurückgibt, z. B. zahlen.length. Häufig verwechselt mit .length() bei Strings, das eine echte Methode mit Klammern ist.
1public class ArrayDemo { 2 public static void main(String[] args) { 3 int[] noten = {2, 1, 3, 2, 4}; 4 int summe = 0; 5 6 for (int i = 0; i < noten.length; i++) { 7 summe += noten[i]; 8 } 9 10 double durchschnitt = (double) summe / noten.length; 11 System.out.println("Durchschnitt: " + durchschnitt); 12 13 for (int note : noten) { 14 System.out.print(note + " "); 15 } 16 } 17}
{2, 1, 3, 2, 4} ist eine kompakte Array-Initialisierung: Java legt automatisch ein Array der Länge 5 an und befüllt es sofort.for-Schleife: noten[i] greift per eckiger Klammer auf das Element an Position i zu.(double) summe castet vor der Division — sonst würde ganzzahlige Division (Kapitel 2.4) das Ergebnis fälschlich abschneiden.for (int note : noten) ist die erweiterte for-Schleife ("for-each"): sie iteriert bequem über jedes Element, ohne manuellen Index — ideal, wenn man den Index selbst nicht braucht.ArrayIndexOutOfBoundsException ist einer der häufigsten Laufzeitfehler in Prüfungsaufgaben. Ein Array der Länge 5 hat die gültigen Indizes 0–4 — der Zugriff auf noten[5] wirft diese Exception, selbst wenn "5" wie eine naheliegende, harmlose Zahl aussieht.
✅ Checkpoint 27: Arrays durchlaufen
5.2 ArrayList
ArrayList ein dehnbarer Rucksack: Du kannst jederzeit neue Dinge hineinpacken oder herausnehmen, und der Rucksack passt sich automatisch in der Größe an — du musst dich nie vorher auf eine feste Anzahl festlegen.ArrayList
Eine Klasse aus java.util, die eine dynamisch wachsende Liste implementiert. Intern verwaltet sie selbst ein Array, das bei Bedarf automatisch vergrößert wird — für dich als Nutzer unsichtbar.
Generics (<T>)
Spitze Klammern nach dem Typnamen, z. B. ArrayList<String>, legen fest, welchen Datentyp die Liste ausschließlich aufnehmen darf. Das verhindert Typfehler bereits zur Kompilierzeit, statt sie erst zur Laufzeit zu entdecken.
Wrapper-Klassen & Autoboxing
Generics funktionieren nur mit Referenztypen, nicht mit primitiven Typen — deshalb gibt es zu jedem primitiven Typ eine Wrapper-Klasse (int→Integer, double→Double, boolean→Boolean, …). Autoboxing ist die automatische Umwandlung zwischen primitivem Typ und Wrapper-Klasse durch den Compiler, z. B. bei ArrayList<Integer> liste; liste.add(5); wird die 5 automatisch zu einem Integer-Objekt "verpackt".
1import java.util.ArrayList; 2 3public class ArrayListDemo { 4 public static void main(String[] args) { 5 ArrayList<String> einkaufsliste = new ArrayList<>(); 6 einkaufsliste.add("Milch"); 7 einkaufsliste.add("Brot"); 8 einkaufsliste.add("Käse"); 9 einkaufsliste.remove("Brot"); 10 11 for (String artikel : einkaufsliste) { 12 System.out.println("- " + artikel); 13 } 14 System.out.println("Anzahl Artikel: " + einkaufsliste.size()); 15 } 16}
new ArrayList<>() — die leeren spitzen Klammern rechts ("Diamond-Operator") lassen Java den Typ aus der linken Deklaration übernehmen, statt ihn zu wiederholen..add(...) hängt Elemente ans Ende an; die Liste wächst automatisch von 0 auf 3 Elemente..remove("Brot") entfernt das erste Vorkommen dieses konkreten Werts (nicht den Index!) — für Indexlöschung gäbe es .remove(1), was hier zu Verwechslungen führen kann..size() liefert die aktuelle Anzahl der Elemente — bei Arrays heißt die Entsprechung .length (Attribut), bei ArrayList .size() (Methode, mit Klammern)!| Array | ArrayList | |
|---|---|---|
| Größe | fest, bei Erzeugung festgelegt | dynamisch, wächst/schrumpft automatisch |
| Datentypen | primitive & Referenztypen | nur Referenztypen (Autoboxing für primitive) |
| Länge abfragen | .length (Attribut) | .size() (Methode) |
| Elemente ändern | nur überschreiben | hinzufügen, entfernen, überschreiben |
✅ Checkpoint 28: ArrayList genutzt
5.3 Exception Handling: try-catch
try-catch ist wie ein Sicherheitsnetz unter einem Seiltänzer: Der Seiltänzer (dein Code) versucht (try) den riskanten Balanceakt. Fällt er trotzdem herunter (ein Fehler tritt auf), fängt ihn das Netz (catch) auf, statt dass die ganze Show (das Programm) abrupt abbricht.Exception
Ein Objekt, das einen Ausnahmefall zur Laufzeit repräsentiert — einen Fehler, der den normalen Programmablauf unterbricht (z. B. Division durch Null, ungültiger Array-Index). Wird eine Exception nicht abgefangen, bricht das Programm mit einem Stacktrace ab.
try / catch / finally
try: umschließt den riskanten Code. catch (ExceptionTyp e): fängt eine passende Exception ab und behandelt sie kontrolliert. finally: wird immer ausgeführt — egal ob eine Exception auftrat oder nicht, egal ob im try ein return stand — typisch verwendet, um Ressourcen wie Dateien oder einen Scanner sicher zu schließen.
Checked vs. Unchecked Exception
Checked Exceptions (z. B. IOException) muss der Compiler zwingend entweder abgefangen oder mit throws weitergereicht sehen — sonst Kompilierfehler. Unchecked Exceptions (Unterklassen von RuntimeException, z. B. NullPointerException, ArithmeticException) müssen syntaktisch nicht behandelt werden, sollten aber durch guten Code von vornherein vermieden werden.
throw vs. throws
throw (im Methodenkörper) löst tatsächlich eine konkrete Exception aus: throw new IllegalArgumentException("ungültig");. throws (in der Methodensignatur) kündigt nur an, dass diese Methode eine bestimmte Checked Exception weiterreichen könnte, ohne sie selbst zu behandeln: void lesen() throws IOException.
1import java.util.Scanner; 2 3public class Division { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 try { 7 System.out.print("Zahl: "); 8 int zahl = Integer.parseInt(sc.nextLine()); 9 System.out.println("100 / Zahl = " + (100 / zahl)); 10 } catch (NumberFormatException e) { 11 System.out.println("Das war keine gültige Zahl."); 12 } catch (ArithmeticException e) { 13 System.out.println("Division durch 0 ist nicht erlaubt."); 14 } finally { 15 System.out.println("Programm beendet."); 16 sc.close(); 17 } 18 } 19}
Integer.parseInt(...) wandelt Text in eine Zahl um — wirft eine NumberFormatException, wenn der Text keine gültige Zahl ist (z. B. "abc").100 / zahl wirft eine ArithmeticException, wenn zahl gleich 0 ist — ganzzahlige Division durch 0 ist in Java (anders als bei Gleitkommazahlen!) immer ein Laufzeitfehler.catch-Blöcke von oben nach unten und springt in den ersten passenden. Es wird niemals mehr als ein catch-Block pro try ausgeführt.finally-Block läuft in jedem Fall — egal ob eine Exception geworfen, welche abgefangen wurde oder gar keine auftrat. Ideal, um sc.close() garantiert auszuführen.NullPointerException (Zugriff auf null-Referenz), ArrayIndexOutOfBoundsException (ungültiger Array-Index), ArithmeticException (z. B. Ganzzahl-Division durch 0), NumberFormatException (ungültige Text-zu-Zahl-Umwandlung) — diese vier sind die in Prüfungsaufgaben am häufigsten vorkommenden Exceptions. Alle vier sind Unchecked Exceptions.
✅ Checkpoint 29: try-catch-finally angewendet
5.4 Grundlegende Datenstrukturen
Stack (LIFO)
Last In, First Out: Das zuletzt hinzugefügte Element wird als erstes wieder entfernt. Java bietet dies über die Klasse Stack oder — moderner empfohlen — über Deque mit push()/pop().
Queue (FIFO)
First In, First Out: Das zuerst hinzugefügte Element wird als erstes wieder entfernt — über das Interface Queue mit offer() (einreihen) und poll() (bedienen).
HashMap
Eine Schlüssel-Wert-Datenstruktur (Key→Value) aus java.util, die den Zugriff über einen eindeutigen Schlüssel statt über einen numerischen Index erlaubt und intern über sogenanntes Hashing sehr schnellen Zugriff ermöglicht. Schlüssel sind eindeutig — eine erneute put()-Zuweisung mit demselben Key überschreibt den alten Wert.
1import java.util.HashMap; 2 3public class HashMapDemo { 4 public static void main(String[] args) { 5 HashMap<String, Integer> noten = new HashMap<>(); 6 noten.put("Java", 2); 7 noten.put("Datenbanken", 1); 8 9 int javaNote = noten.get("Java"); 10 System.out.println("Note in Java: " + javaNote); 11 12 if (noten.containsKey("Mathe")) { 13 System.out.println("Note vorhanden"); 14 } else { 15 System.out.println("Keine Note für Mathe hinterlegt"); 16 } 17 } 18}
HashMap<String, Integer> — der erste Typ-Parameter ist der Key-Typ, der zweite der Value-Typ..put(key, value) fügt ein Schlüssel-Wert-Paar ein oder überschreibt den Wert, falls der Schlüssel bereits existiert..get("Java") liefert den zum Schlüssel gehörenden Wert — null, falls der Schlüssel nicht existiert (bei nicht vorhandenem Key auf primitiven Wrapper-Typ würde das Auspacken sogar eine NullPointerException werfen)..containsKey(...) prüft sicher, ob ein Schlüssel existiert, bevor man ihn abruft — vermeidet genau das eben genannte null-Problem.✅ Checkpoint 30: Datenstrukturen im Überblick
5.5 Sauberer Code & Naming Conventions
| Element | Konvention | Beispiel |
|---|---|---|
| Klassen & Interfaces | PascalCase | Kundenverwaltung, Fliegbar |
| Variablen & Methoden | camelCase | kontostand, berechneSumme() |
| Konstanten | UPPER_SNAKE_CASE | MAX_VERSUCHE |
| Packages | durchgehend klein | de.firma.projekt |
Magic Number
Eine fest im Code verstreute Zahl ohne erklärenden Namen, deren Bedeutung sich nicht selbst erschließt, z. B. if (versuch > 3). Besser: als benannte Konstante auslagern, static final int MAX_VERSUCHE = 3; — dann versteht jeder sofort, wofür die 3 steht, und sie muss bei Änderung nur an einer Stelle angepasst werden.
DRY-Prinzip (Don't Repeat Yourself)
Wiederholter Code sollte in eine eigene Methode oder Klasse ausgelagert werden, statt ihn mehrfach zu kopieren. Reduziert Fehlerquellen, da eine Korrektur nur an einer Stelle nötig ist.
Single-Responsibility-Prinzip
Eine Methode oder Klasse sollte genau eine klar abgegrenzte Aufgabe erfüllen und diese gut, statt viele verschiedene Aufgaben schlecht zu vermischen. Erleichtert Testen, Verstehen und Wiederverwenden.
1public class x { 2 public static void main(String[] args) { 3 int a = 3; 4 if (a > 3) { System.out.println("zu viele"); } 5 } 6}
1public class Loginversuche { 2 private static final int MAX_VERSUCHE = 3; 3 4 public static void main(String[] args) { 5 int aktuelleVersuche = 3; 6 if (aktuelleVersuche > MAX_VERSUCHE) { 7 System.out.println("Zu viele Login-Versuche."); 8 } 9 } 10}
Beide Programme tun exakt dasselbe — aber nur die zweite Version verrät auf einen Blick, was sie tut und warum die Zahl 3 dort steht.
✅ Checkpoint 31: Clean Code angewendet
Begriffslexikon
Alle Fachbegriffe aus Teil 1–5 an einem Ort, sortiert nach Kapitel. Tippe oben in die Suche, um gezielt nach einem Begriff zu filtern — praktisch als Wiederholung vor der Prüfung.
TEIL 1 — WERKZEUGKISTE EINRICHTEN
- JVM (Java Virtual Machine)
- Virtuelle Maschine, die auf dem echten Computer läuft und Bytecode Zeile für Zeile ausführt. Jedes Betriebssystem hat seine eigene JVM, der ausgeführte Bytecode ist aber immer identisch — Grundlage der Plattformunabhängigkeit.
- Bytecode
- Plattformunabhängige Zwischensprache in
.class-Dateien, die aus.java-Quellcode kompiliert und von jeder JVM verstanden wird. - JDK vs. JRE vs. JVM
- JVM führt Bytecode aus. JRE = JVM + Standardbibliotheken (zum Ausführen). JDK = JRE + Compiler + Entwicklerwerkzeuge (zum Entwickeln).
- Compiler
- Übersetzt menschenlesbaren Quellcode in eine andere Form — bei Java in Bytecode. Der Java-Compiler heißt
javac. - LTS (Long Term Support)
- Java-Version, die besonders lange mit Sicherheitsupdates versorgt wird (z. B. 17, 21) — Standard in Ausbildungsbetrieben.
- Umgebungsvariable
- Ein benannter, systemweiter Wert, den alle Programme auslesen können, ohne dass er jedes Mal neu eingegeben werden muss.
- JAVA_HOME
- Umgebungsvariable, die auf den Installationsordner des JDK zeigt. Wird u. a. von Eclipse, Maven und Gradle genutzt.
- PATH
- Liste von Ordnern, die das Betriebssystem bei Kommandozeilenbefehlen automatisch durchsucht — muss den
bin-Ordner des JDK enthalten, damitjava/javacüberall aufrufbar sind. - IDE (Integrated Development Environment)
- Bündelt Editor, Compiler-Anbindung, Debugger und Projektverwaltung in einer Anwendung, z. B. Eclipse.
- Workspace
- Ordner auf der Festplatte, in dem Eclipse alle Projekte, Einstellungen und Metadaten eines Arbeitsbereichs sammelt.
- Package
- „Ordner“ für verwandte Java-Klassen, vermeidet Namenskonflikte zwischen gleichnamigen Klassen in unterschiedlichen Packages.
TEIL 2 — JAVA-GRUNDLAGEN
- Variable
- Benannter Speicherplatz im RAM für einen Wert eines bestimmten Datentyps, dessen Inhalt sich zur Laufzeit ändern kann.
- Deklaration
- Ankündigung einer neuen Variable (Name + Typ) gegenüber dem Compiler, z. B.
int alter;— reserviert Speicher, ohne einen sinnvollen Wert zu setzen. - Initialisierung
- Erste Wertzuweisung an eine Variable. Lokale Variablen müssen vor Nutzung zwingend initialisiert werden.
- Primitiver Datentyp
- Einer der 8 elementaren Java-Typen (
byte, short, int, long, float, double, char, boolean), speichert den Wert direkt im Stack. - Type Casting
- Implizit (Widening, automatisch, z. B.
int→double) oder explizit (Narrowing, erzwungen per(typ), kann Werte abschneiden, z. B.(int) 9.7 → 9). - Referenztyp
- Speichert im Stack nur eine Referenz (Adresse) auf ein Objekt im Heap-Speicher — z. B.
String, Arrays, eigene Klassen. - String-Pool
- Spezieller Speicherbereich für String-Literale; identisch geschriebene Literale zeigen oft auf dasselbe Objekt.
new String(...)erzeugt dagegen immer ein neues Heap-Objekt. - null
- Spezieller Wert für Referenztypen: „zeigt auf kein Objekt“. Primitive Typen können niemals
nullsein. - Scanner
- Klasse aus
java.utilzum Einlesen von Eingabequellen wie der Tastatur (System.in). - import
- Teilt dem Compiler mit, welche Klasse aus welchem Package genutzt werden soll, ohne den vollen Namen jedes Mal auszuschreiben.
- Pseudocode
- Informelle, sprachunabhängige Notation zur Beschreibung von Algorithmen ohne exakte Programmiersprachen-Syntax.
- Programmablaufplan (PAP)
- Genormte grafische Algorithmus-Darstellung nach DIN 66001 mit festen Symbolen (Raute = Entscheidung, Rechteck = Verarbeitung, …).
- Struktogramm (Nassi-Shneiderman)
- Blockorientierte Alternative zum PAP ohne Pfeile — Ablauf ergibt sich aus der Anordnung von oben nach unten.
TEIL 3 — KONTROLLSTRUKTUREN
- Boolescher Ausdruck
- Ausdruck, der zu genau
trueoderfalseausgewertet wird — einzig gültige Form einerif-Bedingung in Java. - Block
- Mehrere Anweisungen, durch
{ }zu einer logischen Einheit zusammengefasst. - case
- Sprungmarke in einem
switch-Block, verglichen mit einem konkreten, konstanten Wert. - break (im switch)
- Beendet den
switch-Block sofort. Ohnebreakläuft die Ausführung in den nächstencase-Block durch (Fallthrough). - Fallthrough
- Durchfallen in den nächsten
case-Block wegen fehlendembreak— manchmal absichtlich genutzt, meist ein Fehler. - default
- Auffangzweig eines
switch-Blocks, vergleichbar mitelsebeiif. - Schleifenkopf
- Die drei Teile einer
for-Schleife: Initialisierung; Bedingung; Inkrement/Update. - Zählschleife
- Schleife, deren Anzahl an Durchläufen von vornherein feststeht — klassischer Fall für
for. - Kopfgesteuerte Schleife
- Bedingung wird vor jedem Durchlauf geprüft (
while,for) — der Körper kann 0-mal laufen. - Fußgesteuerte Schleife
- Bedingung wird nach jedem Durchlauf geprüft (
do-while) — der Körper läuft garantiert mindestens 1-mal. - Endlosschleife
- Schleife, deren Abbruchbedingung nie
falsewird — Programm „hängt“. - break (in Schleifen)
- Beendet die gesamte umschließende Schleife sofort.
- continue
- Bricht nur den aktuellen Durchlauf ab und springt zur nächsten Bedingungsprüfung.
TEIL 4 — OBJEKTORIENTIERTE PROGRAMMIERUNG
- Klasse
- Bauplan, der Attribute und Methoden von Objekten dieses Typs beschreibt.
- Objekt (Instanz)
- Konkretes, im Heap erzeugtes Exemplar einer Klasse mit eigenen Attributwerten.
- Attribut
- Variable innerhalb einer Klasse, außerhalb jeder Methode — beschreibt den Zustand eines Objekts.
- new-Operator
- Erzeugt ein neues Objekt auf dem Heap und ruft dessen Konstruktor auf.
- Methode
- Benannter, wiederverwendbarer Codeblock innerhalb einer Klasse, der eine Fähigkeit kapselt.
- Parameter vs. Argument
- Parameter = Platzhalter-Name in der Methodendefinition. Argument = konkreter Wert beim tatsächlichen Aufruf.
- Methodensignatur
- Name + Anzahl/Typ/Reihenfolge der Parameter (Rückgabetyp zählt nicht dazu) — Basis für Overloading.
- Overloading
- Mehrere Methoden gleichen Namens mit unterschiedlicher Parameterliste in derselben Klasse — vom Compiler zur Kompilierzeit aufgelöst.
- Konstruktor
- Spezielle Struktur, die beim
new-Aufruf automatisch läuft; trägt den Klassennamen, hat keinen Rückgabetyp. - Standardkonstruktor
- Vom Compiler automatisch erzeugter, parameterloser Konstruktor — entfällt, sobald die Klasse einen eigenen Konstruktor definiert.
- this
- Verweist innerhalb einer Instanzmethode/eines Konstruktors auf das aktuelle Objekt — löst Namensgleichheit mit Parametern auf.
- Kapselung (Encapsulation)
- Schützt Attribute vor direktem Zugriff (meist
private) und macht sie nur über kontrollierte Methoden erreichbar. - Zugriffsmodifizierer
private(nur eigene Klasse), package-private (Package),protected(Package + Unterklassen),public(überall).- Getter & Setter
- Kontrolliertes Lesen (Getter) bzw. Schreiben (Setter, ggf. mit Validierung) eines privaten Attributs.
- Vererbung (Inheritance)
- Eine Unterklasse übernimmt Attribute/Methoden einer Oberklasse via
extends— in Java nur Einfachvererbung. - super
- Verweist auf die Oberklasse;
super(...)ruft deren Konstruktor,super.methode()deren Methode auf. - Overriding & @Override
- Unterklasse definiert eine geerbte Methode mit identischer Signatur neu.
@Overridelässt den Compiler die Korrektheit prüfen. - Polymorphie
- Ein Objekt wird über den Oberklassen-/Interface-Typ angesprochen, zur Laufzeit läuft aber die Methode der tatsächlichen Unterklasse (dynamische Bindung).
- Abstrakte Klasse
- Mit
abstractmarkierte, nicht instanziierbare Klasse als Basis für Unterklassen; kann abstrakte und fertige Methoden mischen. - Abstrakte Methode
- Methode ohne Implementierung, nur Signatur — jede konkrete Unterklasse muss sie überschreiben.
- Interface
- Rein abstrakter Vertrag aus Methodensignaturen ohne eigenen Objektzustand; eine Klasse kann mehrere gleichzeitig implementieren.
- implements
- Schlüsselwort, mit dem eine Klasse angibt, ein Interface zu erfüllen — beliebig viele gleichzeitig möglich.
TEIL 5 — FORTGESCHRITTENE THEMEN
- Array
- Datenstruktur fester Länge für mehrere Werte desselben Typs; Referenztyp, liegt im Heap.
- Index
- Position eines Elements im Array, beginnend bei 0. Ungültiger Zugriff wirft
ArrayIndexOutOfBoundsException. - .length
- Attribut (ohne Klammern) jedes Arrays für dessen feste Länge — nicht zu verwechseln mit
.length()bei Strings. - ArrayList
- Dynamisch wachsende Listen-Klasse aus
java.util, verwaltet intern ein automatisch vergrößerbares Array. - Generics (<T>)
- Legen fest, welchen Datentyp eine Sammlung ausschließlich aufnehmen darf — Typfehler werden zur Kompilierzeit erkannt.
- Wrapper-Klassen & Autoboxing
- Wrapper-Klassen (
Integer,Double, …) kapseln primitive Typen als Objekte; Autoboxing wandelt automatisch zwischen beiden Formen um. - Exception
- Objekt, das einen Ausnahmefall zur Laufzeit repräsentiert und den normalen Ablauf unterbricht.
- try / catch / finally
tryumschließt riskanten Code,catchfängt eine passende Exception ab,finallyläuft immer — Exception hin oder her.- Checked vs. Unchecked Exception
- Checked muss der Compiler zwingend behandelt sehen (
throwsodertry-catch). Unchecked (RuntimeException-Familie) ist syntaktisch optional. - throw vs. throws
throwlöst eine konkrete Exception aus.throwskündigt in der Signatur eine mögliche Exception nur an.- Stack (LIFO)
- Last In, First Out — das zuletzt hinzugefügte Element wird zuerst entfernt.
- Queue (FIFO)
- First In, First Out — das zuerst hinzugefügte Element wird zuerst entfernt.
- HashMap
- Schlüssel-Wert-Datenstruktur mit Zugriff über einen eindeutigen Key statt über einen numerischen Index.
- Magic Number
- Unbenannte Zahl im Code ohne erklärenden Namen — besser als benannte Konstante auslagern.
- DRY-Prinzip
- „Don't Repeat Yourself“ — wiederholter Code gehört in eine eigene Methode/Klasse ausgelagert.
- Single-Responsibility-Prinzip
- Eine Methode/Klasse sollte genau eine klar abgegrenzte Aufgabe gut erfüllen.
Das XXL-Quiz — 400 Fragen (80 pro Teil)
Klicke direkt auf eine Antwort — du bekommst sofort Rückmeldung, ob sie richtig oder falsch war, die korrekte Antwort wird bei einem Fehltipp automatisch grün markiert, und die ausführliche Erklärung klappt automatisch auf (kann jederzeit manuell ein-/ausgeklappt werden). Die richtige Antwort steht bewusst nicht immer an derselben Stelle. Baufortschritt: Teil 1 bis 4 sind mit je 80 Fragen komplett — Teil 5 folgt als letzter Baustein, bis alle 400 stehen.
javac HalloWelt.java bei erfolgreicher Kompilierung?Ausführliche Erklärung
Richtig: B. javac übersetzt den Quellcode in plattformunabhängigen Bytecode, gespeichert in einer .class-Datei. Diese enthält noch keine für ein bestimmtes Betriebssystem fertige Maschinensprache — das übernimmt erst die JVM zur Laufzeit.
Ausführliche Erklärung
Richtig: C. Der Bytecode selbst ist plattformunabhängig — nur die JVM unterscheidet sich je Betriebssystem, nicht der Bytecode, den sie ausführt.
Ausführliche Erklärung
Richtig: C. Die JVM interpretiert (und beschleunigt per JIT-Compiler) den vorher von javac erzeugten Bytecode und führt ihn Zeile für Zeile aus.
Ausführliche Erklärung
Richtig: D. Nur das JDK enthält den Compiler javac. Die JRE reicht ausschließlich zum Ausführen fertiger Programme, nicht zum Entwickeln.
Ausführliche Erklärung
Richtig: A. Das JDK ist ein Obermenge der JRE: alles, was die JRE kann, plus die Entwicklerwerkzeuge wie javac.
Ausführliche Erklärung
Richtig: B. LTS-Versionen (z. B. 17, 21) werden besonders lange mit Sicherheitsupdates versorgt und sind deshalb Standard in Ausbildungsbetrieben.
java -version ein und bekommt 'java' is not recognized as an internal or external command. Was ist die wahrscheinlichste Ursache?Ausführliche Erklärung
Richtig: C. Diese Fehlermeldung ist der Klassiker für einen fehlenden oder falschen PATH-Eintrag — nicht für ein fehlendes JDK an sich.
JAVA_HOME typischerweise genutzt?Ausführliche Erklärung
Richtig: B. JAVA_HOME zeigt auf den JDK-Installationsordner selbst; viele Werkzeuge lesen diese Variable gezielt aus, besonders wichtig bei mehreren parallel installierten Java-Versionen.
JAVA_HOME und PATH unter Windows neu gesetzt hast, testest du sofort im bereits geöffneten Terminal — es funktioniert nicht. Warum?Ausführliche Erklärung
Richtig: C. Bereits laufende Prozesse (inklusive offener Terminals) übernehmen Änderungen an Umgebungsvariablen nicht automatisch — ein neues Fenster muss geöffnet werden.
export JAVA_HOME=... ein?Ausführliche Erklärung
Richtig: B. Diese Dateien werden beim Start einer neuen Shell-Sitzung eingelesen und sind der Standardort für persönliche Umgebungsvariablen unter macOS/Linux.
Ausführliche Erklärung
Richtig: C. Genau das steckt hinter "Integrated Development Environment" — alle wichtigen Entwicklerwerkzeuge an einem Ort.
Ausführliche Erklärung
Richtig: B. Der Workspace ist ein lokaler Ordner; Eclipse kann verschiedene Workspaces verwalten, arbeitet aber immer nur mit einem gleichzeitig geöffneten.
Ausführliche Erklärung
Richtig: C. Zwei gleichnamige Klassen können in unterschiedlichen Packages koexistieren, ähnlich wie gleichnamige Dokumente in unterschiedlichen Aktenordnern.
Hallowelt.java (kleines "w"), die Klasse darin ist aber als public class HalloWelt (großes "W") definiert. Was passiert beim Kompilieren?Ausführliche Erklärung
Richtig: B. Für eine public-Klasse ist exakte Übereinstimmung (inklusive Groß-/Kleinschreibung) zwischen Dateiname und Klassenname eine feste Regel, kein Stilvorschlag.
main-Methode als static deklariert?Ausführliche Erklärung
Richtig: B. static bindet die Methode an die Klasse selbst statt an ein Objekt — die JVM kann main so als festen Startpunkt aufrufen, bevor überhaupt irgendein Objekt existiert.
void in public static void main(String[] args)?Ausführliche Erklärung
Richtig: C. void heißt lediglich "kein Rückgabewert" — die Methode kann trotzdem beliebig viel Code enthalten und ausführen.
String[] args der main-Methode gedacht?Ausführliche Erklärung
Richtig: B. Startet man das Programm z. B. mit java HalloWelt Servus, landet "Servus" als Element in args.
System.out.print(...) und System.out.println(...)?Ausführliche Erklärung
Richtig: B. Beide geben Text auf der Konsole aus; nur println hängt danach einen Zeilenumbruch an.
java HalloWelt.java statt java HalloWelt ein (nach erfolgreichem javac). Was ist die Folge (moderne Java-Versionen ignoriert)?Ausführliche Erklärung
Richtig: C. Der klassische Aufruf verlangt bei java den Klassennamen ohne .java/.class-Endung — die Verwechslung mit dem javac-Aufruf ist ein Standard-Anfängerfehler.
HalloWelt.class auszuführen. Funktioniert das?Ausführliche Erklärung
Richtig: B. Das JDK wird nur zum Entwickeln/Kompilieren gebraucht (javac). Fertigen Bytecode auszuführen ist genau der Zweck der JRE.
Ausführliche Erklärung
Richtig: C. Der JIT-Compiler beschleunigt die Ausführung, indem er "heiße", oft durchlaufene Codeabschnitte zur Laufzeit gezielt in Maschinencode übersetzt statt sie immer neu zu interpretieren.
Ausführliche Erklärung
Richtig: B. Dort erscheinen alle von Eclipse erkannten JDK/JRE-Installationen, mit Häkchen bei der aktuell verwendeten Standardversion.
Ausführliche Erklärung
Richtig: B. PascalCase (jedes Wort groß, keine Unterstriche) ist die Java-Konvention für Klassennamen — im Gegensatz zu camelCase bei Variablen und Methoden.
echo %PATH% unter Windows?Ausführliche Erklärung
Richtig: B. Das ist ein einfacher, erster Diagnoseschritt, um zu prüfen, ob der JDK-bin-Ordner überhaupt im PATH enthalten ist.
Ausführliche Erklärung
Richtig: C. Genau dieser Unterschied zu z. B. einer .exe-Datei macht die Plattformunabhängigkeit von Java aus.
Ausführliche Erklärung
Richtig: C. Nur das JDK enthält den Compiler und die Entwicklerwerkzeuge, die zum Schreiben und Kompilieren eigener Programme notwendig sind.
Ausführliche Erklärung
Richtig: B. Der Package Explorer ist die zentrale Navigationsansicht für alle Projekte, Packages und Dateien im aktuellen Workspace.
Ausführliche Erklärung
Richtig: A. Diese Voreinstellung sorgt für sofortiges Feedback bei Syntaxfehlern, direkt als rote Unterschlängelung im Editor.
Ausführliche Erklärung
Richtig: A. Dieses Häkchen lässt Eclipse das komplette main-Gerüst direkt mit erzeugen, statt es von Hand abzutippen.
Ausführliche Erklärung
Richtig: B. Erst schreiben (.java), dann kompilieren (javac → .class), dann erst ausführen (java, ohne Endung) — dieser Dreischritt ist die Grundlage jedes Java-Programms.
Ausführliche Erklärung
Richtig: C. Java kombiniert Kompilierung (Quellcode → Bytecode) und Interpretation (Bytecode → Ausführung durch die JVM), zusätzlich beschleunigt durch den JIT-Compiler.
Ausführliche Erklärung
Richtig: A. Ohne JVM kann kein Bytecode ausgeführt werden — die JVM ist die zwingende Laufzeitumgebung.
Ausführliche Erklärung
Richtig: D. .java-Dateien enthalten den Quellcode; .class entsteht erst danach durch Kompilierung.
.class-Datei unverändert auf Windows, macOS und Linux laufen?Ausführliche Erklärung
Richtig: B. Der Bytecode selbst bleibt gleich, nur die JVM-Implementierung unterscheidet sich je Plattform — das ist der Kern der Plattformunabhängigkeit.
Ausführliche Erklärung
Richtig: C. Der JIT-Compiler übersetzt "heiße", oft durchlaufene Bytecode-Abschnitte zur Laufzeit gezielt in schnelleren Maschinencode.
Ausführliche Erklärung
Richtig: A. LTS-Versionen werden besonders lange gepflegt, was für Ausbildungsbetriebe und produktive Projekte Planungssicherheit gibt.
Ausführliche Erklärung
Richtig: D. Temurin ist die von der Eclipse Foundation gepflegte, freie JDK-Distribution und in Ausbildungsbetrieben weit verbreitet.
Ausführliche Erklärung
Richtig: B. apt install ist der Standardweg, um Pakete unter Debian-basierten Linux-Distributionen zu installieren.
Ausführliche Erklärung
Richtig: C. Da javac ausschließlich Teil des JDK ist, beweist eine erfolgreiche Ausgabe von javac -version, dass wirklich ein JDK vorliegt.
Ausführliche Erklärung
Richtig: B. Diese Häkchen lassen den Installer die Umgebungsvariablen selbstständig konfigurieren, statt sie später von Hand nachzutragen.
Ausführliche Erklärung
Richtig: D. adoptium.net ist die offizielle Bezugsquelle für Eclipse Temurin-Builds.
Ausführliche Erklärung
Richtig: C. Ohne Compiler kannst du zwar fertige Programme ausführen, aber keinen eigenen Code kompilieren.
Ausführliche Erklärung
Richtig: C. .msi ist das Standard-Installer-Format für Windows; .dmg gehört zu macOS, .deb zu Debian/Ubuntu, .apk zu Android.
Ausführliche Erklärung
Richtig: A. Dieser Systemordner ist der macOS-Standardspeicherort für installierte Java-Versionen.
Ausführliche Erklärung
Richtig: D. Ohne vollen Pfad sucht das Betriebssystem in genau den im PATH hinterlegten Ordnern nach einem passenden ausführbaren Programm.
Ausführliche Erklärung
Richtig: A. JAVA_HOME ist ein einzelner Verweis auf die Installation, PATH eine ganze Liste durchsuchter Verzeichnisse.
java/javac von überall aus funktionieren?Ausführliche Erklärung
Richtig: D. Erst der bin-Unterordner enthält die tatsächlichen ausführbaren Programme java.exe und javac.exe.
~/.zshrc sofort neu, ohne das Terminal zu schließen?Ausführliche Erklärung
Richtig: D. source führt die Konfigurationsdatei erneut in der aktuellen Shell-Sitzung aus, ohne neu zu starten.
Ausführliche Erklärung
Richtig: A. echo $PATH gibt den kompletten, aktuell geltenden Inhalt der Umgebungsvariable aus.
Ausführliche Erklärung
Richtig: B. Bereits laufende Terminal-Sitzungen lesen Umgebungsvariablen nur bei ihrem eigenen Start ein.
Ausführliche Erklärung
Richtig: D. Gerade in professionellen Umgebungen mit mehreren JDK-Versionen ist JAVA_HOME der eindeutige, gezielte Verweis.
Ausführliche Erklärung
Richtig: C. Diese Meldung ist der klassische Hinweis, dass der Befehl im PATH nicht gefunden werden konnte — die anderen drei sind typische Laufzeitfehler innerhalb eines laufenden Java-Programms.
Ausführliche Erklärung
Richtig: A. Dieses Paket ist schlank genug für den Einstieg, ohne unnötige Enterprise-/Web-Werkzeuge mitzuschleppen.
Ausführliche Erklärung
Richtig: B. Die "Java Perspective" bündelt die für die Entwicklung nötigen Ansichten wie Package Explorer und Konsole.
Ausführliche Erklärung
Richtig: C. Dort listet Eclipse alle erkannten JDK/JRE-Installationen mit Häkchen bei der Standardversion.
Ausführliche Erklärung
Richtig: A. Genau dieses automatische Hintergrund-Kompilieren sorgt dafür, dass Fehler sofort als rote Unterschlängelung sichtbar werden.
Ausführliche Erklärung
Richtig: D. Der Package Explorer ist die zentrale Navigationsansicht für alle Projekte im aktuellen Workspace.
Ausführliche Erklärung
Richtig: B. Ein Workspace ist ein Container für beliebig viele Projekte — praktisch, um mehrere Übungen zu bündeln.
Ausführliche Erklärung
Richtig: D. src ("source") ist die Standardkonvention für den Quellcode-Ordner eines Java-Projekts.
public-Klasse und ihre Datei?Ausführliche Erklärung
Richtig: B. Diese Übereinstimmung ist eine feste Java-Sprachregel, kein Stilvorschlag — sonst gibt es einen Kompilierfehler.
Ausführliche Erklärung
Richtig: D. Bezeichner dürfen nicht mit einer Ziffer beginnen (A), keine Bindestriche enthalten (B), und reservierte Schlüsselwörter wie class sind verboten (C).
Ausführliche Erklärung
Richtig: C. Ohne eigene package-Deklaration landet eine Klasse automatisch im namenlosen Default Package — für größere Projekte unüblich, für Übungszwecke aber unproblematisch.
.java-Datei maximal enthalten?Ausführliche Erklärung
Richtig: C. Pro Datei ist maximal eine public-Klasse erlaubt, und ihr Name muss dem Dateinamen entsprechen.
HalloWelt.java das schließende } der main-Methode vergisst?Ausführliche Erklärung
Richtig: D. Jede öffnende geschweifte Klammer benötigt zwingend ihr schließendes Gegenstück, sonst bricht javac mit einem Syntaxfehler ab.
Ausführliche Erklärung
Richtig: D. Das Semikolon markiert in Java das Ende einer einfachen Anweisung — ein häufig vergessenes Zeichen bei Einsteigern.
Ausführliche Erklärung
Richtig: B. Java unterscheidet konsequent zwischen Groß- und Kleinschreibung — bei allen Bezeichnern, nicht nur bei Klassennamen.
System.out.println("A"); System.out.println("B");?Ausführliche Erklärung
Richtig: D. println hängt nach jeder Ausgabe einen Zeilenumbruch an, deshalb erscheinen beide Werte untereinander.
Ausführliche Erklärung
Richtig: C. Das Häkchen ist nur eine Komfortfunktion, die dir das manuelle Abtippen des main-Gerüsts erspart.
Ausführliche Erklärung
Richtig: D. java startet die JVM und übergibt ihr den Klassennamen ohne jede Datei-Endung.
java HalloWelt ausführst, ohne vorher javac HalloWelt.java ausgeführt zu haben und noch keine .class-Datei existiert?Ausführliche Erklärung
Richtig: B. Der java-Befehl kompiliert klassisch selbst nicht — er benötigt zwingend eine bereits vorhandene .class-Datei.
Ausführliche Erklärung
Richtig: C. Diese Option kompiliert (falls nötig) und startet die ausgewählte Klasse als Standard-Java-Anwendung.
Ausführliche Erklärung
Richtig: D. Die Console-View unten in Eclipse zeigt sämtliche System.out-Ausgaben eines laufenden Programms.
javac und java ist korrekt?Ausführliche Erklärung
Richtig: B. Die beiden Befehle decken die zwei getrennten Schritte Kompilierung und Ausführung ab.
.class-Datei, wenn dein Quellcode einen Syntaxfehler enthält?Ausführliche Erklärung
Richtig: B. Der Compiler erzeugt bewusst keinen halbfertigen, potenziell fehlerhaften Bytecode — lieber ein klarer Kompilierfehler als ein kaputtes Programm.
HalloWelt.java liegt im Ordner C:\projekte\test. Wo muss dein Terminal stehen, damit javac HalloWelt.java ohne vollen Pfad funktioniert?Ausführliche Erklärung
Richtig: C. Ohne vollen Pfadangabe sucht javac die Datei relativ zum aktuellen Arbeitsverzeichnis des Terminals.
java -version ALS AUCH javac -version?Ausführliche Erklärung
Richtig: A. Da javac nur im JDK enthalten ist, beweist seine erfolgreiche Ausgabe eine vollständige, korrekte Installation.
javac-Aufruf ist korrekt?Ausführliche Erklärung
Richtig: A. Im Gegensatz zu java erwartet javac den vollständigen Dateinamen inklusive .java-Endung.
java-Aufruf ist korrekt?Ausführliche Erklärung
Richtig: D. Anders als javac ruft man bei java den reinen Klassennamen auf, ganz ohne Datei-Endung.
Ausführliche Erklärung
Richtig: C. Erst schreiben, dann kompilieren, dann erst ausführen — dieser feste Dreischritt ist die Grundlage jedes Java-Programms.
Ausführliche Erklärung
Richtig: C. Genau diese drei Bausteine bilden zusammen die komplette Werkzeugkiste für die weitere Java-Entwicklung.
Ausführliche Erklärung
Richtig: A. Eine Variable ist ein benannter Speicherplatz für einen veränderlichen Wert — genau das unterscheidet sie von einer Konstante.
int alter; (nur Deklaration, keine Zuweisung)?Ausführliche Erklärung
Richtig: C. Die Deklaration allein reserviert nur Speicher; ein sinnvoller Wert muss erst per Zuweisung folgen.
Ausführliche Erklärung
Richtig: D. Anders als Attribute haben lokale Variablen keinen automatischen Default-Wert — der Compiler verlangt eine explizite Initialisierung vor Gebrauch.
Ausführliche Erklärung
Richtig: B. camelCase beginnt klein, jedes weitere Wort startet groß, ohne Unterstriche oder Bindestriche.
Ausführliche Erklärung
Richtig: D. class ist ein Java-Schlüsselwort und deshalb als Bezeichner tabu — kleingeschriebene Varianten wie "klasse" sind dagegen erlaubt.
int schuljahr = 11; in einem einzigen Schritt?Ausführliche Erklärung
Richtig: B. Diese Kurzschreibweise ist der übliche Praxisweg: Typ, Name und Startwert in einer Zeile.
Ausführliche Erklärung
Richtig: A. Java-Bezeichner müssen mit einem Buchstaben, Unterstrich oder Dollarzeichen beginnen — niemals mit einer Ziffer.
= in alter = 16; in Java?Ausführliche Erklärung
Richtig: C. Für Gleichheitsvergleiche gibt es das eigene Zeichen == — Verwechslung ist ein Klassiker.
Ausführliche Erklärung
Richtig: B. Nur Buchstaben, Ziffern (nicht am Anfang), Unterstrich und Dollarzeichen sind in Bezeichnern zulässig.
int x = 5; System.out.println("Wert: " + x);?Ausführliche Erklärung
Richtig: D. Der +-Operator verkettet den Text mit dem aktuellen Wert von x zu einem neuen String.
Ausführliche Erklärung
Richtig: C. Der Compiler verweigert die Kompilierung, statt mit einem unklaren Wert weiterzuarbeiten — ein Sicherheitsmechanismus von Java.
Ausführliche Erklärung
Richtig: A. Getrennte Deklaration ist technisch erlaubt, aber die kombinierte Schreibweise ist übersichtlicher und fehlerärmer.
Ausführliche Erklärung
Richtig: C. byte, short, int, long, float, double, char und boolean — genau acht Stück.
Ausführliche Erklärung
Richtig: A. long belegt 64 Bit und deckt damit den größten Wertebereich der ganzzahligen Typen ab.
Ausführliche Erklärung
Richtig: B. boolean kennt ausschließlich die zwei Werte true und false.
int-Attributs (Instanzvariable, nicht lokal)?Ausführliche Erklärung
Richtig: D. Anders als lokale Variablen bekommen Attribute automatisch einen Default-Wert — bei int ist das 0.
float-Literal zwingend?Ausführliche Erklärung
Richtig: A. Ohne f interpretiert der Compiler Kommazahlen-Literale standardmäßig als double.
(int) 9.99 in Java?Ausführliche Erklärung
Richtig: C. Ein Narrowing-Cast von double zu int schneidet Nachkommastellen ab, statt zu runden.
Ausführliche Erklärung
Richtig: D. Widening passiert automatisch, weil der Zieltyp den Wertebereich des Ausgangstyps vollständig abdeckt.
Ausführliche Erklärung
Richtig: B. Nur der Weg vom größeren zum kleineren Typ (hier möglicher Datenverlust) verlangt ein explizites Narrowing-Cast.
Ausführliche Erklärung
Richtig: D. char-Literale stehen in einfachen Anführungszeichen — doppelte Anführungszeichen sind für String reserviert.
byte?Ausführliche Erklärung
Richtig: B. byte belegt nur 8 Bit, was genau diesen kleinen, vorzeichenbehafteten Bereich ergibt.
Ausführliche Erklärung
Richtig: A. double bietet mit 64 Bit deutlich mehr Genauigkeit als float (32 Bit, ~7 Nachkommastellen).
float f = 3.5; (ohne Suffix)?Ausführliche Erklärung
Richtig: C. Ein double-Wert passt ohne explizites Cast nicht automatisch in eine float-Variable — Narrowing ist hier nötig.
Ausführliche Erklärung
Richtig: B. Genau das unterscheidet primitive Typen grundlegend von Referenztypen wie String.
Ausführliche Erklärung
Richtig: D. Der Programmierer muss diesen potenziell verlustbehafteten Schritt bewusst mit (typ) erzwingen.
boolean-Attribut?Ausführliche Erklärung
Richtig: C. Der Default-Wert für boolean-Attribute ist stets false.
int zahl = 130; byte b = (byte) zahl;?Ausführliche Erklärung
Richtig: A. 130 liegt außerhalb des byte-Bereichs (−128 bis 127) — ein explizites Cast erzwingt die Umwandlung trotzdem, mit einem "übergelaufenen" Ergebnis statt einem Fehler.
String name eigentlich ihren "Wert"?Ausführliche Erklärung
Richtig: C. Der eigentliche String-Inhalt liegt als Objekt im Heap; die Variable selbst enthält nur den Verweis darauf.
Ausführliche Erklärung
Richtig: A. new String(...) umgeht bewusst den Pool und erzeugt immer ein frisches, separates Objekt.
Ausführliche Erklärung
Richtig: B. .equals() vergleicht den tatsächlichen Zeicheninhalt, unabhängig davon, ob es sich um dasselbe Objekt handelt.
String s = null; s.equals("x");?Ausführliche Erklärung
Richtig: D. Ein Methodenaufruf auf einer null-Referenz führt immer zur berüchtigten NullPointerException.
int-Variable den Wert null annehmen?Ausführliche Erklärung
Richtig: A. null ist ausschließlich für Referenztypen definiert — int hat immer einen konkreten Zahlenwert.
Ausführliche Erklärung
Richtig: C. String ist eine Klasse und damit ein Referenztyp — die anderen drei sind primitiv.
Ausführliche Erklärung
Richtig: D. Beide Variablen sind nur zwei verschiedene "Wegweiser" zum selben tatsächlichen Objekt.
== bei zwei inhaltlich identischen, aber mit new String(...) erzeugten Strings oft false?Ausführliche Erklärung
Richtig: B. Zwei separat mit new erzeugte Objekte liegen an unterschiedlichen Heap-Adressen, selbst bei gleichem Inhalt.
Ausführliche Erklärung
Richtig: D. Primitive Variablen enthalten den Wert direkt, ohne den Umweg über eine Heap-Referenz.
String a = "Hallo"; String b = "Hallo"; if (a == b) { ... } — was ist hier zu beachten?Ausführliche Erklärung
Richtig: B. Beide Literale kommen zufällig aus demselben String-Pool-Objekt — verlässlich ist das aber nicht, deshalb gilt .equals() als Standard.
Ausführliche Erklärung
Richtig: A. Dieses Zwei-Speicherbereiche-Modell (Stack für Werte/Referenzen, Heap für Objekte) ist grundlegend für das Verständnis von Java.
null ist korrekt?Ausführliche Erklärung
Richtig: C. null ist der "leere Wegweiser" für Referenztypen — kein Zahlenwert und kein boolean-Äquivalent.
7 / 2 in Java, wenn beide Operanden vom Typ int sind?Ausführliche Erklärung
Richtig: B. Ganzzahlige Division schneidet den Nachkommaanteil komplett ab, ohne zu runden.
7 % 2?Ausführliche Erklärung
Richtig: D. 7 geteilt durch 2 ergibt 3 Rest 1 — der Modulo-Operator liefert genau diesen Rest.
7 / 2 ein Ergebnis mit Nachkommastellen?Ausführliche Erklärung
Richtig: C. Sobald ein Operand eine Kommazahl ist, wird die gesamte Division als Gleitkomma-Division ausgeführt.
+= in x += 5;?Ausführliche Erklärung
Richtig: A. Kombinierte Zuweisungsoperatoren wie += sind eine Kurzschreibweise für "Wert nehmen, verändern, zurückschreiben".
Ausführliche Erklärung
Richtig: C. != ist in Java der Operator für "ungleich" — <> gibt es in Java nicht.
(5 > 3) && (2 > 4) zurück?Ausführliche Erklärung
Richtig: A. && verlangt, dass BEIDE Teilausdrücke wahr sind — da 2 > 4 falsch ist, ist das Gesamtergebnis false.
(5 > 3) || (2 > 4) zurück?Ausführliche Erklärung
Richtig: B. || reicht ein einziger wahrer Teilausdruck — 5 > 3 ist wahr, also ist das Gesamtergebnis true.
! vor einem boolean-Ausdruck?Ausführliche Erklärung
Richtig: D. !true wird zu false und umgekehrt — der logische Negationsoperator.
a++ in einer eigenständigen Zeile wie a++;?Ausführliche Erklärung
Richtig: A. Der Inkrement-Operator erhöht den Wert der Variable um genau 1.
&&?Ausführliche Erklärung
Richtig: C. Da das Gesamtergebnis bei linkem false schon feststeht, spart Java sich die Auswertung der rechten Seite — nützlich, um z. B. NullPointerExceptions zu vermeiden.
a + b * c laut Punkt-vor-Strich-Regel Vorrang?Ausführliche Erklärung
Richtig: D. Wie in der Mathematik gilt auch in Java Punkt-vor-Strich — b * c wird zuerst berechnet.
10 % 3 korrekt?Ausführliche Erklärung
Richtig: B. 10 = 3×3 + 1, also bleibt als Rest genau 1.
Ausführliche Erklärung
Richtig: D. >= ist der korrekte Vergleichsoperator für "größer oder gleich" — die anderen Schreibweisen existieren in Java so nicht.
a += a++; in der Praxis zu vermeiden, auch wenn sie syntaktisch gültig sind?Ausführliche Erklärung
Richtig: B. Solche Kombinationen sind ein Paradebeispiel für unnötig kryptischen Code — klare, getrennte Anweisungen sind lesbarer.
% ist korrekt?Ausführliche Erklärung
Richtig: A. Zum Beispiel ist zahl % 2 == 0 die Standardprüfung, ob eine Zahl gerade ist.
10 == 10.0?Ausführliche Erklärung
Richtig: C. Bei gemischten numerischen Vergleichen wandelt Java den kleineren Typ automatisch (implizites Widening) um, bevor verglichen wird.
Scanner zu nutzen?Ausführliche Erklärung
Richtig: B. Scanner gehört zum Utility-Package java.util.
Ausführliche Erklärung
Richtig: D. System.in ist der Standard-Eingabestrom, an den der Scanner gekoppelt wird.
Ausführliche Erklärung
Richtig: C. nextLine() liest bis zum nächsten Zeilenumbruch, egal wie viele Wörter oder Leerzeichen enthalten sind.
nextInt() und nextLine()?Ausführliche Erklärung
Richtig: A. nextInt() lässt den Zeilenumbruch nach der Zahl im Puffer stehen — das folgende nextLine() "isst" nur diesen Rest und wirkt übersprungen.
Ausführliche Erklärung
Richtig: C. Dieses zusätzliche, ungenutzte nextLine() "schluckt" den übrig gebliebenen Zeilenumbruch, bevor die eigentliche Texteingabe folgt.
eingabe.close() am Ende eines Scanner-Programms verwendet?Ausführliche Erklärung
Richtig: A. Guter Stil, sobald keine weitere Eingabe mehr folgt — vergleichbar mit dem Schließen einer geöffneten Datei.
System.out.print(...) und System.out.println(...) bei einer Eingabeaufforderung wie "Wie heißt du? "?Ausführliche Erklärung
Richtig: B. Genau deshalb wird für Eingabeaufforderungen meist print statt println verwendet.
eingabe.nextInt() auftreten, wenn der Nutzer Buchstaben statt einer Zahl eingibt?Ausführliche Erklärung
Richtig: D. nextInt() erwartet eine gültige Ganzzahl — passt die Eingabe nicht, wirft es eine InputMismatchException.
import-Zeile am Kopf einer Java-Datei?Ausführliche Erklärung
Richtig: A. Ohne import java.util.Scanner; müsste man jedes Mal java.util.Scanner voll ausschreiben.
Ausführliche Erklärung
Richtig: C. So bleibt die Reihenfolge logisch nachvollziehbar — Achtung ist trotzdem beim Wechsel zwischen nextInt() und nextLine() geboten (siehe Scanner-Falle).
eingabe.nextDouble() zurück?Ausführliche Erklärung
Richtig: D. Der Methodenname verrät bereits den Rückgabetyp — analog zu nextInt() für int.
Ausführliche Erklärung
Richtig: B. Scanner kann neben der Tastatur z. B. auch Dateien oder Strings als Eingabequelle einlesen.
Ausführliche Erklärung
Richtig: D. Solange keine Eingabe erfolgt, blockiert der Scanner-Aufruf das Programm an genau dieser Stelle — kein Fehler, sondern erwartetes Warten.
eingabe.nextInt() aufrufst und der Nutzer stattdessen Enter ohne Eingabe drückt?Ausführliche Erklärung
Richtig: B. nextInt() blockiert weiter, bis eine gültige Ganzzahl im Eingabestrom vorliegt.
Ausführliche Erklärung
Richtig: A. Pseudocode dient der klaren Beschreibung von Programmlogik, unabhängig von konkreter Syntax irgendeiner Sprache.
Ausführliche Erklärung
Richtig: C. Der PAP ist eine genormte, grafische Darstellungsform von Algorithmen.
Ausführliche Erklärung
Richtig: B. DIN 66001 legt die genormten Symbole (Raute, Rechteck, Parallelogramm, …) für Programmablaufpläne fest.
Ausführliche Erklärung
Richtig: D. Die Raute markiert im PAP eine Verzweigung mit Ja/Nein-Ausgängen; Rechteck steht für Verarbeitung, Parallelogramm für Ein-/Ausgabe.
Ausführliche Erklärung
Richtig: C. Struktogramme verzichten bewusst auf Pfeile und sind dadurch besonders übersichtlich bei verschachtelten Schleifen und Verzweigungen.
int alter = 16; in gängigem Pseudocode sinnvoll ausdrücken?Ausführliche Erklärung
Richtig: A. Deklaration und Wertzuweisung werden in Pseudocode meist als zwei klar benannte Schritte formuliert.
System.out.println(...)?Ausführliche Erklärung
Richtig: C. "GIB AUS" ist das gängige Pseudocode-Pendant zu einer Konsolenausgabe.
eingabe.nextInt()?Ausführliche Erklärung
Richtig: A. "LIES" markiert im Pseudocode das Einlesen einer Nutzereingabe.
Ausführliche Erklärung
Richtig: B. Anders als beim PAP (DIN 66001) zählt bei Pseudocode nur, dass Start/Ende, Ein-/Ausgabe, Verarbeitung und Entscheidungen klar erkennbar sind.
Ausführliche Erklärung
Richtig: D. Pseudocode trennt das Denken über die Logik vom Kampf mit exakter Syntax — ein bewährter Zwischenschritt, auch in der echten Praxis.
Ausführliche Erklärung
Richtig: A. Nur ein echter true/false-Wert erfüllt die Definition eines booleschen Ausdrucks.
else if-Kette werden pro Durchlauf maximal ausgeführt?Ausführliche Erklärung
Richtig: C. Sobald ein Zweig zutrifft, werden alle folgenden automatisch übersprungen.
if-Bedingung Ganzzahlen wie 0/1 als Ersatz für true/false (wie z. B. in C)?Ausführliche Erklärung
Richtig: D. Anders als in C führt if (1) in Java zu einem Kompilierfehler.
else if-Kette die allgemeinste Bedingung versehentlich zuerst steht?Ausführliche Erklärung
Richtig: B. Die Reihenfolge in einer else-if-Kette ist entscheidend — genau der Fehler aus der Notenprüfung in Teil 3.1.
if zwingend vorgeschrieben?Ausführliche Erklärung
Richtig: D. Bei genau einer Anweisung sind Klammern technisch optional, werden in der Praxis aber fast immer gesetzt.
if-else-Kette können bei einem einzelnen Durchlauf höchstens betreten werden?Ausführliche Erklärung
Richtig: B. Genau das ist der Kern einer Verzweigung: nur ein Pfad wird verfolgt.
Ausführliche Erklärung
Richtig: A. Beide Grenzen müssen gleichzeitig erfüllt sein — dafür ist && nötig, nicht ||, und = allein wäre eine Zuweisung, kein Vergleich.
else ohne eigene Bedingung?Ausführliche Erklärung
Richtig: C. else ist der Auffangzweig für alle Fälle, die keine vorherige Bedingung abgedeckt hat.
int x=5; if(x>10){...} else if(x>3){...} else{...} — welcher Zweig läuft?Ausführliche Erklärung
Richtig: B. 5>10 ist falsch, 5>3 ist wahr — der zweite Zweig wird betreten, der Rest übersprungen.
if(...) zwingend sein?Ausführliche Erklärung
Richtig: D. Nur ein echter boolean-Wert wird von if akzeptiert.
if (x = 5) { ... } statt == — was passiert in Java?Ausführliche Erklärung
Richtig: C. Diese strikte Typprüfung schützt Java-Entwickler vor einem klassischen C-Fehler.
if-Anweisungen manchmal sinnvoll?Ausführliche Erklärung
Richtig: A. Verschachtelung erlaubt feingranulare, voneinander abhängige Prüfungen.
int n=0; if(n>0){print("positiv");} else if(n<0){print("negativ");} else{print("null");}Ausführliche Erklärung
Richtig: C. Weder n>0 noch n<0 trifft bei n=0 zu — der else-Zweig greift.
Ausführliche Erklärung
Richtig: A. Der Programmfluss muss zuerst den äußeren Block betreten, bevor der innere überhaupt geprüft wird.
else if-Kette ist grundsätzlich korrekt?Ausführliche Erklärung
Richtig: B. Überlappende Bedingungen (z. B. Notenbereiche) verlangen die richtige, meist absteigende oder aufsteigende Reihenfolge.
Ausführliche Erklärung
Richtig: D. Ein else ist optional — fehlt ein zutreffender Zweig, wird einfach kein Block ausgeführt.
switch-case besonders gut im Vergleich zu einer langen if-else-Kette?Ausführliche Erklärung
Richtig: A. Bereiche wie "größer als 10" kann switch nicht direkt prüfen — dafür bleibt if/else zuständig.
Ausführliche Erklärung
Richtig: C. Gleitkommazahlen sind wegen möglicher Rundungsungenauigkeiten als switch-Typ nicht erlaubt.
break in einem case-Zweig?Ausführliche Erklärung
Richtig: D. Ohne break "fällt" die Ausführung einfach weiter in den nächsten Zweig, egal ob dessen Bedingung passt.
default in einem switch-Block?Ausführliche Erklärung
Richtig: B. default ist optional, aber guter Stil zur Behandlung unerwarteter Werte.
int tag=3; switch(tag){case 1: print("Mo"); break; case 2: case 3: print("Di/Mi"); break; default: print("Andere");} — Ausgabe?Ausführliche Erklärung
Richtig: D. tag=3 trifft auf case 3, das zusammen mit case 2 (Fallthrough ohne break dazwischen) zu "Di/Mi" führt.
Ausführliche Erklärung
Richtig: B. Genau wie im Wochenend-Beispiel aus Teil 3.2, wo case 6 und 7 dieselbe Ausgabe teilen.
Ausführliche Erklärung
Richtig: A. case-Werte müssen konstant und eindeutig sein — eine Variable als case-Wert ist nicht erlaubt.
Ausführliche Erklärung
Richtig: C. Ohne weiteren case-Block danach gibt es nichts mehr, in das "durchgefallen" werden könnte.
default innerhalb eines switch-Blocks syntaktisch stehen?Ausführliche Erklärung
Richtig: B. Syntaktisch frei platzierbar, aber übliche Konvention ist die letzte Position.
int x=5; switch(x){case 5: print("fünf"); case 6: print("sechs"); break; default: print("andere");}Ausführliche Erklärung
Richtig: D. Erst nach "sechs" folgt ein break — beide Ausgaben laufen nacheinander.
Ausführliche Erklärung
Richtig: C. Für viele diskrete Werte spart switch wiederholte Variablennamen und ist übersichtlicher.
Ausführliche Erklärung
Richtig: A. Ähnlich wie ein fehlendes else bei if passiert einfach nichts, das Programm läuft weiter.
Ausführliche Erklärung
Richtig: C. Seit Java 7 sind auch String-Werte als switch-Ausdruck erlaubt.
Ausführliche Erklärung
Richtig: A. Dieser Unterschied entscheidet, welches Konstrukt für eine bestimmte Aufgabe passender ist.
switch(zahl){case 1: case 2: case 3: print("klein"); break;}, wenn zahl den Wert 2 hat?Ausführliche Erklärung
Richtig: B. case 1, 2 und 3 teilen sich durch den absichtlichen Fallthrough dieselbe Ausgabe.
Ausführliche Erklärung
Richtig: D. Gerade weil der Code trotzdem kompiliert, fällt das fehlende break oft erst bei der Ausgabe auf.
Ausführliche Erklärung
Richtig: A. Diese drei, durch Semikolons getrennten Teile bilden den festen Schleifenkopf.
for(int i=0; i<5; i++) durch?Ausführliche Erklärung
Richtig: C. Bei Start 0 und Bedingung i<5 sind das die Werte 0,1,2,3,4 — fünf Durchläufe.
for(int i=1; i<=5; i++) durch?Ausführliche Erklärung
Richtig: D. <= schließt den letzten Wert (hier 5) noch mit ein — 1,2,3,4,5 sind fünf Durchläufe.
Ausführliche Erklärung
Richtig: B. for ist kopfgesteuert — die Bedingung entscheidet vor jeder Runde, ob es weitergeht.
i++) einer for-Schleife?Ausführliche Erklärung
Richtig: D. Erst läuft der Körper, dann das Update, dann erneut die Bedingung.
Ausführliche Erklärung
Richtig: B. Ein Laufzeitfehler entsteht dabei meist nicht — nur ein falsches, um eins verschobenes Ergebnis.
Ausführliche Erklärung
Richtig: A. Der klassische Anwendungsfall: eine bekannte, feste Anzahl an Wiederholungen.
for(int i=3; i>0; i--){print(i+" ");}Ausführliche Erklärung
Richtig: C. Mit i-- zählt die Schleife rückwärts von 3 bis 1 (bei i=0 ist die Bedingung i>0 falsch).
Ausführliche Erklärung
Richtig: B. Die Doppelpunkt-Syntax ist das Kennzeichen der erweiterten for-Schleife.
Ausführliche Erklärung
Richtig: D. Genau dort, wo der Index selbst nicht gebraucht wird, ist for-each die lesbarere Wahl.
for(int i=0; i<10; i--) — was passiert hier?Ausführliche Erklärung
Richtig: C. Update und Bedingung passen hier nicht zusammen — ein klassischer Endlosschleifen-Fehler.
int summe=0; for(int i=1;i<=3;i++){summe += i;} print(summe);Ausführliche Erklärung
Richtig: A. 1+2+3 = 6 — die Schleife summiert alle Werte von 1 bis 3 auf.
for(; i<10; i++)?Ausführliche Erklärung
Richtig: C. Alle drei Teile des Schleifenkopfs sind optional, solange die Semikolons als Trenner stehen bleiben.
for(int i=5;i<3;i++)?Ausführliche Erklärung
Richtig: A. Da for kopfgesteuert ist, wird die Bedingung schon vor der ersten Runde geprüft.
Ausführliche Erklärung
Richtig: B. while ist ebenso wie for kopfgesteuert.
Ausführliche Erklärung
Richtig: D. do-while ist fußgesteuert — die Prüfung erfolgt erst nach dem bereits ausgeführten Körper.
Ausführliche Erklärung
Richtig: A. Kopfgesteuerte Schleifen können komplett übersprungen werden.
Ausführliche Erklärung
Richtig: C. Der Körper läuft in jedem Fall zuerst, die Bedingung wird erst danach geprüft.
Ausführliche Erklärung
Richtig: D. Das Programm "hängt" dann dauerhaft in der Schleife fest.
Ausführliche Erklärung
Richtig: B. Ohne Veränderung der geprüften Variable bleibt die Bedingung dauerhaft wahr.
Ausführliche Erklärung
Richtig: D. Beide prüfen ihre Bedingung, bevor der Körper überhaupt betreten wird.
Ausführliche Erklärung
Richtig: B. Die Prüfung steht syntaktisch am "Fuß" der Schleife, nach dem Körper.
Ausführliche Erklärung
Richtig: A. Genau dieses Muster wurde in Teil 3.4 als "Eingabeprüfung" mit while gezeigt — do-while passt ebenso, wenn mindestens ein Versuch garantiert sein soll.
int i=0; while(i<3){print(i+" "); i++;}Ausführliche Erklärung
Richtig: C. Bei i=3 wird die Bedingung 3<3 false, die Schleife endet — 0,1,2 wurden ausgegeben.
int i=5; do{print(i+" "); i++;} while(i<3);Ausführliche Erklärung
Richtig: B. do-while führt den Körper immer zuerst aus, unabhängig vom Ausgangswert der Bedingung.
while(...);?Ausführliche Erklärung
Richtig: D. Die Position der Bedingung im Code spiegelt exakt wider, wann sie tatsächlich geprüft wird.
Ausführliche Erklärung
Richtig: C. Genau das ist der typische Einsatzfall — z. B. Eingabeprüfung, bis eine gültige Zahl kommt.
Ausführliche Erklärung
Richtig: A. for bündelt alle drei Teile im Kopf, while überlässt Init und Update dem umgebenden Code.
int i=0; while(i<5); {i++;} — was ist hier das Problem?Ausführliche Erklärung
Richtig: C. Ein verirrtes Semikolon nach der while-Bedingung ist ein tückischer, schwer zu findender Fehler.
Ausführliche Erklärung
Richtig: D. Dieses Vergleichspaar ist ein IHK-Standard-Prüfungsthema.
break innerhalb einer Schleife?Ausführliche Erklärung
Richtig: B. break ist der "Notausstieg" — sofort raus aus der gesamten Schleife.
continue innerhalb einer Schleife?Ausführliche Erklärung
Richtig: D. continue überspringt nur den Rest der aktuellen Runde, die Schleife läuft danach normal weiter.
for(int i=1;i<=5;i++){ if(i==3) break; print(i+" ");}Ausführliche Erklärung
Richtig: A. Bei i=3 beendet break die Schleife komplett, bevor die 3 ausgegeben wird.
for(int i=1;i<=5;i++){ if(i==3) continue; print(i+" ");}Ausführliche Erklärung
Richtig: C. Nur die Ausgabe bei i=3 wird übersprungen, die Schleife läuft aber bis zum Ende weiter.
for(int i=0;i<5;i++){ if(...) continue; ... } der Update-Teil (i++) trotz continue noch ausgeführt?Ausführliche Erklärung
Richtig: D. continue springt direkt zum Update-Teil der for-Schleife, nicht komplett aus ihr heraus.
Ausführliche Erklärung
Richtig: B. Ein häufiges Muster: sobald das Gesuchte gefunden ist, spart break unnötige weitere Durchläufe.
Ausführliche Erklärung
Richtig: D. Das ist die zentrale Unterscheidung zwischen beiden Sprunganweisungen.
break außerhalb einer Schleife oder eines switch-Blocks verwendet wird?Ausführliche Erklärung
Richtig: B. break ist nur innerhalb einer Schleife oder eines switch-Blocks syntaktisch gültig.
Ausführliche Erklärung
Richtig: A. break bezieht sich immer nur auf die direkt umschließende Schleife — äußere Schleifen laufen normal weiter.
int summe=0; for(int i=1;i<=10;i++){ if(i>3) break; summe+=i;} print(summe);Ausführliche Erklärung
Richtig: C. Sobald i=4 erreicht ist, bricht break die Schleife ab — nur 1, 2 und 3 wurden zuvor summiert.
Ausführliche Erklärung
Richtig: B. Derselbe Reihenfolge-Fallstrick wie bei der else-if-Kette in 3.1 — die speziellste Bedingung gehört immer zuerst.
if(i%3==0 && i%5==0){print("FizzBuzz");} else if(i%3==0){print("Fizz");} else if(i%5==0){print("Buzz");} else{print(i);}Ausführliche Erklärung
Richtig: D. 15 ist sowohl durch 3 als auch durch 5 teilbar — die erste, speziellste Bedingung trifft zu.
Ausführliche Erklärung
Richtig: C. Ist der Rest einer Division 0, ist die Zahl restlos teilbar — das Grundprinzip hinter FizzBuzz.
Ausführliche Erklärung
Richtig: A. Die Schleife selbst kümmert sich nicht darum, ob ein innerer if-Zweig zutraf oder nicht — sie läuft unabhängig weiter.
Ausführliche Erklärung
Richtig: C. Genau diese Kombination macht Wiederholung UND Entscheidung pro Runde möglich — der Kern praktisch jedes komplexeren Programms.
Ausführliche Erklärung
Richtig: A. Java setzt hier praktisch keine künstliche Grenze — Verschachtelungstiefe ist nur eine Frage der Lesbarkeit.
Ausführliche Erklärung
Richtig: B. Diese Brücke zu Clean Code (Teil 5.5) zeigt: technisch erlaubt heißt nicht automatisch gut lesbar.
Ausführliche Erklärung
Richtig: D. Diese drei Kategorien bilden zusammen das komplette Werkzeug, um den Kontrollfluss eines Java-Programms zu steuern.
Ausführliche Erklärung
Richtig: A. Wie ein Keksausstecher legt die Klasse Form und Eigenschaften fest, ohne selbst ein konkretes Exemplar zu sein.
Ausführliche Erklärung
Richtig: C. Das Objekt ist der tatsächlich "gebackene Keks" aus dem Klassen-Bauplan.
Ausführliche Erklärung
Richtig: D. new ist der feste Startpunkt jeder Objekterzeugung in Java.
Ausführliche Erklärung
Richtig: B. Attribute beschreiben, WAS ein Objekt ist — im Gegensatz zu Methoden, die beschreiben, was es kann.
Hund a = new Hund(); Hund b = new Hund(); a.name="Rex"; — beeinflusst das b.name?Ausführliche Erklärung
Richtig: D. Jedes new-Objekt erhält seinen eigenen, unabhängigen Speicherbereich im Heap.
new erzeugtes Objekt im Speicher?Ausführliche Erklärung
Richtig: B. Objekte leben im Heap; nur die Referenz darauf liegt im Stack.
Hund bello?Ausführliche Erklärung
Richtig: A. Objekttypen sind Referenztypen — die Variable ist nur der "Wegweiser".
Ausführliche Erklärung
Richtig: C. Attribute bekommen — anders als lokale Variablen — automatisch einen Default-Wert.
Ausführliche Erklärung
Richtig: B. Bauplan und Ausprägung — genau dieses Verhältnis ist der Kern der OOP.
Ausführliche Erklärung
Richtig: D. Eine Klasse kann beliebig oft instanziiert werden, jedes Mal mit eigenem Zustand.
new Hund(), bezogen auf den Konstruktor?Ausführliche Erklärung
Richtig: C. new und Konstruktoraufruf gehören untrennbar zusammen.
Ausführliche Erklärung
Richtig: A. Der Bauplan wird einmal geladen, jedes Objekt bekommt aber seinen eigenen Speicherbereich.
Ausführliche Erklärung
Richtig: C. Methoden beschreiben das Verhalten, das ein Objekt zeigen kann.
Ausführliche Erklärung
Richtig: A. Der Parameter steht in der Methodendefinition, das Argument beim tatsächlichen Aufruf.
Ausführliche Erklärung
Richtig: B. Der Rückgabetyp zählt bewusst nicht zur Signatur — wichtig für die genaue Overloading-Regel.
Ausführliche Erklärung
Richtig: D. Nicht zu verwechseln mit Overriding — Overloading bleibt innerhalb derselben Klasse.
void als Rückgabetyp einer Methode?Ausführliche Erklärung
Richtig: A. void-Methoden können trotzdem beliebig viel Code ausführen — sie liefern nur keinen Wert an den Aufrufer zurück.
int hat (nicht void)?Ausführliche Erklärung
Richtig: C. Ohne return-Anweisung mit passendem Typ meldet der Compiler einen Fehler.
Ausführliche Erklärung
Richtig: D. Genau das ist die Definition der Methodensignatur, auf der Overloading beruht.
void bellen(){...} int jahreAlsMensch(){return alter*7;} — welche Aussage stimmt?Ausführliche Erklärung
Richtig: B. Nur ein nicht-void-Rückgabetyp verlangt zwingend ein return.
bellen()?Ausführliche Erklärung
Richtig: D. Ausgaben, Zustandsänderungen etc. sind typische Seiteneffekte ohne echten Rückgabewert.
int kein return enthält?Ausführliche Erklärung
Richtig: B. Der Compiler verlangt für jeden Codepfad ein passendes return.
Ausführliche Erklärung
Richtig: A. Die "Gussform", die ein Objekt direkt bei der Erzeugung befüllt.
Ausführliche Erklärung
Richtig: C. Nur so erkennt Java den Konstruktor als solchen.
Ausführliche Erklärung
Richtig: B. Selbst void ist bei einem echten Konstruktor nicht erlaubt — genau das unterscheidet ihn syntaktisch von einer Methode.
Ausführliche Erklärung
Richtig: D. Dieser automatische Standardkonstruktor lässt alle Attribute auf ihrem Default-Wert.
Ausführliche Erklärung
Richtig: C. Ein häufiger Fehler: new Klasse() erwarten, obwohl nur ein parametrisierter Konstruktor existiert.
this innerhalb eines Konstruktors typischerweise gebraucht?Ausführliche Erklärung
Richtig: A. this.name = name; unterscheidet klar Attribut (links) und Parameter (rechts).
this(name, 0); als erste Zeile in einem Konstruktor?Ausführliche Erklärung
Richtig: C. So lässt sich Code zwischen überladenen Konstruktoren wiederverwenden.
this(...)-Aufruf zwingend stehen, falls verwendet?Ausführliche Erklärung
Richtig: A. Genau wie super(...) muss auch this(...) die erste Anweisung im Konstruktor sein.
Ausführliche Erklärung
Richtig: B. Überladene Konstruktoren bieten flexible Erzeugungswege für dieselbe Klasse.
new Hund() (ohne Argumente)?Ausführliche Erklärung
Richtig: D. Genau der Fall aus Kapitel 4.3 — der Standardkonstruktor entfällt, sobald ein eigener existiert.
Ausführliche Erklärung
Richtig: A. Der "abgeschlossene Medizinschrank" aus Kapitel 4.4 — Zugriff nur über kontrollierte Türen.
Ausführliche Erklärung
Richtig: C. private ist der striktestte der vier Zugriffsmodifizierer.
Ausführliche Erklärung
Richtig: D. public ist der offenste der vier Zugriffsmodifizierer.
Ausführliche Erklärung
Richtig: B. Getter erlauben Lesezugriff, ohne das Attribut komplett offenzulegen.
Ausführliche Erklärung
Richtig: D. Der große Vorteil eines Setters gegenüber direktem Zugriff: eingebaute Prüfungen.
private double kontostand; public void einzahlen(double betrag){ if(betrag>0){kontostand+=betrag;} } — warum ist das besser als ein öffentliches Attribut?Ausführliche Erklärung
Richtig: B. Genau das Konto-Beispiel aus Kapitel 4.4 zeigt diesen Vorteil.
objekt.attribut = wert;?Ausführliche Erklärung
Richtig: A. Genau diese Abschottung ist der ganze Sinn von private.
Ausführliche Erklärung
Richtig: C. Dieses Quartett ist DER Kern jeder OOP-Prüfungsfrage.
Ausführliche Erklärung
Richtig: B. protected ist eine "mittlere" Sichtbarkeitsstufe zwischen private und public.
Ausführliche Erklärung
Richtig: D. Ohne jedes Schlüsselwort gilt automatisch diese mittlere Sichtbarkeitsstufe.
Ausführliche Erklärung
Richtig: C. Das ist der eigentliche, langfristige Nutzen von Kapselung.
Ausführliche Erklärung
Richtig: A. Genau diese beiden Punkte sind die zentralen Vorteile — nichts mit Performance oder Speicher.
extends?Ausführliche Erklärung
Richtig: C. extends ist das Schlüsselwort für Vererbung in Java.
Ausführliche Erklärung
Richtig: A. Java erlaubt bewusst nur Einfachvererbung — Mehrfachvererbung gibt es nur über Interfaces.
super(...) in einem Unterklassen-Konstruktor verwendet?Ausführliche Erklärung
Richtig: B. So wird sichergestellt, dass die Oberklasse ihre eigenen Attribute korrekt initialisiert.
@Override typischerweise verwendet?Ausführliche Erklärung
Richtig: D. @Override schützt vor Tippfehlern, die sonst versehentlich eine neue, eigenständige Methode erzeugen würden.
Ausführliche Erklärung
Richtig: A. Overriding ist die Grundlage für Polymorphie in Kapitel 4.6.
Ausführliche Erklärung
Richtig: C. Genau das erspart Code-Duplizierung — der eigentliche Sinn der Vererbung.
super(...)-Aufruf stehen, falls verwendet?Ausführliche Erklärung
Richtig: D. Die Oberklasse muss zuerst initialisiert sein, bevor die Unterklasse eigene Schritte ergänzt.
class Tier{void lautGeben(){...}} class Hund extends Tier{@Override void lautGeben(){...}} — was passiert bei einem Hund-Objekt beim Aufruf von lautGeben()?Ausführliche Erklärung
Richtig: B. Die überschriebene Version der konkreten Klasse hat Vorrang vor der geerbten.
Ausführliche Erklärung
Richtig: D. Für Zugriff aus Unterklassen wird typischerweise protected statt private verwendet.
super.methode() innerhalb einer überschreibenden Methode?Ausführliche Erklärung
Richtig: B. super.methode() erlaubt gezielten Zugriff auf das ursprüngliche, überschriebene Verhalten.
Hund extends Tier?Ausführliche Erklärung
Richtig: A. Diese "Ist-ein"-Beziehung ist auch die Grundlage für die Polymorphie in Kapitel 4.6.
Ausführliche Erklärung
Richtig: C. Overriding ist optional — ohne eigene Version gilt einfach die geerbte.
Ausführliche Erklärung
Richtig: B. Der "Play-Knopf", der je nach Gerät etwas anderes tut — die Analogie aus Kapitel 4.6.
Ausführliche Erklärung
Richtig: D. Dynamische Bindung ist der technische Mechanismus hinter Polymorphie.
Tier[] tiere = new Tier[2]; tiere[0]=new Hund("Bello"); — ist das erlaubt?Ausführliche Erklärung
Richtig: C. Genau die "Ist-ein"-Beziehung erlaubt diese Zuweisung ohne Cast.
t.lautGeben(), wenn t vom deklarierten Typ Tier ist, aber tatsächlich ein Hund-Objekt referenziert (mit überschriebener Methode)?Ausführliche Erklärung
Richtig: A. Entscheidend ist der tatsächliche Objekttyp, nicht der deklarierte Variablentyp.
Ausführliche Erklärung
Richtig: C. Ein IHK-Prüfungsklassiker: die Unterscheidung statische vs. dynamische Bindung.
Ausführliche Erklärung
Richtig: D. Ohne Overriding gäbe es nichts, zwischen dem zur Laufzeit unterschieden werden könnte.
Ausführliche Erklärung
Richtig: B. Genau das zeigte das Tierheim-Beispiel aus Kapitel 4.6.
Ausführliche Erklärung
Richtig: D. Ohne eigene Überschreibung greift automatisch das geerbte Verhalten.
Ausführliche Erklärung
Richtig: A. Das Gegenstück zur dynamischen Bindung bei Polymorphie.
Ausführliche Erklärung
Richtig: C. "Ein Aufruf, viele Verhalten" — die Kurzformel für Polymorphie.
Ausführliche Erklärung
Richtig: D. Der "unvollständige Bauplan" aus Kapitel 4.7.
Ausführliche Erklärung
Richtig: B. Nur Signatur und Semikolon statt geschweifter Klammern.
new Form();, wenn Form eine abstract class ist?Ausführliche Erklärung
Richtig: D. Bereits der Compiler verweigert die direkte Instanziierung.
Ausführliche Erklärung
Richtig: B. Erst durch vollständige Implementierung wird die Unterklasse instanziierbar.
Ausführliche Erklärung
Richtig: A. Genau diese Mischung macht abstrakte Klassen flexibel — anders als klassische Interfaces.
abstract class Form{ abstract double flaeche(); void beschreiben(){print("Fläche: "+flaeche());} } — funktioniert beschreiben(), obwohl flaeche() abstrakt ist?Ausführliche Erklärung
Richtig: C. Genau das Muster aus dem Kreis-Beispiel in Kapitel 4.7.
Ausführliche Erklärung
Richtig: B. Genau dieses Mischverhalten unterscheidet abstrakte Klassen von reinen Interfaces.
Ausführliche Erklärung
Richtig: D. Ein "unvollständiger" Bauplan kann sich weitervererben, bis irgendeine Unterklasse ihn komplettiert.
Ausführliche Erklärung
Richtig: C. Der "Vertrag" aus Kapitel 4.8 — wer unterschreibt, verspricht bestimmte Fähigkeiten.
Ausführliche Erklärung
Richtig: A. Genau darin liegt der Vorteil gegenüber der Einfachvererbung mit extends.
implements Fliegbar deklariert?Ausführliche Erklärung
Richtig: C. Der "Vertrag" muss vollständig erfüllt werden, sonst meldet der Compiler einen Fehler.
Ausführliche Erklärung
Richtig: A. Ein zentraler Entscheidungspunkt: abstrakte Klasse (mit Zustand, aber nur einmal erbbar) vs. Interface (mehrfach implementierbar).
Ausführliche Erklärung
Richtig: B. Java 8 führte default-Methoden ein und verwischte damit die einst strikte Trennung zu abstrakten Klassen etwas.
Ausführliche Erklärung
Richtig: D. Das komplette OOP-Quartett — die Basis für jede weiterführende Java-Prüfungsfrage.
Die 80 Fragen zu Teil 5 folgen in der nächsten Ausbaustufe.