之前我写了一篇关于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型
你能猜出下面语句的输出吗?
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”(类型Test中方法foo(String)存在歧义)。String和StringBuffer没有继承关系。因此,它们之间没有更具体的关系。一个方法比另一个方法更具体,如果第一个方法处理的任何调用可以在没有编译时类型错误的情况下传递给另一个方法。我们可以将String作为参数传递给Object参数和String参数,但不能传递给StringBuffer参数的方法。
关于Long变量的解释
代码片段的输出将是:
31536000000
1471228928
我们通过添加“L”后缀来明确创建第一个变量为长整型。因此,编译器会将其视为长整型并将其赋给第一个变量。对于第二个语句,编译器将执行计算并将其视为32位整数。由于输出超出了整数最大值范围(2147483647),编译器将截断最高有效位,然后将其赋给变量。1000*60*60*24*365L的二进制等价物为011101010111101100010010110000000000(36位)。将其最高的4位有效位移除以适应32位整数后,新值为01010111101100010010110000000000(32位)。这等于1471228928,因此是输出结果。最近我创建了一个关于Java棘手程序的YouTube视频系列。
您可以从我们的GitHub代码库中查看更多Java示例程序。
Source:
https://www.digitalocean.com/community/tutorials/java-tricky-interview-questions