Well, JIT heuristics end up being designed to live with the typical code patterns of the programming language.
In Java's case, since methods are virtual by default so with open classes a large majority of the code has a possible indirection, hence such optimizations.
You're talking about the programming model, where I'm talking about the implementation.