Yup, the JVM interprets byte codes. The whole discussion of what compilers and interpreters do gets fuzzy from one language to the next. Java has a bit of both - the compiler generates bytecode and the JVM interprets it. Most times people think of interpreters as reading human readable source code, like Perl. My favorite interpreter (REXX) has a "tokenize" phase when it loads the code. Some implementations let you save tokenized code for faster loading next time. Is that "compiled"??? Not quite, but does it matter? Nah, not much.
A good question is never answered. It is not a bolt to be tightened into place but a seed to be planted and to bear more seed toward the hope of greening the landscape of the idea. John Ciardi