Java bytecode is exactly the same, but what you need to run on Windows is different from Linux and that is different from Mac. So the different JVMs take the same bytecode and run it for their machines.