2)Java学习笔记:匿名内部类

为什么要使用匿名内部类

①如果以前的类有一些缺陷,只是想在某一个模块进行修复,可以在引用该类的地方使用匿名内部类,在overRide方法进行修复。
②如果一个类,需要派生出很多类,而且这些类大多只是在一个特定模块去使用,是不是没有必要挨个的去创建这些子类呢。

注意事项

①使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
②匿名内部类中是不能定义构造函数的, 只能用现有的父类构造器或者用初始化代码块来进行初始化。
③匿名内部类中不能存在任何的静态成员变量和静态方法。
④匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
⑤匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
⑥匿名内部类只能访问所在方法用final修饰的局部变量,为了防止匿名内部类不小心修改了外部变量的引用。

匿名内部类语法

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

Example

interface Product {
    long getPrice();
}

 abstract class Bird {
    private String name;
    public void setName(String name) {this.name = name;}
    public String getName() {return name;}
    public abstract int fly();
}

public class Anonymous {

    public void test(String name /* must defined final that innerClass Method can access; */) {

        final int age = 22;

        Product p1  = new Product() {
            @Override
            public long getPrice() {
                // 只能访问用final修饰的局部变量
                return age;
            }
        };

        Bird p2  = new Bird() {
            @Override
            public void setName(String _name) {
                // compile error, name must defined final
//                super.setName(name);
            }
            @Override
            public int fly() {
                return 1999;
            }
        };
    }

    public static void main(String[] args) {
        new Anonymous().test("human.huang");
    }
}
编译后目录:=》
total 40
-rw-r--r--  1 huangjunhua  staff  600 Jan  9 20:13 Anonymous$1.class
-rw-r--r--  1 huangjunhua  staff  665 Jan  9 20:13 Anonymous$2.class
-rw-r--r--  1 huangjunhua  staff  977 Jan  9 20:13 Anonymous.class
-rw-r--r--  1 huangjunhua  staff  528 Jan  9 20:13 Bird.class
-rw-r--r--  1 huangjunhua  staff  132 Jan  9 20:13 Product.class


编译后代码:=》
    public void test(String name) {
        boolean age = true;
        byte ageTest = 33;
        System.out.println(ageTest);
        Product var10000 = new Product() {
            public long getPrice() {
                return 22L;
            }
        };
        Bird var6 = new Bird() {
            public void setName(String _name) {
            }

            public int fly() {
                return 1999;
            }
        };
    }

其实匿名内部类也生成了Anonymous$1.class和Anonymous$2.class的类文件。

posted @ 2016-01-09 19:55  sexy_girl  阅读(330)  评论(0编辑  收藏  举报