Vor einiger Zeit habe ich einen Artikel über Top 50 Java-Programmierfragen geschrieben. Unsere Leser mochten ihn sehr. Heute werden wir uns einige knifflige Interviewfragen in Java ansehen.
Java Knifflige Interviewfragen
Dies sind Programmierfragen, aber es wird schwer sein, die Ausgabe zu erraten und zu erklären, es sei denn, Sie haben ein tiefes Verständnis von Java.
1. Null als Argument
Wir haben überladene Funktionen und übergeben null. Welche Funktion wird aufgerufen und was wird die Ausgabe des Programms sein?
public class Test {
public static void main(String[] args) {
foo(null);
}
public static void foo(Object o) {
System.out.println("Object argument");
}
public static void foo(String s) {
System.out.println("String argument");
}
}
2. Verwenden Sie „L“ für long
Können Sie die Ausgabe der folgenden Anweisungen erraten?
long longWithL = 1000*60*60*24*365L;
long longWithoutL = 1000*60*60*24*365;
System.out.println(longWithL);
System.out.println(longWithoutL);
Erklärung der kniffligen Frage zum Nullargument
Gemäß den Java-Spezifikationen wählt der Compiler im Falle einer Überladung die spezifischste Funktion aus. Offensichtlich ist die String-Klasse spezifischer als die Object-Klasse, daher wird „String-Argument“ ausgegeben. Aber was ist, wenn wir eine weitere Methode in der Klasse haben, wie unten gezeigt.
public static void foo(StringBuffer i){
System.out.println("StringBuffer impl");
}
In diesem Fall wirft der Java-Compiler einen Fehler aus mit der Meldung „Die Methode foo(String) ist für den Typ Test mehrdeutig“. String und StringBuffer haben keine Vererbungshierarchie. Daher ist keiner von ihnen spezifischer als der andere. Eine Methode ist spezifischer als eine andere, wenn jede von der ersten Methode behandelte Aufruf ohne einen Kompilierungszeitfehler an die andere weitergegeben werden könnte. Wir können String als Parameter an Methoden mit Object-Argument und String-Argument übergeben, jedoch nicht an Methoden mit StringBuffer-Argument.
Erklärung für Long-Variablen
Der Ausgabewert des Code-Schnipsels wird sein:
31536000000
1471228928
Wir erstellen explizit die erste Variable als „long“, indem wir einen „L“-Suffix hinzufügen. So behandelt der Compiler sie als „long“ und weist sie der ersten Variable zu. Für die zweite Anweisung führt der Compiler die Berechnung durch und behandelt sie als 32-Bit-Ganzzahl. Da die Ausgabe außerhalb des Bereichs des maximalen Ganzzahlwerts (2147483647) liegt, wird der Compiler die wichtigsten Bits abschneiden und sie dann der Variable zuweisen. Die binäre Darstellung von 1000*60*60*24*365L = 011101010111101100010010110000000000 (36 Bits). Nach Entfernen der 4 wichtigsten Bits, um sie in eine 32-Bit-Ganzzahl aufzunehmen, ergibt sich der neue Wert = 01010111101100010010110000000000 (32 Bits). Dies entspricht 1471228928 und daher die Ausgabe. Vor kurzem habe ich eine YouTube-Videoserie für knifflige Java-Programme erstellt.
Sie können weitere Java-Beispielprogramme aus unserem GitHub-Repository überprüfen.
Source:
https://www.digitalocean.com/community/tutorials/java-tricky-interview-questions