此篇和上一篇的“使用抽象类”方式相互印证。
/**
* 匿名内部类的概念和特性:
* 1、匿名内部类只能也必须(有且仅有)继承一个父类或者实现一个接口,也可以重写父类普通方法;
* 2、匿名内部类不能是抽象类,因为定义匿名内部类时立即生成对象,而抽象类不允许生成对象;
* 3、匿名内部类没有类型,所以不能显式定义构造器,有一个隐式的无参构造器;
* 4、匿名内部类可以定义初始化块以初始化对象,以弥补没有构造器的缺陷;
* 5、最常用的匿名内部类的形式是:创建某个接口/抽象类的对象;
* 6、定义之后必须马上使用,没办法通过引用进行使用;
* 7、在匿名内部类和局部内部类中被访问到的局部变量,Java8之后默认为有final修饰,不可以重新赋值;
*/
定义一个接口:关于校园活动
1 public interfaceICampusActivity {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 classTest {2 public static voidmain(String[] args) {3 int locationVar = 100;4 //locationVar = 1000;//代码1
5 AnonymousClassac = newAnonymousClass();6 ac.test(new ICampusActivity() { //创建一个匿名内部类,需要实现接口/抽象类所有的抽象方法
7 {8 System.out.println("匿名内部类的初始化块");9 }10 @Override11 public intgetStuNumber() {12 return 15 +locationVar;13 }14
15 @Override16 publicString getProject() {17 return "马拉松训练";18 }19 });20 }21 }
特别说明:如果“代码1"处的赋值语句没有被注释,则第12行会报错,参考本文开始处第7点!
输出结果:
变体:其实可以定义一个接口的实现类,然后把这个实现类传给那个test方法作为参数:
1 class implClass implementsICampusActivity {2 @Override3 publicString getProject() {4 return "马拉松训练";5 }6
7 @Override8 public intgetStuNumber() {9 return 15;10 }11 }
然后把这个类的一个实例传给test方法:
ac.test(new implClass());
效果是一样的!!!
欢迎各路大神多多评论,指教!