关于匿名类

首先匿名类肯定是内部类。JAVA内部类分为成员内部类和局部内部类。成员内部类和成员变量类似,定义在方法外面,而局部内部类则和局部变量类似,定义在方法里面。匿名类属于局部内部类。

匿名类的应用场景一般是实现一个接口或者继承一个抽象类并重写其方法然后实例出一个对象,当然这个对象就是该匿名类对象。为什么需要实例出一个对象呢,因为重点是需要运行被重写的方法。

先看一下匿名类的应用,有两种方式。

第一种:

interface D{void showContext();}
new D(){
    @Override
    public void showContext(){
        System.out.print("Hello");
    }
}.showContext();

第二种:

interface D{void showContext();}
D d = new D(){
    @Override
    public void showContext(){
        System.out.print("Hello");
    }
};
d.showContext();

两种方法大致上是一样的,只不过采用了不同的方式去运行被重写的方法。很容易看出使用匿名类的目的就是为了重写并调用接口D的showContext()方法。举个例子,新启动一个线程就是可以用匿名类实现,只不过运行的不是重写的run()方法,而是接口Thread的start()方法。

new Thread(){
    @Override
    public void run(){
        System.out.print("run");
    }
}.start();

由于有执行方法的动作,匿名类必须写在方法里面,必须是局部内部类,它的定义约束规则也和局部内部类一致,有如下几条:

1.非静态方法里的局部内部类访问成员变量必须是final修饰的。

2.因为局部内部类是定义在方法里面的,如果该方法不是静态方法,局部内部类不能访问静态成员变量和静态方法,也不能在其中定义静态代码块。如果方法是静态的,那么局部内部类可以访问静态成员变量和静态方法,也可以在其中定义静态代码块。

3.匿名类永远不能是抽象类。很好理解,因为匿名类的目的就是重写方法并执行。

猜你喜欢

转载自blog.csdn.net/weixin_42447959/article/details/83352080
今日推荐