Lesson Completion
Back to course

Module 10: Packages and Access Modifiers

Overview

This module provides comprehensive coverage of Java packages, access modifiers, and visibility control. Learn how to organize code effectively, control access to classes and members, and build modular applications.

Learning Objectives

  • Master package creation and organization
  • Understand all access modifiers
  • Learn access control mechanisms
  • Work with CLASSPATH and JAR files
  • Understand module system (Java 9+)
  • Learn naming conventions and best practices
  • Design secure and maintainable code structures

Topics Covered

10.1 Introduction to Packages

10.1.1 Understanding Packages

  • What are Packages?
  • Namespace Management
  • Code Organization
  • Preventing Name Conflicts
  • Related Class Grouping

10.1.2 Benefits of Packages

  • Organization
  • Access Control
  • Namespace Management
  • Distribution
  • Reusability

10.1.3 Types of Packages

  • Built-in Packages
  • User-Defined Packages
  • Package Hierarchy

10.2 Creating Packages

10.2.1 Package Declaration

  • package Statement
  • Must Be First Statement
  • Syntax and Rules
  • Package Naming

10.2.2 Package Naming Conventions

  • Lowercase Letters
  • Reverse Domain Name
  • Hierarchical Structure
  • Examples
  • Best Practices

10.2.3 Directory Structure

  • Package-Directory Mapping
  • Folder Organization
  • Compilation with Packages
  • Source File Organization

10.2.4 Creating Subpackages

  • Hierarchical Packages
  • Dot Notation
  • Parent-Child Relationship
  • Organization Strategies

10.3 Using Packages

10.3.1 Accessing Package Members

  • Fully Qualified Names
  • Import Statements
  • When to Use Each Approach

10.3.2 import Statement

  • Single Type Import
  • Import on Demand (*)
  • Import Precedence
  • Static Import

10.3.3 Static Import

  • Importing Static Members
  • Syntax
  • Use Cases
  • Best Practices
  • Avoiding Overuse

10.3.4 Import Conflicts

  • Same Class Name Resolution
  • Explicit Qualification
  • Handling Ambiguity

10.4 Built-in Java Packages

10.4.1 java.lang Package

  • Automatically Imported
  • Fundamental Classes
  • String, Object, System, Math
  • Wrapper Classes
  • Thread Classes

10.4.2 java.util Package

  • Utility Classes
  • Collections Framework
  • Date and Time
  • Scanner, Random
  • Arrays, Collections

10.4.3 java.io Package

  • Input/Output Operations
  • File Handling
  • Streams
  • Readers and Writers
  • Serialization

10.4.4 java.net Package

  • Network Programming
  • URL Handling
  • Sockets
  • HTTP Connections

10.4.5 java.awt and javax.swing

  • GUI Components
  • Event Handling
  • Graphics
  • Swing Framework

10.4.6 Other Important Packages

  • java.sql (Database)
  • java.text (Formatting)
  • java.time (Modern Date/Time)
  • java.math (BigInteger, BigDecimal)
  • java.nio (New I/O)
  • java.util.concurrent (Concurrency)

10.5 Access Modifiers

10.5.1 Understanding Access Control

  • Visibility Control
  • Encapsulation Support
  • Security
  • API Design

10.5.2 Types of Access Modifiers

  • private
  • default (package-private)
  • protected
  • public

10.5.3 Access Levels Overview

  • Class Level Access
  • Member Level Access
  • Constructor Access
  • Method Access

10.6 private Access Modifier

10.6.1 Understanding private

  • Most Restrictive
  • Class-Level Only
  • Encapsulation
  • Data Hiding

10.6.2 Usage Scenarios

  • Instance Variables
  • Helper Methods
  • Internal Implementation
  • Constructors

10.6.3 Private Members Access

  • Within Same Class Only
  • No Subclass Access
  • No Package Access
  • Getters/Setters Pattern

10.7 default (Package-Private) Access

10.7.1 Understanding Default Access

  • No Modifier Specified
  • Package-Level Visibility
  • Default Behavior
  • Internal APIs

10.7.2 Usage Scenarios

  • Package-Private Classes
  • Utility Classes
  • Helper Methods
  • Internal Implementation

10.7.3 Access Rules

  • Same Package Access
  • No Access from Other Packages
  • Subclass Restrictions

10.8 protected Access Modifier

10.8.1 Understanding protected

  • Package + Subclass Access
  • Inheritance Support
  • Extension Points
  • Moderate Restriction

10.8.2 Usage Scenarios

  • Methods for Overriding
  • Template Methods
  • Hook Methods
  • Extension APIs

10.8.3 Access Rules

  • Same Package Access
  • Subclass Access (Any Package)
  • Through Inheritance Only
  • Not Through Reference

10.9 public Access Modifier

10.9.1 Understanding public

  • Least Restrictive
  • Universal Access
  • Public API
  • Global Visibility

10.9.2 Usage Scenarios

  • Public Classes
  • API Methods
  • Public Constants
  • Interface Methods

10.9.3 Public Classes

  • One Public Class Per File
  • File Name = Class Name
  • Visibility Rules

