Table of contents
1.
Introduction
2.
What Is a Nested Class in Java?
3.
Why Use Nested Classes in Java?
4.
Types of Nested Classes in Java
5.
Static Nested Classes
5.1.
Example
6.
Inner Classes
6.1.
Java
7.
Non-Static (Inner) Classes in Java
7.1.
1. Member Inner Class
7.1.1.
Key Characteristics
7.1.2.
Example
7.1.3.
Use Case
7.2.
2. Local Inner Class
7.2.1.
Key Characteristics
7.2.2.
Example
7.2.3.
Use Case
7.3.
3. Anonymous Inner Class
7.3.1.
Key Characteristics
7.3.2.
Example
7.3.3.
Use Case
8.
Comparison Between a Normal Class & a Static Nested Class
9.
Real-World Use Cases of Nested Classes
9.1.
Event Handling in GUIs
9.2.
Encapsulation and Logical Grouping
9.3.
Java Frameworks Using Nested Classes
10.
Advantages and Disadvantages of Nested Classes
10.1.
Advantages of Using Nested Classes
10.2.
Disadvantages of Using Nested Classes
11.
Frequently Asked Questions
11.1.
Can static nested classes have non-static members?
11.2.
Why use an inner class instead of a separate class?
11.3.
How can an inner class access the outer class's members?
11.4.
Why use nested class?
12.
Conclusion
Last Updated: Jun 22, 2025
Medium

Nested Class in Java

Author Pallavi singh
0 upvote
Career growth poll
Do you think IIT Guwahati certified course can help you in your career?

Introduction

Nested classes in Java might sound complex, but they're really just a way of organizing your code. Think of it like keeping your study notes in different sections of a binder for easier access. Java allows you to create a class within another class, which can be very useful  for grouping together related components in a tidy, structured way. 

Nested Class in Java

In this article, we'll learn everything  about nested classes, focusing on static nested classes & inner classes, and how they compare to regular classes. 

What Is a Nested Class in Java?

A nested class in Java is simply a class defined within another class. It helps in logically grouping classes that are only used in one place, improving code organization. When a class exists inside another, it is called a nested class because it is "nested" within the enclosing class.

Nested classes can make your Java code cleaner, especially when one class is strongly tied to another, such as in GUI event handling or specialized data structures.

Why Use Nested Classes in Java?

Using nested classes in Java offers several benefits:

  • Logical Grouping: When a class is useful only to its enclosing class, nesting keeps related code together, improving structure.
  • Better Encapsulation: Nested classes can access private members of the outer class, enabling tighter control over data and reducing unnecessary exposure.
  • Improved Readability and Maintenance: By keeping closely related classes together, the code becomes easier to understand and maintain.
  • Event Handling and Framework Development: Nested classes are frequently used in Java GUI applications (like event listeners) and frameworks where small, specific helper classes are needed.

For example, a Button class may have a nested ClickListener class to handle its specific click events, keeping the code efficient and well-organized.

Types of Nested Classes in Java

In Java, nested classes are classified into two main types: Static Nested Classes and Non-Static (Inner) Classes. Understanding these helps in organizing code better and implementing logical grouping of classes.

  1. Static Nested Class
  2. Non-Static (Inner) Class

Static Nested Classes

When we talk about static nested classes in Java, think of them as a static member of the outer class. Just like static methods & variables, these classes can access all the static members of the outer class, but they don't have access to the instance variables & methods directly.

Example

Imagine you have a class called OuterClass & inside it, you want to define a static nested class called NestedClass. Here's how you could set it up:

public class OuterClass {
    // Static variable of the outer class
    static int outerVariable = 100;
       // Static nested class
    static class NestedClass {
        void display() {
            // Can access the static variable of outer class
            System.out.println("Value of outerVariable: " + outerVariable);
        }
    }
}


To use this NestedClass, you'd create an instance of it in the following way:

public class TestNestedClass {
    public static void main(String[] args) {
        // Creating an instance of the static nested class
        OuterClass.NestedClass nestedObject = new OuterClass.NestedClass();
        nestedObject.display();  // This will print: Value of outerVariable: 100
    }
}


