Let us quickly look into compiled and interpreted languages and also where Java fits.
High level language vs. Machine Language
Humans prefer to use high level languages like Java, C, C++ etc. that form an abstraction over the platform/operating system specific code and are closer to their speaking language like English.
Compilers and interpreters are software that can convert a high level language like Java, C, C++ to a low level platform specific machine language before executing them.
Compiled vs. Interpreted Languages
In the case of compiled languages, the original source code is read over compile time, checked for syntax and converted to a platform specific binary executable. This executable is then executed again and again in its target platform. There will be a different executable for every platform combinations like Windows 64 bit, Windows 32 bit, Linux, Mac etc.
In the case of interpreted languages, source program is translated into platform specific code and executed line by line, directly at the target machine. Here, source program is directly executed on the target platform by an interpreter; so the same executable is shipped to every platform, and hence is portable. There will be only one version of the executable for every platform.
Examples of compiled languages include C++ and Fortran, and examples for interpreted languages include PHP and perl. Where does Java fit in? We will see it in some time.
Pros for compiled languages:
Speed – Since the source code is already converted into native platform specific code, the code can be executed directly without anymore translation.
Type checking – Since compilation work in phases and has access to whole code and types declared, it can do syntax checks and type checking, and this avoiding any possible runtime errors due to type mismatch. If you have a variable of type int, and if you assign it any other type and then if you use an int operation, your code might throw a runtime exception. This is avoided by type checking of the compiler.
Pros for interpreted languages
Portability – Since the source code itself or a platform independent executable is shipped to the target machine, the executable is platform independent and hence it is portable across platforms. However, note that there should be a platform specific interpreter installed in the target machine, that can convert this platform independent executable to that particular platform specific machine code and execute it.
Compiled Interpreted Languages
In Java, source code is compiled into a intermediate platform independent byte code, and this byte code (.class file) is then interpreted by Java's interpreter called Java Virtual Machine.
Python is another compiled and interpreted language. The compiler output an intermediate bytecode (Python's .pyc files), which is then executed by a bytecode interpreter (Python virtual machine).