Just a wild guess.. The JVM takes all the .class files it finds in the directories specified by the classpath and stores them using the package and class name in a list. When you specify the class to execute, the JVM does not associate that class name with a specific file, but with the real class stored in memory?
Just thinking here.. No facts! Just what I would handle it as a JVM programmer ;-)
That's the way Java was designed. Might be because the people who designed it came from the Unix tradition of calling executable code by their names without an extension.
Apart from that, don't know. I have always looked on it as "one of those things."