In this setup, NestedClass acts almost like a regular class that's been packaged inside another class for organizational purposes. It's a neat way to keep your code structured & grouped logically, especially when the nested class only makes sense in the context of its enclosing class.

Inner Classes

Inner classes are a part of nested classes but with a twist; they are non-static. This means they are closely linked to the instance of the outer class. Picture this: If the outer class is a house, the inner class is a room that can only be accessed when you're inside the house.

Here's how you can use an inner class in Java:

  • Java

Java

class OuterClass {

// Inner class

class InnerClass {

// The inner class can access all members of the outer class, even if they are declared private

public void display() {

System.out.println("Message from the inner class.");

}

}

}

public class Main {

public static void main(String[] args) {

// First, create an instance of the outer class

OuterClass outer = new OuterClass();

// Then, create an instance of the inner class

OuterClass.InnerClass inner = outer.new InnerClass();

// Now you can call the method of the inner class

inner.display();

}
}
You can also try this code with Online Java Compiler
Run Code

Output

Message from the inner class.


In this example, InnerClass is defined within OuterClass. To create an instance of InnerClass, you first need an instance of OuterClass. This setup allows InnerClass to access all the members (including private ones) of OuterClass, making it useful for handling complex scenarios where the inner class needs to manipulate the outer class's members directly.

Non-Static (Inner) Classes in Java

In Java, non-static nested classes are known as inner classes. These classes are closely associated with their outer class and require an instance of the outer class to be created. Inner classes provide better data encapsulation and help in logically grouping classes that are only relevant within the context of the enclosing class.

There are three main types of inner classes in Java:

  • Member Inner Class
  • Local Inner Class
  • Anonymous Inner Class

1. Member Inner Class

A Member Inner Class is a class defined directly inside another class but outside any methods. It behaves like an instance member of the outer class and can access all members (including private ones) of the outer class.

Key Characteristics

  • Requires an instance of the outer class to create its object.
  • Typically used when the inner class logically belongs to the outer class.

Example

public class OuterClass {
    private String message = "Hello from Outer Class";

    class MemberInnerClass {
        void display() {
            System.out.println(message);
        }
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        MemberInnerClass inner = outer.new MemberInnerClass();
        inner.display();
    }
}
You can also try this code with Online Java Compiler
Run Code

Use Case

Member inner classes are often used when the inner class is tightly coupled with the outer class and frequently needs to access its members, such as when modeling objects like Car and Engine.

2. Local Inner Class

A Local Inner Class is defined inside a method or a block and is only accessible within that method. It cannot be accessed from outside the method where it is declared.

Key Characteristics

  • It behaves like a local variable with its scope limited to the method.
  • Can access final or effectively final variables from the enclosing method.
  • Useful for tasks that are only relevant within the method.

Example

public class OuterClass {
    void display() {
        final int number = 5;

        class LocalInnerClass {
            void show() {
                System.out.println("Local Inner Class: " + number);
            }
        }

        LocalInnerClass local = new LocalInnerClass();
        local.show();
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.display();
    }
}
You can also try this code with Online Java Compiler
Run Code

Use Case

Local inner classes are ideal for short-lived tasks like calculations, event handling in a single method, or passing behavior to threads where the class is not needed elsewhere.

3. Anonymous Inner Class

An Anonymous Inner Class is a type of inner class without a name, usually declared and instantiated all at once. It is used to override methods or provide specific implementations, especially when creating objects of interfaces or abstract classes on the fly.

Key Characteristics

  • Does not have a class name.
  • Instantiated and defined simultaneously.
  • Used for concise, one-time-use class implementations.

Example

public class OuterClass {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("Running from Anonymous Inner Class");
            }
        };

        Thread thread = new Thread(runnable);
        thread.start();
    }
}
You can also try this code with Online Java Compiler
Run Code

Use Case

Anonymous inner classes are commonly used in event handling, multithreading, and GUI development where small, specific tasks like button clicks or background tasks need to be handled quickly without creating separate class files.

Comparison Between a Normal Class & a Static Nested Class

