以前、私は「Top 50 Javaプログラミングの質問」という記事を書きました。私たちの読者はそれをとても気に入ってくれました。今日はJavaのいくつかのトリッキーな面接質問を見てみましょう。
Javaのトリッキーな面接質問
これらはプログラミングの質問ですが、Javaの深い理解がないと出力を推測して説明するのは難しいでしょう。
1. 引数としてのNull
オーバーロードされた関数があり、私たちはnullを渡しています。どの関数が呼び出され、プログラムの出力は何になるでしょうか?
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. longには「L」を使用する
以下の文の出力を推測できますか?
long longWithL = 1000*60*60*24*365L;
long longWithoutL = 1000*60*60*24*365;
System.out.println(longWithL);
System.out.println(longWithoutL);
Null引数トリッキー問題の説明
Javaの仕様によると、オーバーロードの場合、コンパイラは最も具体的な関数を選択します。明らかに、StringクラスはObjectクラスよりも具体的ですので、「String argument」と表示されます。しかし、以下のようにクラス内にもう1つのメソッドがある場合はどうなるでしょうか。
public static void foo(StringBuffer i){
System.out.println("StringBuffer impl");
}
この場合、Javaコンパイラは「Testのためにメソッドfoo(String)は曖昧です」というエラーをスローします。StringとStringBufferには継承階層がありません。したがって、どちらも他方よりも具体的ではありません。メソッドAがメソッドBによって処理される呼び出しをコンパイル時の型エラーなしに他方に渡すことができる場合、メソッドAの方がメソッドBよりも具体的です。StringはObject引数およびString引数にパラメーターとして渡すことができますが、StringBuffer引数のメソッドには渡すことができません。
Long変数の説明
コードスニペットの出力は次のようになります:
31536000000
1471228928
最初の変数は明示的に “L” 接尾辞を追加してlongとして作成されます。したがって、コンパイラはそれをlongとして扱い、最初の変数に割り当てます。2番目の文では、コンパイラは計算を実行し、32ビットの整数として扱います。出力が整数の最大値(2147483647)の範囲外であるため、コンパイラは最も重要なビットを切り捨ててから変数に割り当てます。1000*60*60*24*365L の2進数表現は 011101010111101100010010110000000000(36ビット)です。32ビットintに収めるために最も重要な4ビットを削除した後の新しい値は、01010111101100010010110000000000(32ビット)です。これは1471228928と等しいため、出力されます。最近、JavaのトリッキーなプログラムのためのYouTubeビデオシリーズを作成しました。
さらに、私たちのGitHubリポジトリからもJavaの例題プログラムをチェックアウトできます。
Source:
https://www.digitalocean.com/community/tutorials/java-tricky-interview-questions