Java 匿名类


匿名类,可以是实现接口,也可以是继承一个类

Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("你好");
    }
});
t.start();
t.join();

这个示例很常见,new Runnable(){...}便是声明的一个实现 Runnable 接口的匿名类。

匿名类,也可以是继承自某个类,例如:

HashMap<String, String> map = new HashMap<String, String>() {
    @Override
    public String put(String key, String value) {
        System.out.println("调用了 put 方法");
        return super.put(key, value);
    }
};
map.put("name", "letiantian.me");  // 会输出 "调用了 put 方法"

匿名类的名字

匿名类没有名字,但Java会给它一个名字,名字是所在类$序号,例如:

public class Demo {

    public static void main(String[] args) {

        Runnable task = new Runnable() {
            @Override
            public void run() {
                System.out.println("你好");
            }
        };
        System.out.println(task.getClass().getName());

    }

}

运行后会输出:

Demo$1

我们再看下,多个匿名类的效果:

public class Demo {

    public static void main(String[] args) {

        Runnable task1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("你好");
            }
        };

        Runnable task2 = new Runnable() {
            @Override
            public void run() {
                System.out.println("你好");
            }
        };
        System.out.println(task1.getClass().getName());
        System.out.println(task2.getClass().getName());
    }

}

运行后会输出:

Demo$1
Demo$2

匿名类的初始化

初始化,用花括号括起来就行,相当于匿名类的无惨构造函数。

示例:

HashMap<String, String> map = new HashMap<String, String>() {
    // 初始化
    {
        put("name", "b");
        put("age", "18");
    }
    // 重写 put 方法
    @Override
    public String put(String key, String value) {
        System.out.println("调用了 put 方法");
        return super.put(key, value);
    }
};

匿名类的内部属性

匿名类是可以声明属性的。示例:

public class Demo {

    public static void main(String[] args) throws InterruptedException {

        String message = "你好";

        Runnable task = new Runnable() {
            private String msg;

            {
                this.msg = message;
            }
            @Override
            public void run() {
                System.out.println(msg);
            }
        };

        Thread t = new Thread(task);
        t.run();
        t.join();
    }

}

匿名类可以使用有参构造函数传入数据

public class Demo {

    public static class NamedRunnable implements Runnable {
        private String name;

        public NamedRunnable(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        @Override
        public void run() {

        }
    }

    public static void main(String[] args) throws InterruptedException {

        String taskName = "任务1";

        Runnable task = new NamedRunnable(taskName) {
            @Override
            public void run() {
                System.out.println(getName());
            }
        };

        Thread t = new Thread(task);
        t.run();
        t.join();
    }

}


(本文完)


Java 教程