问题描述
在Java的System类中,有一个public static final修饰的InputStream对象,即public static final InputStream in = null;
这个对象被声明为final
,意味着一旦被赋值,就不能再被修改。而声明的是final
为何还有对应的setIn
方法?
System类中的final属性
System类中的setIn()方法
原因分析:
从源码可以看到
setIn
方法调用了setIn0
方法,该方法是一个本地方法,实际上是通过本地代码
来修改in
的内部状态。这就解释了为什么尽管in
被声明为final
,但仍然可以通过setIn
方法修改其内部状态。
虽然in被声明为final,但是你可能会注意到System类中还有一个setIn方法,该方法允许修改in的值。这可能看起来有点矛盾,但是这里需要注意的是,final关键字修饰的是引用变量,而不是引用的对象。 在Java中,final关键字可以确保引用变量只能被赋值一次,即引用的对象不可变。但是,如果对象本身是可变的,那么对象内部的状态仍然可以被修改
。在System类中,in是final的,这意味着不能再将一个新的InputStream对象赋值给in,但是setIn方法实际上是修改了in对象的内部状态
,而不是替换整个对象
。