Java 陷阱面試問題

前段时间我写了一篇关于Java编程50个热门问题的文章。我们的读者很喜欢它。所以今天我们将深入研究一些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. 用“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”。但是,如果類別中有以下類似的另一個方法。

public static void foo(StringBuffer i){
	System.out.println("StringBuffer impl");
}

在這種情況下,Java編譯器將拋出錯誤,顯示“The method foo(String) is ambiguous for the type Test”(方法foo(String)對於Test類型是不明確的)。String和StringBuffer之間沒有繼承層次結構。因此,它們之間沒有更具體的關係。如果第一個方法處理的任何調用可以在不發生編譯時類型錯誤的情況下傳遞給另一個方法,那麼一個方法比另一個方法更具體。我們可以將String作為參數傳遞給Object參數和String參數,但不能傳遞給StringBuffer參數的方法。

Long變量的解釋

代碼片段的輸出將是:

31536000000
1471228928

我們明確地通過添加“L”後綴來創建第一個變量,使得編譯器將其視為長整型並將其分配給第一個變量。對於第二個語句,編譯器將執行計算並將其視為32位整數。由於輸出超出了整數的最大值範圍(2147483647),編譯器將截斷最高有效位,然後將其分配給變量。1000*60*60*24*365L的二進制等效值為011101010111101100010010110000000000(36位)。刪除最高的4個有效位以適應32位int後,新值為01010111101100010010110000000000(32位)。這等於1471228928,因此是輸出。最近我創建了一個關於 Java 陷阱程序的 YouTube 視頻系列。

您可以從我們的GitHub 存儲庫中查看更多的 Java 示例程序。

Source:
https://www.digitalocean.com/community/tutorials/java-tricky-interview-questions