从官方文档中描述:Anonymous classes enable you to make your code more concise. They enable you to declare and instantiate a class at the same time. They are like local classes except that they do not have a name. Use them if you need to use a local class only once.理解:

1、首先匿名内部存在的目的是为了让代码简洁

2、你可以在声明一个类的时候同时实力化这个类

3、他与局部类一样但是没有类名

4、如果某个局部类只需要使用一次,那么你可以使用匿名内部类

使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

Show me the code ,如下代码来说明匿名内部类:

(1)通常没有使用匿名内部类的方式,这里用一个局部类实现了接口,然后实例化这个类,从而调用这个类

public class HelloWorldAnonymousClasses {

    //定义了一个接口
    interface IHello {
        public void say();
    }

    public void sayHello() {
        //实现这个接口
        class HelloWorld implements IHello {
            String name = "world";
            public void say() {
                System.out.println("Hello " + name);
            }
        }

        IHello helloWorld = new HelloWorld();

        helloWorld.say();

    }

    public static void main(String... args) {
        HelloWorldAnonymousClasses myApp =
                new HelloWorldAnonymousClasses();
        myApp.sayHello();
    }
}

结果:

Hello world

Process finished with exit code 0

(2)使用匿名内部类的方式,这里匿名类实现了IHello接口,同时做了一个实例化了

public class HelloWorldAnonymousClasses {

    //定义了一个接口
    interface IHello {
        public void say();
    }

    public void sayHello() {

        IHello helloWorld = new IHello() {
            String name = "world";
            @Override
            public void say() {
                System.out.println("Hello " + name);
            }
        };

        helloWorld.say();

    }

    public static void main(String... args) {
        HelloWorldAnonymousClasses myApp =
                new HelloWorldAnonymousClasses();
        myApp.sayHello();
    }
}

结果一样:

Hello world

Process finished with exit code 0

这样书写是否很干净简洁!

(3)注意这里匿名内部类同样也可以实例化一个抽象类的抽象方法

public class HelloWorldAnonymousClasses {

    //定义了一个接口
    abstract class IHello {
        public abstract void say();
    }

    public void sayHello() {

        IHello helloWorld = new IHello() {
            String name = "world";
            @Override
            public void say() {
                System.out.println("Hello " + name);
            }
        };

        helloWorld.say();

    }

    public static void main(String... args) {
        HelloWorldAnonymousClasses myApp =
                new HelloWorldAnonymousClasses();
        myApp.sayHello();
    }
}

结果一样:

Hello world

Process finished with exit code 0

(4)最后需要注意的一点就是:如果函数接口只有一个抽象方法的接口,可以用作Lambda表达式类型。采用Lambda表达式更加简洁!

Show me the code:

public class HelloWorldAnonymousClasses {

    //定义了一个接口
    interface IHello {
        public void say();
    }

    public void sayHello() {

        IHello helloWorld =()-> {
            String name = "world";
            System.out.println("Hello " + name);
        };

        helloWorld.say();

    }

    public static void main(String... args) {
        HelloWorldAnonymousClasses myApp =
                new HelloWorldAnonymousClasses();
        myApp.sayHello();
    }
}

结果:

Hello world

Process finished with exit code 0