Detailed summary of anonymous inner classes in Java

  • 2020-04-01 02:23:16
  • OfStack

Anonymous inner classes are inner classes that have no name

Because there is no name, anonymous inner classes can only be used once and are often used to simplify coding

But there is a catch to using anonymous inner classes: you must inherit from a parent class or implement an interface

Example 1: do not use anonymous inner classes to implement abstract methods


abstract class Person { 
    public abstract void eat(); 
} 

class Child extends Person { 
    public void eat() { 
        System.out.println("eat something"); 
    } 
} 

public class Demo { 
    public static void main(String[] args) { 
        Person p = new Child(); 
        p.eat(); 
    } 
}

Run result: eat something

As you can see, we inherited the Person class with Child, and then implemented an instance of the Child, transforming it up to a reference to the Person class

However, if the Child class here is used only once, wouldn't it be troublesome to write it as a separate class?

This is where anonymous inner classes are introduced

Example 2: a basic implementation of anonymous inner classes


abstract class Person { 
    public abstract void eat(); 
} 

public class Demo { 
    public static void main(String[] args) { 
        Person p = new Person() { 
            public void eat() { 
                System.out.println("eat something"); 
            } 
        }; 
        p.eat(); 
    } 
}

Run result: eat something

As you can see, we implemented the method in the abstract class Person directly in braces

This omits the writing of a class

Also, anonymous inner classes can be used on interfaces

Example 3: using anonymous inner classes on interfaces


interface Person { 
    public void eat(); 
} 

public class Demo { 
    public static void main(String[] args) { 
        Person p = new Person() { 
            public void eat() { 
                System.out.println("eat something"); 
            } 
        }; 
        p.eat(); 
    } 
}

Run result: eat something
From the above example, as long as a class is abstract or an interface, methods in its subclasses can be implemented using anonymous inner classes

The most common case is with multithreaded implementations, since multithreading requires inheritance from the Thread class or from the Runnable interface

Example 4: anonymous inner class implementation of the Thread class


public class Demo { 
    public static void main(String[] args) { 
        Thread t = new Thread() { 
            public void run() { 
                for (int i = 1; i <= 5; i++) { 
                    System.out.print(i + " "); 
                } 
            } 
        }; 
        t.start(); 
    } 
} 

Results: 1, 2, 3, 4, 5

Instance 5: anonymous inner class implementation of the Runnable interface


public class Demo { 
    public static void main(String[] args) { 
        Runnable r = new Runnable() { 
            public void run() { 
                for (int i = 1; i <= 5; i++) { 
                    System.out.print(i + " "); 
                } 
            } 
        }; 
        Thread t = new Thread(r); 
        t.start(); 
    } 
} 

Results: 1, 2, 3, 4, 5


Related articles: