In Java, on compilation we get a .class file for each class( including nested classes and interfaces) defined in the source file.
What is the reason for this multiple
The JVM needs to be able to find the code for a given class, given its name. If there's potentially no relationship between the source filename and the code filename, and you want the code filename to be based on the source filename, how would you expect it to load the code?
As an example: suppose I were to compile Foo.java which contains class Bar.
Another class then refers to Bar, so the JVM needs the code for it... how would you suggest it finds the file?
Note that in .NET there's a separate of unit of deployment called the assembly - and a reference to a type includes the assembly name as well, but that's slightly different from what you were proposing.