8.1 Inner Classes
Inner classes are classes defined within other classes. They have access to all members of the outer class, including private members.
Types of Inner Classes
- Non-static nested classes (Inner classes)
- Static nested classes
- Local classes (defined within methods)
- Anonymous classes (without name)
Non-static Inner Class
java
class Outer {
private String outerField = "Outer field";
class Inner {
private String innerField = "Inner field";
public void display() {
// Inner class can access outer class private members
System.out.println("Outer field: " + outerField);
System.out.println("Inner field: " + innerField);
}
}
public void createInner() {
Inner inner = new Inner();
inner.display();
}
}
public class InnerClassDemo {
public static void main(String[] args) {
Outer outer = new Outer();
outer.createInner();
// Creating inner class from outside
Outer.Inner inner = outer.new Inner();
inner.display();
}
}
Static Nested Class
java
class Outer {
private static String staticField = "Static field";
private String instanceField = "Instance field";
static class StaticNested {
public void display() {
System.out.println("Static field: " + staticField);
// Cannot access instanceField directly
// System.out.println(instanceField); // Error
}
}
}
public class StaticNestedDemo {
public static void main(String[] args) {
// No need for outer class instance
Outer.StaticNested nested = new Outer.StaticNested();
nested.display();
}
}
Local Inner Class
java
class Outer {
private String outerField = "Outer field";
public void methodWithLocalClass() {
final String localVar = "Local variable";
// Local class defined inside method
class LocalClass {
public void display() {
System.out.println("Outer field: " + outerField);
System.out.println("Local variable: " + localVar);
}
}
LocalClass local = new LocalClass();
local.display();
}
}
Anonymous Inner Class
java
interface Greeting {
void sayHello();
}
class AnonymousClassDemo {
public static void main(String[] args) {
// Anonymous class implementing interface
Greeting greeting = new Greeting() {
@Override
public void sayHello() {
System.out.println("Hello from anonymous class!");
}
};
greeting.sayHello();
// Anonymous class extending class
Thread thread = new Thread() {
@Override
public void run() {
System.out.println("Thread running from anonymous class");
}
};
thread.start();
}
}
Practical Inner Class Example
java
// Data structure using inner classes
class LinkedList {
private Node head;
// Static nested class for Node
private static class Node {
private int data;
private Node next;
public Node(int data) {
this.data = data;
}
}
// Inner class for Iterator
public class Iterator {
private Node current;
public Iterator() {
this.current = head;
}
public boolean hasNext() {
return current != null;
}
public int next() {
int data = current.data;
current = current.next;
return data;
}
}
public void add(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode;
} else {
Node current = head;
while (current.next != null) {
current = current.next;
}
current.next = newNode;
}
}
public Iterator getIterator() {
return new Iterator();
}
}
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add(10);
list.add(20);
list.add(30);
LinkedList.Iterator iterator = list.getIterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}