<aside> <img src="/icons/table_red.svg" alt="/icons/table_red.svg" width="40px" /> Table of Contents
</aside>
<aside> 💡
Inner Classes in Java
Types of Inner Classes
static
.static
.Nested Inner Class
A nested inner class is a non-static class defined within another class. It has access to all members of the enclosing class, including private members.
Syntax:
class OuterClass {
class InnerClass {
// Inner class code
}
}
Example: Nested Inner Class
class Outer {
private String message = "Hello from Outer";
class Inner {
void displayMessage() {
System.out.println(message);
}
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.displayMessage();
}
}
Output:
Hello from Outer
Static Nested Class
A static nested class is declared using the static
keyword. Unlike non-static inner classes, it does not require an instance of the outer class and can access only the static members of the outer class.
Syntax:
class OuterClass {
static class StaticNestedClass {
// Static nested class code
}
}
Example: Static Nested Class
class Outer {
static String message = "Hello from Outer";
static class StaticNested {
void displayMessage() {
System.out.println(message);
}
}
}
public class Main {
public static void main(String[] args) {
Outer.StaticNested nested = new Outer.StaticNested();
nested.displayMessage();
}
}
Output:
Hello from Outer
Anonymous Inner Class
An anonymous inner class is a class without a name. It is used to provide an implementation of an abstract class or interface. This type of inner class is created on-the-fly and used immediately.
Syntax:
interface Greet {
void sayHello();
}
Example: Anonymous Inner Class
interface Greet {
void sayHello();
}
public class Main {
public static void main(String[] args) {
Greet greet = new Greet() { // Anonymous Inner Class
@Override
public void sayHello() {
System.out.println("Hello from Anonymous Inner Class");
}
};
greet.sayHello();
}
}
Output:
Hello from Anonymous Inner Class
Local Inner Class
A local inner class is defined inside a method or block and is scoped only within that method. It cannot be declared as static
and can access final or effectively final variables of the enclosing scope.
Syntax:
class OuterClass {
void method() {
class LocalInnerClass {
// Local inner class code
}
}
}
Example: Local Inner Class
class Outer {
void display() {
final String message = "Hello from Local Inner Class";
class LocalInner {
void showMessage() {
System.out.println(message);
}
}
LocalInner localInner = new LocalInner();
localInner.showMessage();
}
}
public class Main {
public static void main(String[] args) {
Outer outer = new Outer();
outer.display();
}
}
Output:
Hello from Local Inner Class
Comparison of Inner Classes
Type | Access to Outer Class Members | Static Allowed | Usage Context |
---|---|---|---|
Nested Inner Class | Yes | No | When tight coupling with outer class is needed. |
Static Nested Class | Only static members | Yes | When no association with an outer instance. |
Anonymous Inner Class | Yes | No | For short-lived implementations. |
Local Inner Class | Yes | No | Scoped to a specific method or block. |