最近在我参加的一次采访中询问了这个问题。
public class MagicOutput {
public static void main(final String argv[]) {
System.out.println("Hello, World!");
}
}
我被要求保留方法主要签名(名称,参数的数量和类型,返回类型)和实现(方法体),
并使该程序输出到标准控制台消息"Magic Output !"
我花了大约2分钟回答。我的解决方案是在那里放置一个静态块并输出所需的字符串。
static{
System.out.println("Magic Output !");
}
这确实有效,但它会同时打印Magic Output !
和Hello, World!
如何让它只输出魔法字符串?
答案 0 :(得分:9)
static{
System.out.println("Magic Output !");
System.exit(0);
}
或funnier(取决于String实现 - 与openjdk 8一起使用):
static {
System.out.println("Magic Output!");
try {
Field f = String.class.getDeclaredField("value");
f.setAccessible(true);
f.set("Hello, World!", new char[0]);
f.set(System.lineSeparator(), new char[0]);
} catch (Exception ignore) { }
}
答案 1 :(得分:1)
您也可以使用静态嵌套类来实现这一目标。
public class MagicOutput {
public static void main(final String argv[]) {
System.out.println("Hello, World!");
}
static class System {
static Out out = new Out();
}
static class Out {
void println(String s){
java.lang.System.out.println("Magic Output !");
}
}
}
答案 2 :(得分:0)
使用静态块上的System.setOut()将System.out重定向到PrintStream的实例。