Sub-Packages in Java
In Java, sub-packages help organize your code in a hierarchical structure. They allow developers to manage large projects efficiently by grouping related classes and interfaces under a main package.
For example :
com.myapp.utils
com.myapp.models
com.myapp.controllers
com.myapp→ main packageutils,models,controllers→ sub-packages
Sub-packages make your code modular, reusable, and easy to maintain.
What is a Sub-Package?
A sub-package is a package nested inside another package.
- It can contain classes, interfaces, and even other sub-packages.
- Each sub-package has its own namespace, which prevents naming conflicts.
Example of Sub-Packages:
com.company.project
com.company.project.utils
com.company.project.models
com.company.project.controllers
Creating a Sub-Package

Step 1: Declare the Sub-Package
At the top of your Java file, write the package statement:
// File: com/company/project/utils/Helper.java
package com.company.project.utils;
public class Helper {
public static void show() {
System.out.println("Hello from sub-package!");
}
}
Folder structure must match package name:
com/
└── company/
└── project/
└── utils/
└── Helper.java
Step 2: Compile the Sub-Package Class
Use javac -d to compile while preserving the folder structure:
javac -d . com/company/project/utils/Helper.java
Step 3: Import Sub-Package in Another Class
// File: Main.java
import com.company.project.utils.Helper;
public class Main {
public static void main(String[] args) {
Helper.show();
}
}
Run:
java Main
Output:
Hello from sub-package!
Accessing Classes in Sub-Packages

1. Single Class Import
import com.company.project.utils.Helper;
2. Import All Classes in Sub-Package
import com.company.project.utils.*;
3. Fully Qualified Name (No import)
com.company.project.utils.Helper.show();
Best Practices
- Keep the package hierarchy simple and logical.
- Name sub-packages by functional modules (e.g.,
models,controllers,services). - Avoid deep nesting beyond 3–4 levels to maintain readability.
- Use access modifiers wisely —
publicclasses are accessible across packages, default classes are package-private.
Advantages of Sub-Packages
| Advantage | Description |
|---|---|
| Organization | Groups related classes together |
| Avoid Naming Conflicts | Each sub-package has its own namespace |
| Reusability | Classes can be reused in multiple projects |
| Modularity | Easy maintenance for large projects |
Common Mistakes
| Mistake | Problem |
|---|---|
| Folder name mismatch | Compiler throws “package does not exist” |
| Missing package statement | Class belongs to default package |
| Wrong import | Class cannot be accessed |
FAQs
Q1: Can sub-packages access parent package classes without import?
No. You must import the class explicitly or use the fully qualified name.
Q2: Can sub-packages have their own sub-packages?
Yes, sub-packages can be nested multiple levels deep.
Q3: Are sub-packages automatically visible to the parent package?
No. Java treats each package/sub-package as a separate namespace. Access depends on public modifier.
