有一次,我写了一篇关于Java编程的50大问题( / 社区 / 教程 / Java编程 - 面试 - 问题)的文章,我们的读者非常喜欢它。
Java Tricky 面试问题
这些是编程问题,但除非你对Java有深刻的了解,否则很难猜出输出并解释它。
1、无作为论点
我们有过载的函数,我们正在通过null. 将被称为哪个函数,程序的输出将是什么?
1public class Test {
2 public static void main(String[] args) {
3 foo(null);
4 }
5 public static void foo(Object o) {
6 System.out.println("Object argument");
7 }
8 public static void foo(String s) {
9 System.out.println("String argument");
10 }
11}
2、使用L
太久
你能猜出下面的结论吗?
1long longWithL = 1000*60*60*24*365L;
2long longWithoutL = 1000*60*60*24*365;
3System.out.println(longWithL);
4System.out.println(longWithoutL);
解答 Null Argument Tricky 问题
根据Java规格,在过载的情况下,编译器会选择 最具体的函数. 显然 String 类比 Object 类更具具体性,因此它会打印String 参数
。
1public static void foo(StringBuffer i){
2 System.out.println("StringBuffer impl");
3}
在这种情况下,Java 编译器会发出一个错误,如方法 foo(String)对于测试类型是模糊的
。 String 和 StringBuffer 没有继承层次结构,所以它们中的任何一种都不是更为具体的。 一个方法比另一个更为具体,如果第一个方法处理的任何召唤可以传递给另一个方法而没有编译时间类型错误。 我们可以将 String 作为参数传递给 Object 参数和 String 参数,但不能传递到 StringBuffer 参数方法。
长变量的解释
代码片段的输出将是:
131536000000
21471228928
因此,编译器将尽可能长时间对待它,并分配给第一个变量。对于第二个陈述,编译器将执行计算,并将其作为32位整数处理。由于输出不在整数最大值的范围内(2147483647),编译器将切断最重要的位数,然后分配给变量。 二进制等价1000606024365L = 01110101011110110001001011000000(36位)。 在删除4个最重要的位数以容纳32位的Int之后,新值 = 0101011110110001001011000000(32位)。 这等于141228928(32位)。
您可以从我们的 GitHub 存储库中检查更多 Java 示例程序。