对 Java 的匿名内部类理解

Posted miantiao312

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对 Java 的匿名内部类理解相关的知识,希望对你有一定的参考价值。

对 Java 的匿名内部类理解

JAVA面向对象三大特性:封装、继承、多态。

多态:可以理解为大千世界中的对象在不同的环境下可能会有多种形态。

Java中多态存在的前提:必须存在继承、父类的引用指向子类的对象。

匿名内部类:就是没有名字的内部类,所以匿名内部类只能使用一次。

通常使用匿名内部类来简化代码编写,但使用匿名内部类有个前提条件:必须继承一个父类或实现一个接口。

案例1:不使用匿名内部类来实现抽象方法
    /**
     * @ Author:  LightningLi
     * @ Date:    18/12/23 10:04
     * @ Description: 不使用匿名内部类来实现抽象方法
     */
    public class Demo {
        public static void main(String[] args) {
            Person p=new Child();
            p.eat();
        }
    }
    
    abstract class Person{
        public abstract void eat();
    }
    
    class Child extends Person{
        @Override
        public void eat() {
            System.out.println("吃东西");
        }
    }

运行结果:吃东西。

可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用,而Child类就是我们在匿名内部类中隐藏的类;如果此处的Child类只使用一次,而将其编写为独立的一个类岂不是很麻烦?

当然我们可以使用匿名内部类解决。

案例2:匿名内部类的基本实现

    /**
     * @ Author:  LightningLi
     * @ Date:    18/12/23 10:54
     * @ Description: 匿名内部类的基本实现
     */
    public class Demo2 {
        public static void main(String[] args) {
            People people=new People() {
                @Override
                public void play() {
                    System.out.println("玩耍耍");
                }
            };
    
            people.play();
        }
    }
    
    abstract class People{
        public abstract void play();
    }

运行结果:玩耍耍。

可以看到,我们直接将抽象类Person中的方法在大括号中实现了,这样便可以省略一个类的书写。匿名内部类还能用于接口上。

案例3:在接口上使用匿名内部类

    /**
     * @ Author:  LightningLi
     * @ Date:    18/12/23 11:01
     * @ Description:在接口上使用匿名内部类
     */
    public class Demo3 {
    
        public static void main(String[] args) {
            Man m=new Man() {
                @Override
                public void sleep() {
                    System.out.println("睡觉觉");
                }
            };
    
            m.sleep();
        }
    }
    
    interface Man{
        public void sleep();
    }

运行结果:睡觉觉。

由上面的例子可以得出结论,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现。

最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口。

案例4:Thread类的匿名内部类实现

    /**
     * @ Author:  LightningLi
     * @ Date:    18/12/23 11:06
     * @ Description:Thread类的匿名内部类实现
     */
    public class Demo4 {
        public static void main(String[] args) {
            Thread t=new Thread(){
                public void run(){
                    for (int i=0;i<=5;i++){
                        System.out.print(i);
                    }
                }
            };
            t.start();
        }
    }

案例5:Runnable接口的匿名内部类实现

    /**
     * @ Author:  LightningLi
     * @ Date:    18/12/23 11:09
     * @ Description:Runnable接口的匿名内部类实现
     */
    public class Demo5 {
        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();
        }
    }

可以参考这篇文章有关于匿名内部类中多态的理解:http://blog.csdn.net/zahngjialiang/article/details/68946631

以上是关于对 Java 的匿名内部类理解的主要内容,如果未能解决你的问题,请参考以下文章

理解java匿名内部类

Java学习笔记之二十六深入理解Java匿名内部类

java内部类的匿名内部类

闭包与内部类

该如何理解匿名内部类的功能?

java匿名内部类