Java之棘手面试问题
前段时间,我写了一篇关于Java编程的前50个问题的文章。我们的读者很喜欢。所以今天我们来看一些关于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编译器会抛出一个错误,显示“方法foo(String)对于类型Test是模棱两可的”。String和StringBuffer没有继承关系,所以它们中没有一个比另一个更具体。如果第一个方法的任何调用可以在不产生编译时类型错误的情况下传递给另一个方法,那么这个方法比另一个方法更具体。我们可以将String作为参数传递给Object类型的参数和String类型的参数,但不能传递给StringBuffer类型的参数方法。
长变量的解释
代码片段的输出将是:
31536000000
1471228928
通过在第一个变量后添加“L”后缀,我们明确地将其定义为长整型。因此,编译器会将其视为长整型并将其赋给第一个变量。对于第二个语句,编译器会执行计算并将其视为32位整数。由于输出值超出整数最大值范围(2147483647),编译器将截取最高位并将其赋给变量。二进制 equivalent of 1000*60*60*24*365L = 011101010111101100010010110000000000 (36 位)。在去掉4个最高位以适应32位整数后,新值为 01010111101100010010110000000000 (32 位)。这等于1471228928,即为输出。最近,我制作了一系列Java难题程序的YouTube视频。
你可以从我们的GitHub仓库中查看更多的Java示例程序。