What is a Package?
A package in Java is a namespace that groups related classes, interfaces, subpackages, enums, and annotations. Packages help organize large projects and provide modularity.
Why Use Packages?
Packages provide several important benefits:
- Avoid name conflicts
Example:university.department.cs.Studentuniversity.department.ee.Student - Better organization
Related classes are grouped logically. - Access control
protected: accessible within the same package and subclasses- default (no modifier): accessible only within the same package
- Encapsulation (data hiding)
Internal implementation can be hidden while exposing public APIs. - Reusability
Classes from packages can be reused across applications.
How Packages Work
Package names map directly to directory structures.
Example:
package university.department.cs;
Directory structure:
university/
└── department/
└── cs/
Java uses the CLASSPATH to locate packages and classes at runtime.
Package Naming Conventions
Java package names usually follow reverse domain naming:
com.company.project.module
org.organization.application
university.department.math
This guarantees global uniqueness.
Adding Classes to a Package
To add a class to a package:
- Declare the package at the top of the file
- Save the file in the corresponding directory
- Compile the file
package mypack;
public class MyClass {
public void display() {
System.out.println("Hello from MyClass in mypack.");
}
}
Subpackages
A subpackage is a package inside another package.
java.util
java.util.concurrent
⚠️ Subpackages are not automatically imported with parent packages.
import java.util.*; // Does NOT import java.util.concurrent
Importing Packages
Import a Specific Class
import java.util.ArrayList;
Import All Classes from a Package
import java.util.*;
Subpackages are excluded.
Accessing Classes in a Package
import java.util.List;
public class DemoImport {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
java.util.LinkedList<String> items =
new java.util.LinkedList<>();
}
}
Types of Packages in Java
1. Built-in Packages
Provided by Java API.
Common examples:
java.langjava.utiljava.iojava.netjava.awt
2. User-Defined Packages
// File: mypack/MyClass.java
package mypack;
public class MyClass {
public void display() {
System.out.println("Hello from MyClass in mypack.");
}
}
Usage:
import mypack.MyClass;
public class TestPackage {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.display();
}
}
Output
Hello from MyClass in mypack.
Creating a Package (Compile & Run)
package myPackage;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello from myPackage!");
}
}
Compile
javac -d . HelloWorld.java
Run
java myPackage.HelloWorld
Static Import in Java
Static import allows direct access to static members without class name.
import static java.lang.Math.*;
public class StaticImportExample {
public static void main(String[] args) {
System.out.println(PI);
System.out.println(sqrt(16));
}
}
Handling Name Conflicts
When two packages contain classes with the same name, use fully qualified names.
import java.util.Date;
import java.sql.*;
public class ConflictExample {
public static void main(String[] args) {
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate =
new java.sql.Date(System.currentTimeMillis());
System.out.println(utilDate);
System.out.println(sqlDate);
}
}
Directory Structure Mapping
com.example.shapes.Circle
↓
BASE_DIR/com/example/shapes/Circle.class
Important Built-in Packages
java.util Package
Provides utility classes for:
- Collections
- Date & time
- Random numbers
- Locale & formatting
- Timers
Example
import java.util.ArrayList;
public class Example {
public static void main(String[] args) {
ArrayList<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
System.out.println(fruits);
}
}
java.lang Package
Automatically imported in every Java program.
Key classes:
ObjectStringMathSystemThread- Wrapper classes (
Integer,Double, etc.)
Eg:
public class Example {
public static void main(String[] args) {
String msg = "Hello Java";
System.out.println(msg.length());
}
}
java.io Package
Handles:
- File input/output
- Streams
- Serialization
- Buffered I/O
Example: File Copy
import java.io.*;
public class FileCopyExample {
public static void main(String[] args) {
try (FileInputStream in = new FileInputStream("source.txt");
FileOutputStream out = new FileOutputStream("dest.txt")) {
int data;
while ((data = in.read()) != -1) {
out.write(data);
}
System.out.println("File copied successfully");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Buffered Reader & Writer Example
import java.io.*;
public class BufferedExample {
public static void main(String[] args) {
try (BufferedReader reader =
new BufferedReader(new FileReader("input.txt"));
BufferedWriter writer =
new BufferedWriter(new FileWriter("output.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
}
System.out.println("File processed successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Summary
- Packages organize Java code logically
- Prevent naming conflicts
- Improve encapsulation and security
- Support modular, reusable development
- Java provides rich built-in packages
- Developers can create custom packages easily