Javaの難しい面接質問
以前、私は「Top 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 argument」と表示されます。しかし、以下のようなクラスに別のメソッドがある場合はどうなるでしょうか。
public static void foo(StringBuffer i){
System.out.println("StringBuffer impl");
}
この場合、Javaコンパイラは「The method foo(String) is ambiguous for the type Test」というエラーを出力します。StringとStringBufferには継承の階層が存在しないため、どちらも他方よりも具体的ではありません。メソッドAがメソッドBよりも具体的であるとは、コンパイル時にタイプエラーが発生せずに、メソッドAで処理できる呼び出しがメソッドBにも渡される場合を指します。StringはObject引数とString引数のメソッドには渡すことができますが、StringBuffer引数のメソッドには渡すことができません。
長い変数の説明
コードスニペットの出力は次のとおりです。
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のサンプルプログラムをチェックアウトできます。