A DeCompiler tries to transform a program available in MachineCode to the ProgrammingLanguage it was originally written in.
When the MachineCode is that of a VirtualMachine, as is the case with Java class files, it is usually relatively close to the source language. Compilers for such languages also usually do relatively little in the way optimisation. In such cases, decompilation is quite viable, often outright trivial.
Contrast with cases when the MachineCode is that of a real silicon CPU, as is usually the case with C code. Such a target language is usually far apart from the source language, and most Compilers optimise quite aggressively. Therefor, it is at least very hard, if not impossible, to infer the language constructs used in the original source code by just looking at the Compiler generated MachineCode.