Java-匿名内部类

来源:互联网 发布:手机视频搞怪软件 编辑:程序博客网 时间:2024/06/03 19:38

其实我也不知道为啥会有匿名内部类,不过感觉挺好用的。

如何使用匿名内部类

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

然后我发现,这里有一个new,在Java中都是先定义一个类,然后new出这个类的对象,但是在这里,没有类的定义,没有类的名字,直接就new出了一个对象,这很奇怪。在这里我们看到使用匿名内部类我们必须要继承一个父类或者实现一个接口,当然也仅能只继承一个父类或者实现一个接口。来看一下例子

abstract class Animal{    public abstract void Move();}class Bird extends Animal{    public void Move(){        System.out.println("I can fly");    }}public class NoNameTest{    public static void Test(Animal animal){        animal.Move();    }    public static void main(String[] args){        Test(new Bird());    }}

定义一个Animal的抽象类,然后一个Bird类继承Animal类,用Test()函数来测试。但是有时候,我们或许只用一次子类,如果这样定义就会很麻烦,会有很多子类,所以我们可以这样

abstract class Animal{    public abstract void Move();}public class NoNameTest{    public static void Test(Animal animal){        animal.Move();    }    public static void main(String[] args){        Test(new Animal(){            public void Move(){                System.out.println("I can fly");            }        });    }}

上面的例子中,Test(Animal animal),需要传入一个Animal的对象,准确的说是,传入Animal或者Animal子类的对象,然后我们在匿名类中重写方法,这样就会很方便,但是方便的同时也会有缺陷,比如,我们通过new来直接创建匿名类的对象,所以当new出的对象消失时,匿名类也就没有了,换言之,匿名类和new出的对象只能被使用一次。匿名类也没有名称,无法扩展,不能重复使用,如果我们要对一个类多次使用,还是要老老实实的定义子类。

匿名类注意事项

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

0 0
原创粉丝点击