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

[复制链接]
查看11 | 回复2 | 2021-1-27 06:16:19 | 显示全部楼层 |阅读模式
为什么System的out被final修饰了,还能获取实例
分 -->
回复

使用道具 举报

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

使用道具 举报

千问 | 2021-1-27 06:16:19 | 显示全部楼层
publicfinalstaticPrintStreamout=null;
privatestaticnativevoidsetOut0(PrintStreamout);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行