Als weit ver­brei­te­te Pro­gram­mier­spra­che ist Java mit seinen Be­son­der­hei­ten auch bei Re­crui­tern bekannt. Daher werden durchaus schon in frühen Phasen Fragen zu un­ter­schied­li­chen Bereichen von Java gestellt. Wir haben zehn häufige Fragen an Java-Ent­wick­le­rin­nen und -Ent­wick­ler und die dazu passenden Antworten zu­sam­men­ge­stellt.

Dieser Artikel gibt einen Überblick über die Band­brei­te an po­ten­zi­el­len Fragen in einem Be­wer­bungs­ge­spräch, wenn es um die Pro­gram­mier­spra­che Java geht. Je nach Grad der Be­rufs­er­fah­rung, die vor­aus­ge­setzt wird, können die Fragen auch de­tail­lier­ter gestellt sein. Mitunter werden Szenarien be­schrie­ben, die ab­sicht­lich Fehler enthalten oder für Ex­per­tin­nen und Experten klar als ir­re­füh­rend zu erkennen sind. Eine gute Vor­be­rei­tung ist deshalb Pflicht, um im Gespräch zu punkten!

Frage 1 zum Einstieg: Was sind die Be­son­der­hei­ten von Java und welche Vorteile bietet die Pro­gram­mier­spra­che?

Wer Java als Pro­gram­mier­spra­che erlernt, erhält damit eine sehr leis­tungs­star­ke und weit ver­brei­te­te Sprache. Java hebt dich durch einige Be­son­der­hei­ten, ins­be­son­de­re in der Anwendung, von anderen Sprachen ab. Der Kernpunkt ist dabei, dass Java ohne Än­de­run­gen am Code auf ganz ver­schie­de­nen Be­triebs­sys­te­men aus­ge­führt werden kann.

Diese Fle­xi­bi­li­tät in der Platt­form­nut­zung wird durch die Java Virtual Machine er­mög­licht. Weder Ent­wick­lung noch Anwendung sind auf eine bestimmte Plattform begrenzt, jeder ent­wi­ckel­te Code kann platt­form­über­grei­fend genutzt werden. Dies sorgt dafür, dass Programme flexibel und effizient auf ver­schie­de­nen Geräten laufen.

Ein weiterer Vorteil von Java liegt in der au­to­ma­ti­schen Spei­cher­ver­wal­tung durch den Garbage Collector, der die Ver­wal­tung von Spei­cher­res­sour­cen er­leich­tert und po­ten­zi­el­le Feh­ler­quel­len reduziert. Zudem stellt die um­fang­rei­che Stan­dard­bi­blio­thek von Java viele vor­ge­fer­tig­te Funk­tio­nen bereit und be­schleu­nigt so die Ent­wick­lung von An­wen­dun­gen.

Als ob­jekt­ori­en­tier­te Pro­gram­mier­spra­che punktet Java, wie auch andere Sprachen dieser Kategorie, dadurch, dass Software-Kom­po­nen­ten leichter mo­del­liert werden können und der Code zudem immer wie­der­ver­wen­det werden kann.

Frage 2 der Java-Interview-Fragen: Wie geht Java mit Mehr­fach­ver­er­bung um?

Grund­sätz­lich wird bei Java keine Mehr­fach­ver­er­bung von Klassen un­ter­stützt. Damit können Klassen immer nur von einer einzigen Klasse erben. Eine Mehr­fach­ver­er­bung kann sich bei ob­jekt­ori­en­tier­ter Pro­gram­mie­rung negativ auf den Code auswirken, ein bekanntes Problem ist hier das so­ge­nann­te Diamant-Problem.

Obwohl eine Mehr­fach­ver­er­bung für Klassen bei Java nicht möglich ist, kann dies durch Schnitt­stel­len (in­ter­faces) gelöst werden. Der Work­around: Eine Klasse kann in Java mehrere Schnitt­stel­len im­ple­men­tie­ren und dadurch Funk­tio­na­li­tä­ten aus un­ter­schied­li­chen Quellen erben. Durch diese Zuordnung wird si­cher­ge­stellt, dass die Funk­tio­nen klar definiert sind und bekannte Probleme bei Mehr­fach­ver­er­bung nicht auftreten können.

