The immediate reason is that the System
streams predate the JavaBeans model with its get/set/is
nomenclature, which was added in 1.1; the System
streams go all the way back to 1.0, before even inner classes, so backwards compatibility demands continuity.
A related reason is that calls to getters can't be as efficiently inlined as direct field references, even if the methods are final
, and since printing output is so common, it's likely that even today, those fields would be used directly.