To understand the differences better, you should know the promise of Java that made it so popular when it's launched.
- WORA - Write Once Run Anywhere
- Platform Independence (not entirely but mostly)
If you write a C program, you need to compile the .c file into a .exe file on windows which will not work on *NIX like environments. So here your resulting binary (in this case .exe) is dependent on your platform. If you want run the same C program on Linux, you've to compile the .c file again on that platform. But to make the Java binaries (.jar files usually) portable across multiple platforms, they came up with a uniform environment called JRE which will take care of executing your binaries in all platforms. If you ever downloaded Java from Oracle's site, you will find different files(exe,rpm,tar.gz for different platforms like Windows, Linux, Solaris,Mac etc)
Any .java compiled always gives a .class file which is the one understood by your JVM. The resulting class file is always same whether you compile it in on Windows or a Mac.
JRE is what you need to run your java programs. The one which will make sure that your programs written and compiled on Windows are executed on Linux servers. It doesn't need your fancy source code written in English to execute your program. That's why most of the new OS installations will have only JRE installed but not JDK because that's all you need.
JDK is for the developers who develop their applications/programs in java and then distribute for others to use.But the people who usually develop also run these programs in their local machines to test/debug their code. To facilitate that, JRE is included in the JDK distribution. JVM is the actual weight lifting guy, part of JRE which will translate your program instructions in to machine specific assembly code and execute on your CPU to get the job done.
Hope this answers your questions :)