setIn并不是修改System.in,只是将输入重定向了。
输入重定向baidu一下就知道了。
简单的说,如果你将输入重定向到一个文件,你用System.in读到的就是文件的内容,而不是你在console里输入的内容。
setIn也许真的修改了System.in,但是setIn里是通过一个native方法来做的,很可能是用c实现的,
绕过了java语法的限制(但是至少你看不到这个修改它的java语句)
这个可能对你有帮助:java 1.0里,System.in的确不是final的
http://docs.rinet.ru/jdk1.0/api/java.lang.System.html#10726
你可以直接给它赋值来重定向。看起来这不符合java之道,
所以java 1.1将它改为final,同时加入了setIn方法让你仍然可以做同样的事。
http://jerry.c-lab.de/java/JDK-1.1/api/java.lang.System.html#in
补充:看来System.in还是被改了。