Frage 3: Was ist bei Java der Un­ter­schied zwischen einer abstract class und einem interface?

Sowohl abstrakte Klassen als auch Schnitt­stel­len (in­ter­faces) werden in Java dazu genutzt, abstrakte Typen zu de­fi­nie­ren, die dann wiederum von anderen Klassen im­ple­men­tiert werden können. Nicht nur im Bereich der Ver­er­bungs­re­geln gibt es si­gni­fi­kan­te Un­ter­schie­de:

  • Vererbung: Eine Klasse kann in Java immer nur von einer abs­trak­ten Klasse erben. Abstrakte Klassen können wiederum keine Mehr­fach­ver­er­bung durch­füh­ren, sodass hierfür mehrere Schnitt­stel­len im­ple­men­tiert werden müssen.
  • Klas­sen­be­zie­hung: Da eine Klasse nur von einer abs­trak­ten Klasse erben kann, eignet sich die Ver­wen­dung von abs­trak­ten Klassen gut für “ist ein”-Be­zie­hun­gen, während in­ter­faces besser für “kann”-Be­zie­hun­gen geeignet sind.
  • Kon­kret­heit: Eine abstrakte Klasse kann abstrakte (nicht im­ple­men­tier­te) und konkrete (im­ple­men­tier­te) Methoden enthalten und darüber hinaus auch In­stanz­va­ria­blen besitzen. Im Gegensatz dazu können in­ter­faces nur abstrakte Methoden und Kon­stan­ten de­fi­nie­ren. Alle Methoden in einem interface sind implizit abstrakt und öf­fent­lich.
  • Funk­tio­na­li­tät: Abstrakte Klassen setzen darauf, eine ge­mein­sa­me Im­ple­men­tie­rung zu teilen (und so mehrere Schnitt­stel­len zu im­ple­men­tie­ren). Schnitt­stel­len hingegen sind darauf aus­ge­rich­tet, bestimmte Funk­tio­nen zu de­kla­rie­ren, die dann wiederum in ver­schie­de­ne Klassen im­ple­men­tiert werden.
Web­hos­ting
Das beste Web­hos­ting zum Spit­zen­preis
  • 3x schneller und 60 % günstiger
  • Maximale Ver­füg­bar­keit mit > 99.99 %
  • Nur bei IONOS: Bis zu 500 GB Spei­cher­platz inklusive

Frage 4: Worin liegt der Un­ter­schied zwischen In­stanz­va­ria­blen und lokalen Variablen?

Der Haupt­un­ter­schied zwischen In­stanz­va­ria­blen und lokalen Variablen liegt in ihrem Gel­tungs­be­reich und ihrer Le­bens­dau­er. In­stanz­va­ria­blen sind vor­der­grün­dig Ei­gen­schaf­ten eines Objekts innerhalb einer Klasse, lokale Variablen stellen temporär angelegte Werte in einem be­stimm­ten Gel­tungs­be­reich dar.

In­stanz­va­ria­blen

  • In­stanz­va­ria­blen sind Variablen, die auf Klas­se­n­e­be­ne de­kla­riert werden. Sie stehen außerhalb von Methoden, Kon­struk­to­ren oder Blöcken.
  • Jedes Objekt einer Klasse besitzt eine eigene Kopie einer In­stanz­va­ria­blen.
  • Der Zugriff auf In­stanz­va­ria­blen erfolgt über die Instanz einer Klasse. Die Werte können für jedes Objekt der Klasse un­ter­schied­lich sein.

