ウェブサイト検索

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サンプルプログラムをチェックアウトできます。

関連記事: