
Erklären Sie den Ausdruck
public static void main(String args[])
.Dies ist eine der gängigsten Java-Interviewfragen zur Gesprächseröffnung, und eine sehr einfache.
public
ist ein Zugriffsmodifikator. Wir nutzen ihn, um den Zugriff auf diese Methode zu spezifizieren. Hier ist der Modifikator „public“, also kann jede Klasse auf diese Methode zugreifen.static
. Dieses Java-Schlüsselwort bedeutet, dass wir diese Methode verwenden, ohne ein Objekt der Klasse zu erstellen.Void
ist der Rückgabetyp der Methode. Das bedeutet, dass die Methode keinen Wert zurückgibt.main
ist der Name der Methode. Die JVM betrachtet diesen Namen als Einstiegspunkt in die Anwendung (er muss eine bestimmte Signatur haben).Main
ist die Methode, in der die eigentliche Ausführung stattfindet.String args[]
. Das ist der Parameter, der an die main-Methode übergeben wird. Hier haben wir Argumente vom Typ String, die unsere Java-Anwendung entgegennimmt, wenn wir sie ausführen. Du kannst sie in der Konsole eingeben.
Was ist der Unterschied zwischen
equals()
und==
?Zunächst einmal ist
==
ein Operator undequals()
eine Methode. Den Operator==
verwenden wir für einen Referenzvergleich (oder Adressvergleich), während wir die Methodeequals()
für einen Inhaltsvergleich nutzen. Das heißt, dass==
überprüft, ob beide Objekte auf den gleichen Speicherplatz verweisen, währendequals()
die Werte der Objekte vergleicht.Können wir ein Programm ohne die
main()
-Methode ausführen?Viele grundlegende Java-Interviewfragen sind wirklich einfach. Wie diese. Die kurze Antwort ist: Ja, das können wir. Zum Beispiel können wir das mit einem statischen Block realisieren.
Du kannst einen statischen Block verwenden, um ein statisches Daten-Member zu initialisieren. Es wird vor der
main
Methode ausgeführt, wenn die Klassen geladen werden.class Example{ Static{ System.out.println("static block is invoked"); } public static void main(String args[]){ System.out.println("Now main method"); } }
Die Ausgabe ist:
static block is invoked Now main method
Was passiert, wenn die main-Methode völlig fehlt? Wenn du versuchst, eine gewöhnliche Klasse ohne eine main-Methode zu starten, erhältst du den folgenden Fehler: Main method not found in class Test, please define the main method as: public static void main (String [] args) or a JavaFX application class must extend javafx.application.Application. Der Fehler selbst sagt, dass es möglich ist, wenn es sich um eine JavaFX-Anwendung handelt und die Klasse von javafx.application.Application erbt.
Was ist ein
immutable
Objekt? Können Sieimmutable
Objekt erstellen?Du kannst Objekte einer
immutable
Klasse nach ihrer Erstellung nicht mehr verändern. Mit anderen Worten, wenn du sie einmal erstellt hast, kannst du sie nicht mehr ändern. Wenn du versuchst, einImmutable
Objekt zu verändern, erhältst du ein neues Objekt (Klon) und veränderst diesen Klon während der Erstellung.Ein gutes Beispiel ist
String
. Es ist in Javaimmutable
. Das bedeutet, dass du ein String-Objekt selbst nicht verändern kannst, aber du kannst die Referenz auf ein Objekt ändern.Wie viele Objekte werden im folgenden Code erstellt?
Das ist eine technische Java-Interviewfrage, welche Frage 4 oben ersetzen könnte.
String s1="Hello"; String s2="Hello"; String s3="Hello";
Die Antwort ist „nur eins“, weil Java einen String-Pool besitzt. Wenn wir ein String-Objekt mit dem new()-Befehl erzeugen, erzeugt Java ein neues Objekt im Heap-Speicher. Wenn wir ein String-Literal verwenden, wie in unserem Beispiel oben, kann Java ein Objekt aus dem String-Pool zurückgeben, wenn bereits eines existiert.
Wie viele Objekte werden im folgenden Code erstellt?
String s = new String("Hello");
Hier werden 2 Objekte erstellt. Eins befindet sich im Pool der String-Konstanten und das andere im Heap.
Was ist der Unterschied zwischen den Klassen
String
,StringBuilder
undStringBuffer
in Java?Das ist eine der wichtigsten Java-Interviewfragen.
Zunächst einmal ist
String
eine unveränderliche Klasse. Das bedeutet, dass du den einmal erstellten Inhalt nicht mehr ändern kannst.StringBuffer
undStringBuilder
sind dagegen veränderbare Klassen, die du später verändern kannst. Wenn wir versuchen, den Inhalt einesString
-Objekts zu ändern, erstellt die JVM einen neuen String, während der ursprüngliche String nicht verändert wird. Aus diesem Grund ist die Leistung bei Verwendung vonStringBuffer
besser als beiString
.Der Hauptunterschied zwischen
StringBuffer
undStringBuilder
besteht darin, dass die Methoden vonStringBuffer
synchronisiert sind, während die vonStringBuilder
nicht synchronisiert sind.Gibt es einen Unterschied zwischen einem
String
, der als Literal erstellt wurde, und einem line, der mit demnew()
-Befehl erstellt wurde?Ja, den gibt es. Wenn wir einen String mit dem
new()
-Befehl erstellen, erscheint er im Heap und wird nicht zum String-Pool hinzugefügt. Wenn wir einenString
als Literal erstellen, wird er im string-Pool erstellt, der im PermGen-Bereich des Heaps liegt.Kann man eine
private
- oderstatic
-Methode in Java überschreiben?Das ist für Einsteiger eine knifflige Java-Interviewfrage. Du kannst eine
private
- oderstatic
-Methode in Java tatsächlich nicht überschreiben.Du kannst
private
-Methoden nicht überschreiben, da der Geltungsbereich der private-Zugriffsspezifikation auf den Bereich innerhalb der Klasse beschränkt ist. Um etwas zu überschreiben, brauchen wir eine Eltern- und Kindklasse. Wenn die Methode einer Oberklasseprivate
ist, kann eine Unterklasse sie nicht verwenden, und die Methoden in der Unterklasse werden als neue Methoden behandelt (nicht überschrieben).Static
-Methoden können ebenfalls nicht überschrieben werden, dastatic
-Methoden eil der Klasse selbst sind. Sie sind nicht Teil eines Objekts der Klasse. Klar, du kannst dieselbestatic
-Methode mit derselben Signatur in Unterklassen deklarieren, aber auch hier werden diese als neue Methoden behandelt.Was ist der Unterschied zwischen einer
Abstract Class
und einemInterface
Das ist eine beliebte Interviewfrage für Java-Entwickler, bei denen OOP-Prinzipien eine Rolle spielen. Zunächst einmal definiert in Java ein
interface
ein Verhalten, während eineabstract class
eine Hierarchie erstellt.Abstrakte Klasse Interface Es ist möglich, einen Methodenrumpf (nicht-abstrakte Methoden) in einer abstrakten Klasse zu haben. Ein Interface kann nur abstrakte Methoden besitzen. In Java 8 und neueren Versionen ist es möglich, Standardmethoden zu definieren und diese direkt in einem Interface zu implementieren. Außerdem können Interfaces seit Java 8 statische Methoden besitzen. Eine abstrakte Klasse kann Instanzvariablen haben. Ein Interface kann keine Instanzvariablen haben. Konstruktoren sind erlaubt. Ein Interface kann keinen Konstruktor haben. Statische Methoden sind erlaubt. Statische Methoden sind nicht erlaubt. Eine Klasse kann nur eine abstrakte Oberklasse haben. Ein Interface kann von mehreren Klassen implementiert werden. Eine abstrakte Klasse kann die Implementierung des Interfaces bereitstellen. Ein Interface kann nicht die Implementierung einer abstrakten Klasse bereitstellen. Eine abstrakte Klasse kann eine andere Java-Klasse erweitern und mehrere Java-Interfaces implementieren. Ein Interface darf nur ein anderes Java-Interface erweitern. Eine abstrakte Java-Klasse kann private- und protected-Member besitzen. Member eines Java-Interfaces sind standardmäßig public. Können wir
static
Variablen und Methoden in einerabstract
Klasse deklarieren?Ja, es ist möglich,
static
Variablen und Methoden in einerabstract
Klasse zu deklarieren. Für den Zugriff auf den statischen Kontext ist es nicht erforderlich, ein Objekt zu erstellen. Beispielsweise ist es uns erlaubt, auf den innerhalb einerabstract
Klasse deklarierten statischen Kontext zuzugreifen, indem wir den Namen derabstract
Klasse verwenden.Welche Arten von Speicherbereichen werden von der JVM zugewiesen?
Der Klassenbereich speichert Strukturen pro Klasse, z. B. einen Pool von Laufzeitkonstanten, Felder, Methodendaten und den gesamten Code für Methoden.
Der Heap ist ein Laufzeitdatenbereich, in dem den Objekten Speicher zugewiesen wird.
Der Stack speichert Frames. Er enthält lokale Variablen und Zwischenergebnisse und ist an Methodenaufrufen und -rückgaben beteiligt. Jeder Thread hat einen privaten JVM-Stack, der zur gleichen Zeit wie der Thread erstellt wird. Jedes Mal, wenn eine Methode aufgerufen wird, wird ein neuer Frame erstellt. Ein Frame wird zerstört, wenn sein Methodenaufruf abgeschlossen ist.
Das Programmzählerregister enthält die Adresse des Befehls der virtuellen Java-Maschine, der gerade ausgeführt wird.
Der Native Method Stack enthält alle nativen Methoden, die in der Anwendung verwendet werden.
Warum ist Mehrfachvererbung in Java nicht erlaubt?
Sie wäre wirklich kompliziert. Stell dir einmal drei Klassen
A
,B
undC
vor, wobeiC
vonA
undB
erbt. Nun nehmen wir an, die KlassenA
undB
haben dieselbe Methode und du rufst sie von einem Objekt der Unterklasse aus auf... Welche wird dann aufgerufen? Die vonA
oder die vonB
? Das ist nicht klar definiert.Wenn du versuchst, zwei Klassen zu vererben, generiert Java einen Kompilierzeitfehler.
Können wir die
main()
-Methode überladen?Sicher, wir können viele
main
-Methoden in einem Java-Programm haben, indem wir die Methodenüberladung verwenden. Probiere es aus!Können wir einen Konstruktor als
final
deklarieren?Nein. Ein Konstruktor kann nicht als
final
deklariert werden, weil er nicht vererbt werden kann. Es macht also keinen Sinn, Konstruktoren alsfinal
zu deklarieren. Wenn du es trotzdem versuchst, erhältst du einen Kompilierfehler von Java.Können wir ein Interface als
final
deklarieren?Nein, das können wir nicht. Ein Interface kann nicht
final
sein, da ein Interface von irgendeiner Klasse entsprechend seiner Definition implementiert werden muss. Daher macht es keinen Sinn, ein Interfacefinal
zu machen. Wenn du es trotzdem versuchst, wird der Compiler einen Fehler ausgeben.Was ist der Unterschied zwischen
static binding
unddynamic binding
?binding
, das zur Kompilierungszeit vom Compiler aufgelöst werden kann, wird alsstatic
oder frühes Binding bezeichnet. DasBinding
allerstatic
-,private
- undfinal
-Methoden erfolgt zur Kompilierzeit.Beim
Dynamic binding
kann der Compiler nicht bestimmen, welche Methode aufgerufen werden soll. Das Methodenüberschreiben ist ein perfektes Beispiel fürdynamic binding
. Bei der Methodenüberschreibung haben sowohl Eltern- als auch Kindklassen dieselbe Methode.Static Binding class Cat{ private void talk() {System.out.println("cat is mewing..."); } public static void main(String args[]){ Cat cat=new Cat(); cat.talk(); } } Dynamic Binding class Animal{ void talk(){ System.out.println("animal is talking..."); } } class Cat extends Animal{ void talk(){ System.out.println("cat is talking..."); } public static void main(String args[]){ Animal animal=new Cat(); animal.talk(); } }
Wie erstellt man eine schreibgeschützte Klasse in Java?
Dazu kann man alle Felder der Klasse private machen. Eine schreibgeschützte Klasse hat nur Getter-Methoden, welche die private-Eigenschaften der Klasse an die
main
-Methode zurückgeben. Sie können diese Eigenschaften nicht ändern, da es keine Setter gibt.public class HockeyPlayer{ private String team ="Maple leaf"; public String getTeam(){ return team; } }
Wie erstellt man eine lesegeschützte Klasse in Java?
Auch hier muss man alle Felder der Klasse
private
machen. Diesmal darf deine lesegeschützte Klasse nur Setter-Methoden und keine Getter haben. Wir können also die Eigenschaften der Klasse nicht lesen.public class HockeyPlayer{ private String team; public void setTeam(String college){ this.team = team; } }
Auf jeden
try
-Block muss eincatch
-Block folgen, richtig?Nein. Das ist keine Notwendigkeit. Ein
try
-Block muss nicht unbedingt einencatch
-Block haben. Auf den try-Block kann ein catch-Block oder ein finally-Block folgen, oder keins von beidem.public class Main{ public static void main(String []args){ try{ int variable = 1; System.out.println(variable/0); } finally { System.out.println("the other part of the program..."); } } }
Ausgabe:
Exception in thread main java.lang.ArithmeticException:/ by zero the other part of the program...
Ein weiteres Beispiel:class Main { public static void main(String[] args) throws IOException { try(InputStreamReader inputStreamReader = new InputStreamReader(System.in); BufferedReader reader = new BufferedReader(inputStreamReader)){ System.out.println("test"); } } }
Ausgabe:
test
P. S. Vor Java 8 konnten Methoden in Interfaces nur abstrakt sein. Ab Java 8 wurde es möglich, Standardmethoden zu definieren und diese direkt in einem Interface zu implementierenWas ist der Unterschied zwischen den Schlüsselwörtern
throw
undthrows
?Throws
wird zur Deklaration einer Ausnahme verwendet, funktioniert also ähnlich wie eintry-catch
-Block. Das SchlüsselwortThrow
wird verwendet, um eine Ausnahme explizit aus einer Methode oder einem anderen Codeblock heraus auszulösen.Auf
Throw
folgt eine Instanz der KlasseException
, aber auf throws folgen die Namen von Ausnahmeklassen.Throw
wird in einem Methodenrumpf zum Auslösen einer Ausnahme verwendet.Throws
wird in einer Methodensignatur verwendet, um die Ausnahmen zu deklarieren, die in den in der Methode vorhandenen Ausdrücken auftreten können.Du kannst jeweils eine Ausnahme auslösen (throw), aber du kannst mehrere Ausnahmen behandeln, indem du sie mit dem Schlüsselwort
throw
deklarierst. Du kannst mehrere Ausnahmen deklarieren, z. B.public void method()throws IOException
,SQLException
.
Dieser Beitrag ist auf Englisch verfügbar. |
---|
Read the English version of this article to practice responding to Java interview questions in English. Understanding these concepts in English can only help your employment prospects! |
GO TO FULL VERSION