2)Java學習筆記:匿名內部類

爲何要使用匿名內部類

①若是之前的類有一些缺陷,只是想在某一個模塊進行修復,能夠在引用該類的地方使用匿名內部類,在overRide方法進行修復。
②若是一個類,須要派生出不少類,並且這些類大多隻是在一個特定模塊去使用,是否是沒有必要挨個的去建立這些子類呢。ide

注意事項

①使用匿名內部類時,咱們必須是繼承一個類或者實現一個接口,可是二者不可兼得,同時也只能繼承一個類或者實現一個接口。
②匿名內部類中是不能定義構造函數的, 只能用現有的父類構造器或者用初始化代碼塊來進行初始化。
③匿名內部類中不能存在任何的靜態成員變量和靜態方法。
④匿名內部類爲局部內部類,因此局部內部類的全部限制一樣對匿名內部類生效。
⑤匿名內部類不能是抽象的,它必需要實現繼承的類或者實現的接口的全部抽象方法。
⑥匿名內部類只能訪問所在方法用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的類文件。

相關文章
相關標籤/搜索