Java匿名内部类学习

来源:互联网 发布:淘宝lol皮肤在哪买 编辑:程序博客网 时间:2024/06/05 23:52

Java匿名内部类

  1. 匿名内部类基本知识与用法
    匿名内部类,是一个没有类名的类,通常用在当一个继承父类或者实现接口的类只需要用一次的时候,用来简化代码编写。总结一下匿名内部类有几个基本点:
    *继承父类或者实现接口或者实现抽象类
    *匿名内部类用new来生成一个继承父类的对象的引用,因此可以用来作为参参数传递
    *匿名内部类只能使用一次

  2. 利用代码来测试继承父类、实现接口、实现抽象类的用法

abstract class afather {    public abstract void eat();}class father {    public void eat(){        System.out.println("eat person");    }}interface ifather{    public void eat();}class Child extends father {    public void eat() {        System.out.println("eat child");    }}public class Test {    public static void main(String[] args) {        //非匿名内部类的用法        father fc = new Child();        fc.eat();        //继承父类的匿名内部类        father f = new father(){            public void eat(){                System.out.println("eat nonameinnerclass");            }        };        f.eat();        //实现抽象类的匿名内部类        afather af = new afather(){            public void eat(){                System.out.println("eat afather");            }        };        af.eat();        //实现接口的匿名内部类        ifather ifa = new ifather(){            public void eat(){                System.out.println("eat interface");            }        };        ifa.eat();    }}

运行结果:
eat child
eat nonameinnerclass
eat afather
eat interface

  • 利用代码测试匿名内部类作为参数传递
abstract class afathers {    public abstract void eat();}class others{    public void getafather(afathers a){        a.eat();    }}public class Test2 {    public static void main(String[] args) {        // 相当于传递了一个实现afathers类的子类的引用        new others().getafather(                new afathers(){                    public void eat(){                        System.out.println("eat");                    }                }        );    }}
  1. 一些注意事项

    http://blog.csdn.net/chenssy/article/details/13170015(http://blog.csdn.net/chenssy/article/details/13170015)

    在使用匿名内部类的过程中,我们需要注意如下几点:
    1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
    2、匿名内部类中是不能定义构造函数的。
    3、匿名内部类中不能存在任何的静态成员变量和静态方法。
    4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
    5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

2.内部类使用参数必须是final类型
原因:内部类并不是直接使用的外部的参数,而是编译时有自己单独的.class文件,也就是说它是拷贝了一份参数,为了避免参数改变,造成数据不一致,要求数据必须是final类型
参考:[http://android.blog.51cto.com/268543/384844]

3.匿名内部类初始化
匿名内部类没有构造器,一般使用静态代码块来完成初始化操作。

0 0
原创粉丝点击