AspectNormal ClassStatic Nested Class
AccessibilityCan be accessed from outside the containing class using its name.Accessed using the outer class name, as it's a static member of the outer class.
Association with Outer ClassNo direct association. Acts independently of any other class.Associated with its outer class. Can access static members of the outer class even if it's private.
Use CaseUsed when you need a standalone functionality that isn't tied to any particular class.Ideal for grouping classes that are only used in one place, enhancing readability and maintainability.
Instance CreationCreated using the new keyword followed by the class name.Created using the outer class name followed by the new keyword and the nested class name.
Access to Outer Class MembersCannot directly access the members of another class unless through an object.Can access all static members of the outer class, including private ones.

Real-World Use Cases of Nested Classes

Event Handling in GUIs

One of the most common real-world applications of nested classes in Java is event handling in graphical user interfaces (GUIs). In Java GUI development (using frameworks like Swing and JavaFX), nested classes are often used to define event listeners directly within the component classes.
For example, when creating a button in a Swing application, a nested class can be used to handle its ActionListener:

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button clicked!");
    }
});

This anonymous inner class makes the code cleaner and keeps event-handling logic close to the component, improving maintainability and readability.

Encapsulation and Logical Grouping

Nested classes help in logically grouping related classes that are only used within a specific outer class. For example, if you are designing a Car class, you may create an Engine inner class because the Engine is conceptually a part of the Car and is not used independently.

public class Car {
    class Engine {
        void start() {
            System.out.println("Engine started");
        }
    }
}

This approach promotes better encapsulation since the inner class can access private members of the outer class, reducing the need to expose unnecessary data.

Java Frameworks Using Nested Classes

Popular Java frameworks like Swing and JavaFX heavily rely on nested classes:

  • In Swing, nested and anonymous classes are used for event handling (e.g., mouse clicks, keyboard actions).
  • In JavaFX, developers frequently use anonymous inner classes and lambda expressions to manage GUI events like button presses and form submissions.
    Nested classes in these frameworks streamline coding patterns, making them more concise and intuitive.

Advantages and Disadvantages of Nested Classes

Advantages of Using Nested Classes

  • Better Organization: Nested classes keep related classes together, making the code more modular and structured.
  • Improved Encapsulation: They can access private members of the outer class, allowing tighter data control without exposing sensitive variables unnecessarily.
  • Enhanced Readability: When a class is only used within another class, nesting it can make the program easier to understand by showing their relationship clearly.
  • Convenient for Event Handling: Especially in GUIs, nested classes make it easy to manage events (like button clicks) within the same context, reducing the need for separate class files.
  • Simplified Code for One-Time Use: Anonymous inner classes are great for writing quick, task-specific implementations without the overhead of defining new named classes.

Disadvantages of Using Nested Classes

  • Potential Complexity: Deeply nested classes can make the code hard to read and maintain, especially if nesting levels increase unnecessarily.
  • Tight Coupling: The inner class often depends heavily on the outer class, which can make it harder to reuse code independently.
  • Maintenance Challenges: Complex inner class structures may confuse developers who are new to the codebase, increasing the likelihood of errors during updates.
  • Reduced Testability: Since inner classes are closely tied to their outer classes, unit testing them separately can become difficult.

Frequently Asked Questions

Can static nested classes have non-static members?

Yes, static nested classes can have non-static members. However, to access these members, you need to instantiate the static nested class.

Why use an inner class instead of a separate class?

Inner classes are used for logical grouping, to access the outer class's members easily, and for better encapsulation. They are handy when a class is useful to only one other class.

How can an inner class access the outer class's members?

An inner class has direct access to all the members (including private ones) of its outer class. It doesn't need any special syntax for this; it can just use the member names directly.

Why use nested class?

Nested classes in Python are used to logically group classes that are only used in one place, improving code organization and readability. They help encapsulate and hide implementation details, providing a clear structure. Nested classes can also access the outer class's attributes, promoting tighter integration and cohesion within the code.

Conclusion

In this article, we've learned the concept of nested classes in Java, focusing on static nested classes & inner classes. We saw how static nested classes, similar to static members, don't require an instance of the outer class to be accessed & can help organize related classes. Inner classes, on the other hand, offer a closer relationship with the outer class, allowing direct access to its members and providing a tight encapsulation.

Live masterclass