Key Features of Java
The rest of this section summarizes some of the factors that have contributed to the evolution of Java from an object-oriented programming language to a full-fledged ecosystem for developing all sorts of systems, including large-scale business systems and embedded systems for portable computing devices. A lot of jargon is used in this section and it might be difficult to understand at the first reading, so we recommend coming back after working through the book to appreciate the factors that have contributed to the success of Java.
Multi-paradigm Programming
The Java programming language supports the object-oriented programming paradigm, in which the properties of an object and its behavior are encapsulated in the object. The properties and the behavior are represented by the fields and the methods of the object, respectively. The objects communicate through method calls in a procedural manner—in other words, Java also incorporates the procedural programming paradigm. Encapsulation ensures that objects are immune to tampering except when manipulated through their public interface. Encapsulation exposes only what an object does and not how it does it, so that its implementation can be changed with minimal impact on its clients. The later sections in this chapter provide an overview of basic concepts of object-oriented programming, such as inheritance and aggregation, and subsequent chapters will expand on this topic.
Java has also evolved to support the functional-style programming paradigm with the introduction of lambda expressions and their implementation using functional interfaces. This topic will be thoroughly explored in this book.
Above all, object-oriented system development promotes code reuse where existing classes can be reused to implement new classes. Its module facility facilitates implementation of large systems, allowing their decomposition into manageable subsystems, as we will see when we discuss modules.
Bytecode Interpreted by the JVM
Java programs are compiled to bytecode that is interpreted by the JVM. Various optimization technologies (e.g., just-in-time [JIT] delivery) have led to the JVM becoming a lean and mean virtual machine with regard to performance, stability, and security. Many other languages, such as Scala, Groovy, and Clojure, now compile to bytecode and seamlessly execute on the JVM. The JVM has thus evolved into an ecosystem in its own right.