10.10 Access Modifier Comparison

10.10.1 Access Level Table

  • Same Class
  • Same Package
  • Subclass (Different Package)
  • Other Packages

10.10.2 Choosing Access Modifiers

  • Least Privilege Principle
  • API Design
  • Maintainability
  • Evolution

10.10.3 Class vs Member Access

  • Top-Level Classes
  • Nested Classes
  • Members Access
  • Constructors Access

10.11 Class Access Modifiers

10.11.1 Top-Level Classes

  • public or default
  • Cannot Be private or protected
  • One Public Class Per File
  • File Naming Rules

10.11.2 Nested Classes

  • Can Use All Modifiers
  • Access to Outer Class
  • static Nested Classes
  • Inner Classes

10.12 CLASSPATH

10.12.1 Understanding CLASSPATH

  • What is CLASSPATH?
  • Class Loading
  • Search Path
  • Default CLASSPATH

10.12.2 Setting CLASSPATH

  • Environment Variable
  • Command Line Option
  • IDE Configuration
  • Maven/Gradle Management

10.12.3 CLASSPATH Issues

  • ClassNotFoundException
  • NoClassDefFoundError
  • Version Conflicts
  • Troubleshooting

10.13 JAR Files

10.13.1 Introduction to JAR

  • Java Archive Format
  • Packaging Classes
  • Distribution
  • Compression

10.13.2 Creating JAR Files

  • jar Command
  • Manifest File
  • Directory Structure
  • Including Resources

10.13.3 Using JAR Files

  • Adding to CLASSPATH
  • Executable JARs
  • Dependency Management
  • JAR Content Inspection

10.13.4 Manifest File

  • META-INF/MANIFEST.MF
  • Main-Class Entry
  • Class-Path Entry
  • Custom Attributes

10.14 Module System (Java 9+)

10.14.1 Introduction to Modules

  • Platform Modularity
  • Explicit Dependencies
  • Strong Encapsulation
  • Reliable Configuration

10.14.2 module-info.java

  • Module Declaration
  • requires Directive
  • exports Directive
  • opens Directive
  • provides/uses Directives

10.14.3 Creating Modules

  • Module Structure
  • Compilation
  • Packaging
  • Running

10.14.4 Module Types

  • System Modules
  • Application Modules
  • Automatic Modules
  • Unnamed Module

10.15 Package and Class Design

10.15.1 Package Organization

  • Feature-Based Packaging
  • Layer-Based Packaging
  • Hybrid Approach
  • Best Practices

10.15.2 Cohesion and Coupling

  • High Cohesion
  • Loose Coupling
  • Package Dependencies
  • Dependency Management

10.15.3 Circular Dependencies

  • Identifying Cycles
  • Breaking Dependencies
  • Design Improvements
  • Refactoring Strategies

10.16 Access Control Best Practices

10.16.1 API Design

  • Minimal Public Interface
  • Internal vs External APIs
  • Backward Compatibility
  • Evolution Strategy

10.16.2 Encapsulation Guidelines

  • Private by Default
  • Progressive Disclosure
  • Information Hiding
  • Contract Design

10.16.3 Package Design Principles

  • Common Closure Principle
  • Common Reuse Principle
  • Acyclic Dependencies Principle
  • Stable Dependencies Principle

10.17 Version Management

10.17.1 Semantic Versioning

  • Version Numbers
  • Backward Compatibility
  • Breaking Changes
  • API Evolution

10.17.2 Deprecation

  • @Deprecated Annotation
  • Documentation
  • Migration Path
  • Removal Strategy

Hands-on Exercises

  1. Create custom packages with proper structure
  2. Implement access control scenarios
  3. Build multi-package applications
  4. Create and use JAR files
  5. Experiment with access modifiers
  6. Design package hierarchies
  7. Set up CLASSPATH configurations
  8. Create module-based applications (Java 9+)
  9. Build library with public API
  10. Implement package-private utilities
  11. Create sealed hierarchies
  12. Design plugin architectures

Key Takeaways

  • Packages organize related classes
  • Access modifiers control visibility
  • Proper encapsulation improves security
  • CLASSPATH manages class loading
  • JAR files package applications
  • Module system enhances modularity
  • Design principles guide structure

Common Mistakes to Avoid

  • Making everything public
  • Improper package naming
  • Circular package dependencies
  • CLASSPATH configuration errors
  • Wrong access level choices
  • Exposing implementation details
  • Not using packages in large projects

Real-World Applications

  • Framework design
  • Library development
  • Enterprise applications
  • API design
  • Plugin systems
  • Modular architectures
  • Multi-module projects

Additional Resources

  • Java Module System Documentation
  • Effective Java - Access Control
  • Clean Architecture
  • Package Design Principles
  • JAR File Specification

Assessment

  • Quiz on packages and access control
  • Practical: Design package structure
  • Implement access control scenarios
  • Create JAR files
  • Module system exercises
  • API design challenges

Previous Module

Module 09: Abstraction and Interfaces

Next Module

Module 11: Exception Handling