2

可能重复:
java:“final” System.out、System.in 和 System.err?

直接设置System.out

System.out = null; //gives error that it is final and that's understood

但是看看这个:

System.setOut(null); //allows to set out ??

out但是,如果是,那怎么可能final呢?

4

3 回答 3

2

它在非常低的水平上完成。在Java级别上,您甚至不能分配nullfinal变量。JDK 1.7 的源代码:

/**
 * Reassigns the "standard" output stream.
 *
 * <p>First, if there is a security manager, its <code>checkPermission</code>
 * method is called with a <code>RuntimePermission("setIO")</code> permission
 *  to see if it's ok to reassign the "standard" output stream.
 *
 * ...
 */
public static void setOut(PrintStream out) {
    checkIO();
    setOut0(out); //native method
}
于 2012-12-04T21:11:43.087 回答
1

在第一个实例中,静态变量 System.out 是最终的,因此您无法设置它。

在第二个实例中,您正在调用一个静态方法,它将标准输出设置为不同的流。

于 2012-12-04T21:12:34.257 回答
1

简单的答案是,使用本机 C 编写的东西,尤其是库类,不一定要遵循与你我编写纯 Java 相同的规则。

编辑:经过进一步调查,事实证明,即使您和我也可以更改final字段(前提是管理的安全性不反对)。见https://stackoverflow.com/a/3301720/367273

于 2012-12-04T21:17:15.570 回答