不久前我写过一篇文章前 50 个 Java 编程问题。我们的读者非常喜欢它。所以今天我们将研究一些 Java 面试中棘手的问题。
这些都是编程问题,但除非您对 Java 有深入的了解,否则很难猜测输出并解释它。
我们有重载函数并且传递 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");
}
}
你能猜出下面语句的输出吗?
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 编译器将抛出错误“The method foo(String) is ambigacy for the type Test”。 String 和 StringBuffer 没有继承层次结构。因此,它们中没有一个比其他的更具体。如果第一个方法处理的任何调用可以传递给另一个方法而不会出现编译时类型错误,则该方法比另一个方法更具体。我们可以将 String 作为参数传递给 Object 参数和 String 参数,但不能传递给 StringBuffer 参数方法。
代码片段的输出将是:
31536000000
1471228928
我们通过添加“L”后缀来显式创建第一个变量。因此编译器会将其视为 long 并将其分配给第一个变量。对于第二条语句,编译器将执行计算并将其视为 32 位整数。由于输出超出整数最大值 (2147483647) 的范围,编译器将截断最高有效位,然后将其分配给变量。 1000*60*60*24*365L 的二进制等效值 = 011101010111101100010010110000000000(36 位)。删除 4 个最高有效位以容纳 32 位 int 后,新值 = 01010111101100010010110000000000(32 位)。这等于 1471228928,因此等于输出。最近我为 java 棘手的程序创建了一个 YouTube 视频系列。
您可以从我们的网站查看更多 Java 示例程序GitHub 存储库.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)