详解匿名内部类

Java匿名类

作用:重写其方法,或实现抽象方法、接口。来完成自己的特殊实现。正因为没有名字

所以匿名内部类只能使用一次,它通常用来简化代码编写,匿名内部类没有构造器

内部类能够访问外部类的一切成员变量和方法,包括私有的。

注意事项

1)访问外层Class里面的字段。

2)不能访问外层方法中的本地变量。除非变量是final。(拷贝引用,为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变)

3)如果内部类的名称和外面能访问的名称相同,则会把名称覆盖掉。

4)不能定义静态初始化代码块(StaticInitializer)

5)不能在匿名类里面定义接口、不能定义构造函数的。

6)匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

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

Abstract class Person {//如果是一般类的话,就是重写方法

  public abstract  void  eat();

}

public class  Test{

    private intfoo;

    public void show() {

       final int doo = 0;

       Person person =new Person () {

           public void run() {

              System.out.println(doo);

           }

       };

    person.run();

    }

}

实例2:在接口上使用匿名内部类

interface  Person {

    public  void  eat();

}

public  class  Demo {

    public  static  void  main(String[] args) {

        Person p = new Person() {

            public void eat() {

                System.out.println("eat something");

            }

        };

        p.eat();

    }

}

运行结果:eat something

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

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

实例3: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();

    }

}


运行结果:1 2 3 4 5

实例4: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();

}

}

运行结果:1 2 3 4 5

实例5:匿名内部类初始化

我们一般都是利用构造器来完成某个实例的初始化工作的,但是匿名内部类是没有构造器的!那怎么来初始化匿名内部类呢?使用构造代码块!利用构造代码块能够达到为匿名内部类创建一个构造器的效果。

public class Test {

    public String getName() {

       returnnull;

    }

    public int getAge() {

       return 0;

    }

}

public class HelloA {

    public Test getInnerClass(finalint age, final String name) {

       return new Test() {

           int age_;  String name_;

           //构造代码块完成初始化工作

           {

              if (0 < age && age <200) {

                  age_= age;

                  name_= name;

              }

           }

           public String getName() {

              return name_;

           }

           public int getAge() {

              return age_;

           }

       };

    }

    public static void main(String[] args) {

       HelloA out = new HelloA();

       Test  inner_1 = out.getInnerClass(199,"chenssy");

       System.out.println(inner_1.getName()+" : "+inner_1.getAge());

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值