Lokale Variablen

  • Lokale Variablen werden innerhalb einer Methode, eines Kon­struk­tors oder eines Blocks de­kla­riert. Ihre Gül­tig­keit ist dabei auf diesen fest­ge­leg­ten Bereich begrenzt.
  • Diese Variablen müssen, bevor sie verwendet werden, explizit in­itia­li­siert werden. Sie exis­tie­ren nur für die Dauer der Aus­füh­rung des Code­blocks.
  • Außerhalb des Code­blocks, in dem sie de­kla­riert wurden, sind sie nicht sichtbar.

Frage 5: Was versteckt sich hinter den Begriffen JVM, JDK und JRE und wie grenzen sich diese von­ein­an­der ab?

Auch wenn die Be­griff­lich­kei­ten abgekürzt ähnlich er­schei­nen, un­ter­schei­den sich die da­hin­ter­ste­hen­den Aufgaben und deren Umfang innerhalb Javas grund­le­gend.

Java Virtual Machine (JVM)

  • Die Java Virtual Machine ist eine virtuelle Maschine und bildet die Schnitt­stel­le zwischen dem Java-Programm und der dar­un­ter­lie­gen­den Hardware bzw. dem Be­triebs­sys­tem. In ihr wird der so­ge­nann­te Java-Bytecode aus­ge­führt.
  • Dies ist deshalb von Bedeutung, weil die JVM als Lauf­zeit­um­ge­bung denselben Bytecode auf un­ter­schied­li­chen Be­triebs­sys­te­men ausführen kann, sofern sie auf den je­wei­li­gen Platt­for­men vorhanden ist. Die JVM trägt so maß­geb­lich dazu bei, die Por­ta­bi­li­tät von Java si­cher­zu­stel­len.
  • Dem zugrunde liegt die Funk­tio­na­li­tät, dass der Java-Compiler den Java-Quellcode in Bytecode übersetzt, der dann im weiteren Verlauf von der JVM in­ter­pre­tiert werden kann.

Java De­ve­lo­p­ment Kit (JDK)

  • Das Java De­ve­lo­p­ment Kit umfasst das komplette Ent­wick­lungs­pa­ket und bündelt damit diverse Tools, die bei der Ent­wick­lung von Java-An­wen­dun­gen helfen. Im Software-Kit enthalten sind bei­spiels­wei­se Werkzeuge, mit denen An­wen­dun­gen erstellt, kom­pi­liert oder debuggt werden können.
  • Unter anderem sind im JDK der Java-Compiler, die Java Virtual Machine sowie Java-Debugger und Java-Profiler enthalten.
  • Zu­sätz­lich zur vor­han­de­nen Software enthält das De­ve­lo­p­ment Kit eine Vielzahl von vor­de­fi­nier­ten Klassen und Schnitt­stel­len für häufig ver­wen­de­te Funk­tio­nen, die in der Java API bzw. der Java-Klas­sen­bi­blio­thek be­reit­ste­hen.

Java Runtime En­vi­ron­ment (JRE)

  • Das Java Runtime En­vi­ro­m­ent stellt eine re­du­zier­te Umgebung bereit, in der die Java-An­wen­dun­gen aus­ge­führt werden.
  • In der Lauf­zeit­um­ge­bung sind die Java Virtual Machine und die Java API enthalten. Sie sind jeweils notwendig, um die An­wen­dun­gen zu starten und aus­zu­füh­ren.
  • Ent­wick­lungs­werk­zeu­ge wie der Java-Compiler sind in der JRE nicht enthalten, weshalb diese Umgebung meist von End­nut­ze­rin­nen und -nutzern in­stal­liert wird.

Frage 6: Was versteht man in Java unter der „coll­ec­tion class“ und wozu wird diese genutzt?

Der Begriff coll­ec­tion class bezieht sich in Java in der Regel auf Klassen, die Teil des so­ge­nann­ten Java Coll­ec­tions Frame­works sind. Das Framework bietet eine stan­dar­di­sier­te Mög­lich­keit, Gruppen von Objekten zu speichern, zu or­ga­ni­sie­ren und zu ma­ni­pu­lie­ren. Es besteht aus ver­schie­de­nen Schnitt­stel­len und konkreten Im­ple­men­tie­run­gen von Da­ten­struk­tu­ren.

