Java内部类之匿名内部类(实现接口,附详细代码示例)

此篇和上一篇的“使用抽象类”方式相互印证。

    /**
     * 匿名内部类的概念和特性:
     * 1、匿名内部类只能也必须(有且仅有)继承一个父类或者实现一个接口,也可以重写父类普通方法;
     * 2、匿名内部类不能是抽象类,因为定义匿名内部类时立即生成对象,而抽象类不允许生成对象;
     * 3、匿名内部类没有类型,所以不能显式定义构造器,有一个隐式的无参构造器;
     * 4、匿名内部类可以定义初始化块以初始化对象,以弥补没有构造器的缺陷;
     * 5、最常用的匿名内部类的形式是:创建某个接口/抽象类的对象;
     * 6、定义之后必须马上使用,没办法通过引用进行使用;
     * 7、在匿名内部类和局部内部类中被访问到的局部变量,Java8之后默认为有final修饰,不可以重新赋值;
     */

定义一个接口:关于校园活动

1 public interface ICampusActivity {
2     public abstract String getProject();  //获取活动项目
3     public abstract int getStuNumber();  //获取活动人数
4 }

定义一个使用到这个接口的类:

1 public class AnonymousClass{  //定义一个类
2     public void test(ICampusActivity ca) {   //test方法需要一个接口类型作为参数
3         System.out.println("正在进行的活动是:" + ca.getProject());
4         System.out.println("参加活动的人数是:" + ca.getStuNumber());
5     }
6 }

定义一个测试类:

 1 public class Test {
 2     public static void main(String[] args) {
 3         int locationVar = 100;
 4 //        locationVar = 1000;  //代码1
 5         AnonymousClassac = new AnonymousClass();
 6         ac.test(new ICampusActivity() { // 创建一个匿名内部类,需要实现接口/抽象类所有的抽象方法
 7             {
 8                 System.out.println("匿名内部类的初始化块");
 9             }
10             @Override
11             public int getStuNumber() {
12                 return 15 + locationVar;
13             }
14 
15             @Override
16             public String getProject() {
17                 return "马拉松训练";
18             }
19         });
20     }
21 }

特别说明:如果“代码1"处的赋值语句没有被注释,则第12行会报错,参考本文开始处第7点!

输出结果:

 

 

 

变体:其实可以定义一个接口的实现类,然后把这个实现类传给那个test方法作为参数:

 1 class implClass implements ICampusActivity {
 2     @Override
 3     public String getProject() {
 4         return "马拉松训练";
 5     }
 6 
 7     @Override
 8     public int getStuNumber() {
 9         return 15;
10     }
11 }

然后把这个类的一个实例传给test方法:

ac.test(new implClass());

效果是一样的!!!

 

欢迎各路大神多多评论,指教!

posted @ 2019-10-18 09:33  Viking_牧马人  阅读(3008)  评论(0)    收藏  举报