In Java programs, it is difficult to protect intellectual property rights and secret information in untrusted environments, since they are easy to decompile and reverse engineer. Consequently realization of software obfuscation becomes increasingly important. Unfortunately previous software obfuscation techniques share a major drawback that they do not have a theoretical basis and thus it is unclear how effective they are. Therefore we shall propose new software obfuscation techniques for Java in this paper. Our obfuscation techniques take advantage of features of object-oriented languages, and they drastically reduce the precision of points-to analysis of the programs. We show that determining precise points-to analysis in obfuscated programs is NP-hard and the fact provides a theoretical basis for our obfuscation techniques. Furthermore, in this paper we present some empirical experiments, whereby we demonstrate the effectiveness of our approaches.