Die Coll­ec­tion-Klassen werden für ver­schie­de­ne Zwecke genutzt:

  • Da­ten­or­ga­ni­sa­ti­on: Sie er­mög­li­chen die ef­fi­zi­en­te Or­ga­ni­sa­ti­on von Daten in Listen, Sets oder Maps.
  • Da­ten­ma­ni­pu­la­ti­on: Sie bieten Methoden zum Hin­zu­fü­gen, Entfernen und Durch­su­chen von Elementen.
  • Ge­ne­ri­sche Pro­gram­mie­rung: Die Ver­wen­dung von ge­ne­ri­schen Typen in Coll­ec­tion-Klassen er­mög­licht die Er­stel­lung von wie­der­ver­wend­ba­rem und typ­si­che­rem Code.
  • Al­go­rith­men: Das Framework enthält auch Al­go­rith­men, die auf den Da­ten­struk­tu­ren operieren, z. B. zum Sortieren oder Durch­su­chen.

Frage 7: Was un­ter­schei­det == von equals() in Java?

== und equals() sind zwei ver­schie­de­ne Me­cha­nis­men bzw. Ope­ra­to­ren, die für einen Vergleich von Objekten genutzt werden:

  • Der ==-Operator ver­gleicht die Re­fe­ren­zen von Objekten, nicht ihre in­halt­li­chen Werte. Bei der Ver­wen­dung mit Objekten wird durch == geprüft, ob die beiden Re­fe­ren­zen auf dasselbe Objekt zeigen, also dass sie auf denselben Spei­cher­be­reich verweisen. Im Gegensatz dazu werden bei den pri­mi­ti­ven Da­ten­ty­pen (z. B. char, int oder byte) die Werte durch den Operator ab­ge­gli­chen.
  • Der Abruf von equals() er­mög­licht den in­halt­li­chen Vergleich von Objekten, um fest­zu­stel­len, ob die Objekte gleich sind, auch wenn sie sich an ver­schie­de­nen Spei­cher­or­ten befinden. Per Default verhält sich equals() genauso wie ==, da es die Re­fe­renz­ver­gleichs­lo­gik aus der Klasse Objekt erbt. Es muss jedoch meist in be­nut­zer­de­fi­nier­ten Klassen über­schrie­ben werden, um den sinn­vol­len in­halt­li­chen Vergleich zu er­mög­li­chen.

Frage 8: Wozu werden Kon­struk­to­ren genutzt?

Kon­struk­to­ren sind spezielle Methoden innerhalb einer Klasse. Sie werden dazu verwendet, Objekte zu in­stan­zi­ie­ren und zu in­itia­li­sie­ren. Vier Haupt­auf­ga­ben von Kon­struk­to­ren sind:

  • Ob­jekt­in­itia­li­sie­rung: Kon­struk­to­ren werden haupt­säch­lich dazu genutzt, ein Objekt in einen gültigen und in­itia­li­sier­ten Zustand zu versetzen, sobald es erstellt wird. Dann werden auch Attribute in­itia­li­siert und die not­wen­di­gen Res­sour­cen allokiert.
  • Pa­ra­me­ter­über­ga­be: Kon­struk­to­ren können Parameter ak­zep­tie­ren, um ver­schie­de­ne Instanzen der Klasse mit un­ter­schied­li­chen Ei­gen­schaf­ten zu erstellen. Dadurch können Objekte mit spe­zi­fi­schen At­tri­but­wer­ten erzeugt werden.
  • Code­ver­wal­tung: Die Ver­wen­dung von Kon­struk­to­ren ver­bes­sert die Les­bar­keit des Codes, da die In­itia­li­sie­rung von Objekten direkt im Kon­struk­tor durch­ge­führt werden kann. Dies ver­ein­facht auch die Wartung des Codes, da Än­de­run­gen innerhalb der In­itia­li­sie­rungs­lo­gik nur an einer Stelle vor­ge­nom­men werden müssen.
  • Vererbung: Kon­struk­to­ren spielen eine wichtige Rolle in der Ver­er­bungs­hier­ar­chie. Eine ab­ge­lei­te­te Klasse ruft nor­ma­ler­wei­se den Kon­struk­tor der Ba­sis­klas­se auf, um deren In­itia­li­sie­rung zu über­neh­men. Erst dann führt die Klasse ihre eigenen spe­zi­fi­schen In­itia­li­sie­run­gen durch.
