黑马程序员技术交流社区

标题: System类的一个疑问? [打印本页]

作者: 严露华    时间: 2013-4-24 22:50
标题: System类的一个疑问?
本帖最后由 严露华 于 2013-4-26 07:33 编辑

在System类中,我们会发现有一个setOut方法,它可以将System.out(查阅jdk文档可知,System.out为public static final PrintStream out)设置为不同的流。那么,为什么这个方法可以修改final变量的值呢?
作者: breeze    时间: 2013-4-25 12:44
本帖最后由 breeze 于 2013-4-25 12:46 编辑

因为out是引用,它指向的对象的地址是不可变的,但是对象本身是可变的,setOut 是将out 指向的对象重新指向新的引用将对象的内容改变了,而不是改变out 指向的地址,这个是不能变的,out 还是指向原来对象的地址,但是对象内容已经改变
作者: 续圆凯    时间: 2013-4-25 12:47
在system类中有setout方法即:
public static void setOut(PrintStream out)
{
checkIO();
setOut0(out);
}
调用了setout0()方法,而知道setout方法是重置输出流的对象的,
因此虽然看不到setout0的细节,但是因为setout调用了setout0,
可以大致猜到setout0是通过调用底层的代码实现对out的流的重定位的,
而initializeSystemClass()这个函数也调用了setout0将文件封装成文件流,
再封装成缓冲流,再封装成打印流,最后通过setout0将out与这个流绑定。

具体解释 请看18期的这个帖子的9楼。。。将这里的细节的前世今生解释的很清楚了{:soso_e113:}
http://bbs.itheima.com/thread-40977-1-1.html




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2