Java匿名内部类
匿名内部类基本知识与用法
匿名内部类,是一个没有类名的类,通常用在当一个继承父类或者实现接口的类只需要用一次的时候,用来简化代码编写。总结一下匿名内部类有几个基本点:
*继承父类或者实现接口或者实现抽象类
*匿名内部类用new来生成一个继承父类的对象的引用,因此可以用来作为参参数传递
*匿名内部类只能使用一次利用代码来测试继承父类、实现接口、实现抽象类的用法
abstract class afather {
public abstract void eat();
}
class father {
public void eat(){
System.out.println("eat person");
}
}
interface ifather{
public void eat();
}
class Child extends father {
public void eat() {
System.out.println("eat child");
}
}
public class Test {
public static void main(String[] args) {
//非匿名内部类的用法
father fc = new Child();
fc.eat();
//继承父类的匿名内部类
father f = new father(){
public void eat(){
System.out.println("eat nonameinnerclass");
}
};
f.eat();
//实现抽象类的匿名内部类
afather af = new afather(){
public void eat(){
System.out.println("eat afather");
}
};
af.eat();
//实现接口的匿名内部类
ifather ifa = new ifather(){
public void eat(){
System.out.println("eat interface");
}
};
ifa.eat();
}
}
运行结果:
eat child
eat nonameinnerclass
eat afather
eat interface
- 利用代码测试匿名内部类作为参数传递
abstract class afathers {
public abstract void eat();
}
class others{
public void getafather(afathers a){
a.eat();
}
}
public class Test2 {
public static void main(String[] args) {
// 相当于传递了一个实现afathers类的子类的引用
new others().getafather(
new afathers(){
public void eat(){
System.out.println("eat");
}
}
);
}
}
一些注意事项
在使用匿名内部类的过程中,我们需要注意如下几点:
1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
2、匿名内部类中是不能定义构造函数的。
3、匿名内部类中不能存在任何的静态成员变量和静态方法。
4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
2.内部类使用参数必须是final类型
原因:内部类并不是直接使用的外部的参数,而是编译时有自己单独的.class文件,也就是说它是拷贝了一份参数,为了避免参数改变,造成数据不一致,要求数据必须是final类型
参考:[http://android.blog.51cto.com/268543/384844]
3.匿名内部类初始化
匿名内部类没有构造器,一般使用静态代码块来完成初始化操作。