4.1. Introduction to Object-Oriented Programming4.1.1. Classes4.1.2. Objects4.1.3. Identifying Classes4.1.4. Relationships between Classes4.2. Using Predefined Classes4.2.1. Objects and Object Variables4.2.2. The LocalDate Class of the Java Library4.2.3. Mutator and Accessor Methods4.3. Defining Your Own Classes4.3.1. An Employee Class4.3.2. Dissecting the Employee Class4.3.3. First Steps with Constructors4.3.4. Declaring Local Variables with var4.3.5. Working with null References4.3.6. Implicit and Explicit Parameters4.3.7. Benefits of Encapsulation4.3.8. Class-Based Access Privileges4.3.9. Private Methods4.3.10. Final Instance Fields4.4. Static Fields and Methods4.4.1. Static Fields4.4.2. Static Constants4.4.3. Static Methods4.4.4. Factory Methods4.4.5. The main Method4.5. Method Parameters4.6. Object Construction4.6.1. Overloading4.6.2. Default Field Initialization4.6.3. The Constructor with No Arguments4.6.4. Explicit Field Initialization4.6.5. Parameter Names4.6.6. Calling Another Constructor4.6.7. Initialization Blocks4.6.8. Static Initialization4.7. Records4.7.1. The Record Concept4.7.2. Constructors: Canonical, Compact, and Custom4.8. Packages4.8.1. Encapsulation4.8.2. Package Names4.8.3. Class Importation4.8.4. Module Imports4.8.5. Static Imports4.8.6. Addition of a Class into a Package4.8.7. Compiling with Packages4.8.8. Package Access4.8.9. The Class Path4.8.10. Setting the Class Path4.9. JAR Files4.9.1. Creating JAR files4.9.2. The Manifest4.9.3. Executable JAR Files4.9.4. Multi-Release JAR Files4.9.5. A Note about Command-Line Options4.10. Documentation Comments4.10.1. Comment Insertion4.10.2. Class Comments4.10.3. Method Comments4.10.4. Field Comments4.10.5. Package Comments4.10.6. HTML Markup4.10.7. Links4.10.8. General Comments4.10.9. Code Snippets4.10.10. Comment Extraction4.11. Class Design Hints