网红面试题

这是一道很巧妙的题目,上来的附加题就暗示了此题不简单。对于 Java 不熟悉或者编程不严谨的人很可能会给出如下的答案。

1
2
3
4
private static void method(int a, int b) {
a *= 10;
b *= 20;
}

但实际上,就算写「不会」也要比写上面的答案强很多。因为此函数的形参传递方法为值传递,函数内部变量值的更改是不会影响原值的,写出以上的结果只能说明编程水平太差。

那么应该怎么作答呢?一种较为简单的方法是在 method 方法中直接输出结果,然后中止程序。代码如下:

1
2
3
4
private static void method(int a, int b) {
System.out.println("a=100\nb=200");
System.exit(0);
}

这个答案虽然简洁,但是这真的是面试官想要考查的吗?这道题实际上想要考查的应该是方法的重写。看看这一份代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static void method(int a, int b) {
PrintStream ps = new PrintStream(System.out) {
@Override
public void println(String x) {
if("a=10".equals(x)) {
x = "a=100";
} else {
x = "b=200";
}
super.println(x);
}
};
System.setOut(ps);
}

有没有觉得一下就高大上了起来?