Welcome
admin
admin

2025-10-22 11:07:25

活动情报
2180 478

如上所述的面试问题是非常不正当的(即人为的),解决它需要跳出纯Java。这当然不是您在正常情况下会考虑做的事情。

其他答案给了你一些半解决方案......如果你真的,真的必须这样做。(我说半解决方案是因为它们大多不处理应用程序的 stdout / stderr 流被重定向到控制台以外的其他地方的情况。这是这个问题的唯一“真实”方面......)

如果您可以使用 System 类(在 JDK 6 上)...打印到控制台的干净方式(例如,如果System.out已被重定向)是使用System.console()方法获取Console对象,并使用该方法获取Writer.

但是请注意,如果 JVM 没有关联的控制台,console()将返回null.

问题的真正开始是——为什么 Java 给了我们 PrintStream 对象 System.out ?为什么它是最终的?没有其他方法可以在控制台上打印任何内容吗??

答案是:

为了方便。

这样随机代码就不会意外破坏它。(或者如果您需要担心在您的 JVM 中运行不受信任的代码,则故意这样做。)但受信任的代码实际上可以通过System.out调用System.setOut(...). 这在幕后做了一些魔术来安全地更改final变量的状态。(我相信 JIT 编译器意识到了这一点,并以final不同的方式处理这 3 个变量。)

是的。见上文,以及(糟糕!)其他答案。