匿名类的定义,使用场景和使用方式

定义

匿名内部类又叫匿名类,它有点像局部类(Local Class)或者内部类(Inner Class),只是匿名内部类没有名字,我们可以同时声明并实例化一个匿名内部类。

一个匿名内部类仅适用在想使用一个局部类并且只会使用这个局部类一次的场景。

匿名内部类是没有需要明确声明的构造函数的,但是会有一个隐藏的自动声明的构造函数。

创建匿名内部类有两种办法:

  1. 通过继承一个类(具体或者抽象都可以)去创建出匿名内部类
  2. 通过实现一个接口创建出匿名内部类

咱们看看下面的例子:

// 接口:程序员
interface Programmer {
    void develop();
}

public class TestAnonymousClass {
    public static Programmer programmer = new Programmer() {
        @Override
        public void develop() {
            System.out.println("我是在类中实现了接口的匿名内部类");
        }
    };

    public static void main(String[] args) {
        Programmer anotherProgrammer = new Programmer() {
            @Override
            public void develop() {
                System.out.println("我是在方法中实现了接口的匿名内部类");
            }
        };

        TestAnonymousClass.programmer.develop();
        anotherProgrammer.develop();
    }
}

从上面的例子可以看出,匿名类既可以在类中也可以在方法中被创建。

之前我们也提及匿名类既可以继承一个具体类或者抽象类,也可以实现一个接口。所以在上面的代码里,我创建了一个叫做 Programmer 的接口,并在 TestAnonymousClass 这个类中和 main() 方法中分别实现了接口。

Programmer除了接口以外既可以是一个抽象类也可以是一个具体类。

抽象类,像下面的代码一样:

public abstract class Programmer {
    public abstract void develop();
}

具体类代码如下:

public class Programmer {
    public void develop() {
        System.out.println("我是一个具体类");
    }
}

OK,继续深入,那么如果 Programmer 这个类没有无参构造函数怎么办?我们可以在匿名类中访问类变量吗?我们如果继承一个类,需要在匿名类中实现所有方法吗?

public class Programmer {
    protected int age;

    public Programmer(int age) {
        this.age = age;
    }

    public void showAge() {
        System.out.println("年龄:" + age);
    }

    public void develop() {
        System.out.println("开发中……除了异性,他人勿扰");
    }

    public static void main(String[] args) {
        Programmer programmer = new Programmer(38) {
            @Override
            public void showAge() {
                System.out.println("在匿名类中的showAge方法:" + age);
            }
        };
        programmer.showAge();
    }
}

  1. 构造匿名类时,我们可以使用任何构造函数。上面的代码可以看到我们使用了带参数的构造函数。
  2. 匿名类可以继承具体类或者抽象类,也能实现接口。所以访问修饰符规则同普通类是一样的。子类可以访问父类中的 protected 限制的属性,但是无法访问 private 限制的属性。
  3. 如果匿名类继承了具体类,比如上面代码中的 Programmer 类,那么就不必重写所有方法。但是如果匿名类继承了一个抽象类或者实现了一个接口,那么这个匿名类就必须实现所有没有实现的抽象方法。
  4. 在一个匿名内部类中你不能使用静态初始化,也没办法添加静态变量。
  5. 匿名内部类中可以有被 final 修饰的静态常量。

匿名类的典型使用场景:

  1. 临时使用:我们有时候需要添加一些类的临时实现去修复一些问题或者添加一些功能。为了避免在项目里添加java文件,尤其是仅使用一次这个类的时候,我们就会使用匿名类。
  2. UI Event Listeners:在java的图形界面编程中,匿名类最常使用的场景就是去创建一个事件监听器。比如:
button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
    }
});

上面的代码中,我们通过匿名类实现了 setOnClickListener 接口,当用户点击按钮的时候,就会触发我们实现的 onClick 方法。

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内部类是指在一个类的内部定义的另一个类。它可以访问外部类的成员变量和方法,并且可以使用外部类的私有成员。内部类可以分为成员内部类、局部内部类、静态内部类匿名内部类。 1. 成员内部类:成员内部类定义在一个类的内部的普通类,它与外部类的实例相关联。成员内部类可以访问外部类的所有成员,包括私有成员,而外部类也可以访问内部类的成员。 使用场景: - 当内部类需要访问外部类的成员,并且与外部类有密切的关联时,可以使用成员内部类。例如,一个汽车类中有一个引擎类作为成员内部类,引擎类可以访问汽车类的属性和方法。 2. 局部内部类:局部内部类定义在方法、代码块或构造函数内部的类,它只在定义它的作用域中有效。 使用场景: - 当需要在某个方法或代码块中创建一个只在该作用域中使用的类时,可以使用局部内部类。例如,在一个方法中需要定义一个辅助类来处理某个特定任务。 3. 静态内部类:静态内部类定义在另一个类中的静态类,它与外部类实例无关,可以直接通过外部类名访问。 使用场景: - 当内部类不需要访问外部类的实例,并且具有独立的功能时,可以使用静态内部类。例如,在一个图形计算类中定义一个静态内部类来表示点,点的坐标与图形计算类的实例无关。 4. 匿名内部类匿名内部类是没有名字的内部类,它通常作为参数传递给方法或构造函数。 使用场景: - 当需要定义一个简单的类来实现某个接口或继承某个类,并且该类只在使用它的地方使用时,可以使用匿名内部类。例如,在事件处理中,需要为按钮添加点击事件时可以使用匿名内部类来实现事件处理接口的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值