In Java verwendet man oft JUnit für Unit-Tests. Nenne zwei grundlegende Annotationen aus JUnit 5 und beschreibe kurz, wofür sie jeweils eingesetzt werden.
In JUnit 5 sind zwei grundlegende Annotationen:
@Test Diese Annotation markiert eine Methode als Testmethode. JUnit führt alle Methoden mit dieser Annotation automatisch beim Testlauf aus.
@Test
@BeforeEach Diese Methode wird vor jedem einzelnen Test ausgeführt. Sie eignet sich z. B. zum Initialisieren gemeinsamer Testdaten oder Objekte.
@BeforeEach
Es gibt noch weitere nützliche Annotationen wie @AfterEach, @BeforeAll, @AfterAll, aber die beiden oben sind ein guter Startpunkt.
@AfterEach
@BeforeAll
@AfterAll
Was ist der Unterschied zwischen einer checked und einer unchecked Exception in Java? Gib ein Beispiel für jede Art von Exception.
Checked Exceptions:
Müssen beim Kompilieren behandelt werden (z. B. try-catch oder throws).
try-catch
throws
Erben von Exception, aber nicht von RuntimeException.
Exception
RuntimeException
Werden meist für vorhersehbare Fehlerzustände verwendet (z. B. Datei nicht gefunden).
Beispiel: IOException, SQLException
IOException
SQLException
Unchecked Exceptions:
Müssen nicht behandelt werden – werden zur Laufzeit geworfen.
Erben von RuntimeException.
Werden für Programmierfehler oder unerwartete Laufzeitprobleme genutzt.
Beispiel: NullPointerException, IllegalArgumentException
NullPointerException
IllegalArgumentException
Was ist der Zweck von Java-Packages, und wie wirken sie sich auf Zugriffsrechte und Organisation des Codes aus?
Dienen der Strukturierung und Organisation großer Codebasen.
Gruppieren zusammengehörige Klassen, Schnittstellen und Enums.
Bestimmen teilweise Zugriffsrechte:
Klassen/Felder/Methoden ohne Modifier sind nur innerhalb des gleichen Packages sichtbar (package-private).
Zugriff auf Klassen aus anderen Packages:
Erfordert import (z. B. import java.util.List;).
import
import java.util.List;
Public-Klassen und -Methoden sind überall sichtbar, egal in welchem Package.
Was ist der Unterschied zwischen einer abstrakten Klasse und einem Interface in Java?Wann würdest du eher das eine oder das andere verwenden?
Interface:
Definiert nur Methodensignaturen (ab Java 8 auch default- und static-Methoden mit Implementierung).
default
static
Keine Konstruktoren.
Alle Methoden sind implizit public abstract, alle Felder public static final.
public abstract
public static final
Ermöglicht Mehrfachvererbung von Verhalten.
Wird verwendet, wenn man Fähigkeiten definieren will („was ein Objekt tun kann“, z. B. Comparable, Runnable).
Comparable
Runnable
Abstrakte Klasse:
Kann Methoden mit und ohne Implementierung enthalten.
Kann Felder, Konstruktoren und nicht-abstrakte Methoden besitzen.
Nur Einzelvererbung möglich.
Wird verwendet, wenn Klassen eine gemeinsame Basisklasse mit Teilimplementierung brauchen.
Was versteht man unter Test-Driven Development (TDD) in Java – und wie läuft ein typischer TDD-Zyklus ab?
Entwicklermethode, bei der Tests vor dem eigentlichen Code geschrieben werden.
Fördert gutes Design und Testabdeckung.
Typischer Zyklus (Red-Green-Refactor):
Red – Failing Test schreiben.
Green – Minimalen Code schreiben, damit der Test besteht.
Refactor – Code verbessern bei grünem Teststatus.
Häufig eingesetzt in Kombination mit JUnit in Java.
Was ist der Unterschied zwischen == und .equals() beim Vergleichen von Objekten in Java?Erkläre es mit einem kurzen Beispiel, z. B. für Strings.
==
.equals()
==:
Vergleicht Referenzen bei Objekten (zeigt auf dasselbe Objekt im Speicher?).
Vergleicht Werte direkt, wenn es sich um primitive Typen handelt (z. B. int a = 5;).
int a = 5;
.equals():
Vergleicht den Inhalt zweier Objekte.
Muss von der Klasse überschrieben werden, um sinnvoll zu funktionieren.
Was passiert, wenn in Java in einer Methode eine Exception geworfen wird, aber nicht behandelt wird? Was muss man tun, damit der Code trotzdem kompiliert und ausgeführt werden kann?
Wenn eine checked Exception geworfen, aber nicht behandelt wird:
➜ Compilerfehler
Lösung:
Entweder mit try-catch block behandeln
Oder mit throws in Methodensignatur deklarieren:
Wenn es eine unchecked Exception ist (z. B. NullPointerException):
➜ Kein Compilerfehler
Kann zur Laufzeit abbrechen, wenn sie nicht gefangen wird
Was ist der Unterschied zwischen ArrayList und LinkedList in Java?Wann würdest du welche Liste verwenden?
ArrayList
LinkedList
ArrayList:
Intern als dynamisches Array implementiert.
Schneller bei Zugriff über Index (z. B. get(0), get(5)).
get(0)
get(5)
Langsam, wenn man häufig Elemente am Anfang oder in der Mitte einfügt oder entfernt (weil verschoben werden muss).
Guter Standard für allgemeine Listenoperationen.
LinkedList:
Intern als doppelt verkettete Liste implementiert.
Schneller bei Einfügen und Entfernen an beliebiger Stelle, besonders am Anfang oder Ende.
Langsamer beim Zugriff per Index, weil sie die Liste durchlaufen muss.
Auch als Queue oder Stack verwendbar (z. B. addFirst, removeLast etc.).
addFirst
removeLast
Situation
Bessere Wahl
Schneller Zugriff per Index
Häufiges Einfügen/Entfernen
Speicheroptimiertes Verhalten
ArrayList (meist)
Was ist eine final-Variable in Java? Was bewirkt das Schlüsselwort final bei:
final
Variablen
Methoden
Klassen
1. final bei Variablen:
Bedeutet: Die Variable darf nach der Initialisierung nicht mehr verändert werden.
Gilt für primitive Typen und Referenzen:
Bei primitiven Typen: der Wert ist fest.
Bei Referenzen: das Objekt kann sich nicht ändern – aber sein Inhalt schon (z. B. bei Listen).
Beispiel:
2. final bei Methoden:
Eine final-Methode kann nicht überschrieben (overridden) werden.
Wird oft verwendet, um bestimmtes Verhalten in Subklassen zu verhindern oder zu schützen.
3. final bei Klassen:
Eine final-Klasse kann nicht erweitert (geerbt) werden.
Wird verwendet, um die Klasse „abzuschließen“ – z. B. java.lang.String ist final.
java.lang.String
Zusammengefasst:
Element
Wirkung von final
Variable
Nur einmal zuweisbar
Methode
Nicht überschreibbar
Klasse
Nicht vererbbar
Was ist der Unterschied zwischen einer static Methode und einer Instanzmethode in Java?
🔹 static Methode:
Gehört zur Klasse, nicht zu einem konkreten Objekt.
Kann ohne ein Objekt aufgerufen werden.
Hat keinen Zugriff auf Instanzvariablen oder -methoden, außer über ein Objekt.
Wird oft für Hilfsmethoden verwendet (z. B. Math.sqrt()).
Math.sqrt()
🔹 Instanzmethode (nicht-static):
Gehört zu einem bestimmten Objekt der Klasse.
Hat Zugriff auf Instanzvariablen und andere Methoden des Objekts.
Muss über ein konkretes Objekt aufgerufen werden.
Merkmal
static Methode
Instanzmethode
Zugehörigkeit
Objekt
Aufruf
Klasse.methode()
objekt.methode()
Zugriff auf this
this
❌ Nicht erlaubt
✅ Möglich
Beispiel
Math.max(a, b)
hund.bellen()
Was versteht man in Java unter Polymorphie?Und wie zeigt sie sich im Zusammenspiel zwischen Oberklassen und Unterklassen?
Polymorphie bedeutet, dass ein Objekt in verschiedenen Formen auftreten kann – z. B. als Instanz seiner Klasse und als Instanz einer Oberklasse oder eines Interfaces.
Der entscheidende Punkt: Methodenaufrufe verhalten sich je nach tatsächlichem Objekttyp unterschiedlich, selbst wenn die Referenz den Typ der Oberklasse hat.
Man nennt das dynamisches Binden (Late Binding): Die Methode wird zur Laufzeit aufgelöst, nicht beim Kompilieren.
Wichtig: Die Methode, die zur Laufzeit aufgerufen wird, hängt vom tatsächlichen Objekttyp ab (Hund) – nicht vom Typ der Referenz (Tier).
Hund
Tier
Polymorphie ermöglicht flexible und erweiterbare Programme, z. B. durch Verwendung von Oberklassen oder Interfaces als Methodensignaturen.
Was ist der Unterschied zwischen den Zugriffsmodifikatoren private, protected, public und dem standardmäßigen (package-private) in Java?
private
protected
public
Modifikator
Sichtbarkeit
Überall – in allen Klassen, Paketen, Projekten
Im gleichen Package und in Unterklassen (auch außerhalb des Packages)
(kein Modifikator) (package-private)
Nur im gleichen Package
Nur innerhalb der gleichen Klasse
Was ist der Unterschied zwischen einer for-each-Schleife und einer klassischen for-Schleife in Java? Wann eignet sich welche Variante besser?
Klassische for-Schleife:
for
Manuell gesteuerte Schleife mit Index.
Gut geeignet, wenn:
Man den Index braucht.
Man nur jedes zweite/dritte/... Element bearbeiten will.
Man gezielt an einer Stelle einsteigen oder abbrechen möchte.
for-each-Schleife:
for-each
Syntax: for (Typ element : collection) { ... }
for (Typ element : collection) { ... }
Ideal für einfaches Durchlaufen aller Elemente.
Zusammenfassung:
for-Schleife
for-each-Schleife
Zugriff auf Index
✅
❌
Lesbarkeit
mittel
hoch
Flexibilität
gering
Anwendung
Arrays, Listen, alles
Collections, Arrays
Was ist der Unterschied zwischen einem String, einem StringBuilder und einem StringBuffer in Java?
String
StringBuilder
StringBuffer
Wofür würdest du welche Variante verwenden?
🔹 String
Unveränderlich (immutable) – jede Änderung erzeugt ein neues Objekt.
String s = "Hallo";
s += " Welt"; // erzeugt neues String-Objekt
Gut für:
Kurze Texte
Konstanten
Wenig Veränderungen
Langsam bei vielen Änderungen, z. B. in Schleifen
🔹 StringBuilder
Veränderlich (mutable) – Änderungen erfolgen im selben Objekt.
Nicht thread-sicher (nicht synchronisiert).
Deutlich schneller als String bei vielen Zeichenkettenoperationen.
StringBuilder sb = new StringBuilder("Hallo");
sb.append(" Welt"); // kein neues Objekt
Viele String-Operationen (z. B. in Schleifen)
Einzel-Thread-Szenarien
🔹 StringBuffer
Wie StringBuilder, aber thread-sicher (synchronisiert).
Langsamer als StringBuilder, aber sicher in mehreren Threads.
StringBuffer sb = new StringBuffer("Hallo");
sb.append(" Welt");
Mehrere Threads, die gleichzeitig auf denselben String schreiben
Typ
Änderbar
Thread-sicher
Geschwindigkeit
Geeignet für
langsam (bei Änderung)
Wenige Änderungen, Konstanten
schnell
Einzel-Thread, viele Änderungen
langsamer
Multi-Thread-Anwendungen
Last changed13 days ago