匿名类基础知识整理

匿名内部类适合创建那种只需要一次使用的类,例如命令模式时所需要的Command对象。匿名内部类的语法有点奇怪,创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。

定义匿名内部类的格式如下:

    new 父类构造器(参数列表)|实现接口()  
    {  
     //匿名内部类的类体部分  
    }  

从上面定义可以看出,匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口。
关于匿名内部类还有如下两条规则:
1)匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。因此不允许将匿名内部类定义成抽象类。
2)匿名内部类不等定义构造器,因为匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义实例初始化块,通过实例初始化块来完成构造器需要完成的事情。

interface Product {
    public double getPrice();

    public String getName();
}


public class TestAnonymous {
    public void test(Product p) {
        System.out.println("购买了一个" + p.getName() + ",花掉了" + p.getPrice());
    }

    public static void main(String[] args) {
        TestAnonymous ta = new TestAnonymous();
        ta.test(new Product() {
                public double getPrice() {
                    return 567;
                }

                public String getName() {
                    return "AGP显卡";
                }
            });
    }
}

只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现。最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口。
Thread类的匿名内部类实现:

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();
    }
}

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

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();
    }
}


posted on 2017-01-31 11:42  菜鸟Z  阅读(278)  评论(0编辑  收藏  举报

导航