Java is gaining considerable recognition as the most suitable language for developing distributed applications in heterogeneous systems due to its portability and machine independence. However, standard Java does not provide easy-to-use features for parallel application development. Therefore, considerable research has been conducted and is underway to provide users with tools and programming models to write parallel applications in Java. This paper reviews a number of representative research projects and outlines the primary approaches used in these projects that enable Java to provide high performance parallel and distributed computing in heterogeneous systems. The study shows that most projects fit within one of the following parallel programming models: (1) message (or object-) passing, (2) distributed shared address (or object), (3) multi-threaded, and (4) transparent (or towards seamless) parallelization. Within these categories, the different implementation approaches are discussed. The paper also identifies and discusses a number of related problems and open issues such as benchmarks, porting legacy applications, distributed environment overhead and security.