Javaの難しい面接質問
少し前に、私はトップ50のJavaプログラミングの質問に関する記事を書きました。私たちの読者はそれをとても気に入っていました。ですので、今日はJavaのいくつかの難しい面接質問を見ていきましょう。
Javaの難しい面接質問
これらはプログラミングの質問ですが、Javaを深く理解していない限り、出力を推測したり説明したりするのは難しいでしょう。
1. 引数としてのヌル
私たちは関数をオーバーロードしており、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. 「L」を長さ用に使用する
以下の文の出力を推測できますか?
long longWithL = 1000*60*60*24*365L;
long longWithoutL = 1000*60*60*24*365;
System.out.println(longWithL);
System.out.println(longWithoutL);
ヌル引数のトリッキーな質問の説明
Javaの仕様によれば、オーバーロードの場合、コンパイラは最も特定的な関数を選択します。明らかにStringクラスはObjectクラスよりも特定的なので、「String引数」と表示されます。しかし、クラスに次のような別のメソッドがある場合はどうでしょうか。
public static void foo(StringBuffer i){
System.out.println("StringBuffer impl");
}
この場合、Javaコンパイラは「メソッドfoo(String)は型Testに対して曖昧です」というエラーをスローします。StringとStringBufferは継承の階層を持っていないため、どちらも互いに特定のものとは言えません。あるメソッドが別のメソッドよりも特定的であるためには、最初のメソッドによって処理されるすべての呼び出しが、他のメソッドにコンパイル時の型エラーなしに渡すことができる必要があります。Object引数とString引数にはStringをパラメータとして渡すことができますが、StringBuffer引数メソッドには渡すことができません。
長い変数の説明
コードスニペットの出力は次のとおりです:
31536000000
1471228928
私たちは、最初の変数を「L」サフィックスを追加することで明示的にlongとして作成しています。これにより、コンパイラはそれをlongとして扱い、最初の変数に割り当てます。2つ目の文では、コンパイラが計算を行い、それを32ビット整数として扱います。出力が整数の最大値(2147483647)の範囲外であるため、コンパイラは最上位ビットを切り捨て、その後変数に割り当てます。1000*60*60*24*365Lの2進数表現は011101010111101100010010110000000000(36ビット)です。32ビット整数に収めるために4つの最上位ビットを削除すると、新しい値は01010111101100010010110000000000(32ビット)になります。これは1471228928に等しいので、出力されます。最近、JavaのトリッキーなプログラムについてのYouTube動画シリーズを作成しました。
私たちのGitHubリポジトリから、さらに多くのJavaサンプルプログラムをチェックアウトできます。
