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 ??

しかし、そうである場合、それはどのように可能ですoutfinal?

4

3 に答える 3

2

非常に低いレベルで行われます。レベルでは、変数にさえ割り当てるJavaことはできません。JDK 1.7 のソース コード:nullfinal

/**
 * 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

簡単な答えは、ネイティブCを使用して記述されたもの、特にライブラリクラスは、必ずしもあなたや私が純粋なJavaを記述しているのと同じルールで実行する必要はないということです。

編集:さらに調査すると、あなたと私でさえfinalフィールドを変更できることがわかりました(管理されているセキュリティが反対しない場合)。https://stackoverflow.com/a/3301720/367273を参照してください

于 2012-12-04T21:17:15.570 に答える
1

最初のインスタンスでは、静的変数 System.out は final であるため、設定できません。

2 番目のインスタンスでは、標準出力を別のストリームに設定する静的メソッドを呼び出しています。

于 2012-12-04T21:12:34.257 に答える