There are a number of different components to Java:
1. Development environment
The Java 2 SDK contains the tools and executable code needed to compile and test Java programs. However, unlike a normal language, the Java 2 SDK includes object frameworks for creating graphical user interfaces, for networking and for complex I/O. Normally, in other programming languages, these things are provided as additions, either by the operating system or by another software package. Of course, fully-featured development environments do exist for Java, but the core language includes a lot of what they would normally have to provide.
2. Execution environment
Java’s execution environment is neither that of a compiled language nor an interpreted language. Instead it is a hybrid, implemented by the Java Virtual Machine (JVM). Java is often said to be platform-independent, but first the JVM must be ported to each platform to provide the environment it needs. The JVM implementation is responsible for all of the built-in security of Java, so it is important that it is done properly.
The JVM is a subset of the Java Runtime Environment (JRE). JRE is the Java platform on which you can run, test and ship your own applications. It consists of the JVM, the Java platform core classes, and supporting files. It contains no development tools: no compiler, debugger, or other tools.
3. Interfaces and architectures
Java applications live in the real world. This means that they must be able to interact with non-Java applications. Some of these interactions are very simple (such as the way that a Java applet is invoked in a Web page). Others are the subject of more complex architectural definitions, such as the JDBC interface for relational database support. The mechanism for adding encryption to Java security, the Java Cryptography Architecture (JCA), falls into this latter category.