A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 严露华 中级黑马   /  2013-4-24 22:50  /  980 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 严露华 于 2013-4-26 07:33 编辑

在System类中,我们会发现有一个setOut方法,它可以将System.out(查阅jdk文档可知,System.out为public static final PrintStream out)设置为不同的流。那么,为什么这个方法可以修改final变量的值呢?

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

2 个回复

倒序浏览
breeze 来自手机 中级黑马 2013-4-25 12:44:57
沙发
本帖最后由 breeze 于 2013-4-25 12:46 编辑

因为out是引用,它指向的对象的地址是不可变的,但是对象本身是可变的,setOut 是将out 指向的对象重新指向新的引用将对象的内容改变了,而不是改变out 指向的地址,这个是不能变的,out 还是指向原来对象的地址,但是对象内容已经改变

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
在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

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马