Decompilation cannot be avoided. You can easily make the code hard to read. There are free libraries available to obfuscate the code. proguard.sourceforge.net. Zelix KlassMaster, for example, can also scramble your code flow in a way that makes it really hard to follow and works as an excellent code optimizer.
Also many of the obfuscators are also able to scramble your string constants and remove unused code.
Another possible solution (not necessarily excluding the obfuscation) is to use encrypted JAR files and a custom class loader that does the decryption (preferably using native runtime library).
Third (and possibly offering the strongest protection) is to use native ahead of time compilers like GCC or Excelsior JET, for example, that compile your Java code directly to a platform specific native binary.
In any case You´ve got to remember that as the saying goes in Estonian "Locks are for animals". Meaning that every bit of code is available (loaded into memory) during the runtime and given enough skill, determination and motivation, people can and will decompile, unscramble and hack your code. Your job is simply to make the process as uncomfortable as you can and still keep the thing working.
References:
GCC- Click Here
excelsior JET- Click Here
Proguard Example- Click Here