Tipp

Rund um Java gibt es neben Fragen zu in­ter­faces, Klassen und Co. weitere Bereiche, die als Vor­be­rei­tung für ein Be­wer­bungs­ge­spräch sinnvoll sein können. Hier sind wei­ter­füh­ren­de In­for­ma­tio­nen:

Frage 9: Java nutzt eine Reihe ver­schie­de­ner String-Typen. Welche sind das und wie un­ter­schei­den sie sich von­ein­an­der?

In Java gibt es einen de­fi­nier­ten String-Typ, der durch die Klasse java.lang.String dar­ge­stellt wird. java.lang.String ist die Haupt­klas­se für die Dar­stel­lung von Zei­chen­ket­ten. Darüber hinaus gibt es un­ter­schied­li­che Mög­lich­kei­ten der String-Ma­ni­pu­la­ti­on und -Ver­ar­bei­tung:

  • String­Buil­der: Mit dieser Klasse werden in Java effizient mo­di­fi­zier­ba­re Zei­chen­ket­ten erstellt. String­Buil­der er­mög­licht eine Änderung des Inhalts, ohne eine neue Instanz zu ge­ne­rie­ren, was bei­spiels­wei­se bei String notwendig wäre, da dieser un­ver­än­der­lich ist.
  • String-Literal: Darunter versteht man Zei­chen­ket­ten, die in doppelten An­füh­rungs­zei­chen ge­schrie­ben werden, bei­spiels­wei­se "Schön, dich zu sehen!". Für iden­ti­sche String-Literale wird nur eine Instanz im String-Pool erstellt, um den Spei­cher­ver­brauch zu op­ti­mie­ren.
  • String-Objekte: Sie können als neue Instanz erstellt werden, indem das new-Schlüs­sel­wort genutzt wird, bei­spiels­wei­se als new String ("Schön, dich zu sehen!"). Die Instanz wird un­ab­hän­gig vom Inhalt angelegt.
  • String­Buf­fer: Damit werden, wie beim String­Buil­der, mo­di­fi­zier­ba­re Zei­chen­ket­ten erstellt. Der Haupt­un­ter­schied zwischen den beiden Methoden liegt darin, dass String­Buf­fer th­read­si­cher ist, was für String­Buil­der nicht gilt.

Frage 10: Was un­ter­schei­det throw von throws?

Die Schlüs­sel­wor­te throw und throws betreffen in Java beide die Re­ge­lun­gen von Ausnahmen (Ex­cep­ti­ons). In diesem Auf­ga­ben­be­reich un­ter­schie­den sie sich sowohl in ihrem Zweck als auch in ihrer Anwendung von­ein­an­der:

  • throw wird verwendet, wenn eine Ausnahme manuell ausgelöst werden soll. Ent­wick­le­rin­nen und Ent­wick­ler können dadurch eine spe­zi­fi­zier­te Ausnahme erzeugen und an das auf­ru­fen­de Programm wei­ter­ge­ben.
  • throws dagegen zeigt an, dass eine Methode eine bestimmte Ausnahme auslösen könnte. Es wird in der Me­tho­den­de­kla­ra­ti­on verwendet, um anzugeben, welche Ausnahmen von dieser Methode mög­li­cher­wei­se nicht behandelt, sondern an den auf­ru­fen­den Code wei­ter­ge­ge­ben werden. Dadurch kann der Code ent­spre­chend auf die Ausnahme reagieren.
Zum Hauptmenü