为什么System的out被final修饰了, 还能获取实例

解决方案 »

  1.   

    你想问的是out 被final 修饰了,并且初始化值为null,为何获取到的是正常的输出流?
    看了下System的源码,可以看到在类初始化时有一个static的初始化
    static {
            registerNatives();
        }
    这个初始化里应该对out的示例做了赋值,这是其一;正常的final示例是无法创建setter的,但是在System中有一个setOut的方法,里面也是调用了一个private static native void setOut0(PrintStream out);的方法,这是其二。由此可以看出final的语义是只针对Java语言来说的,Java底层是可以通过native的方式来违反这个语义的。
      

  2.   

    public final static PrintStream out = null;
     private static native void setOut0(PrintStream out);