之前总结内部类的使用时讲过匿名内部类的使用,但讲得不够详细,这次再总结一下,方便以后复习
一.匿名内部类的创建
new 父类构造器(参数列表)| 实现接口(){
//匿名内部类的类体部分
}
当然,这里还可以创建一个父类的引用指向匿名内部类对象
父类名|接口名 引用变量 = new 父类构造器(参数列表)| 实现接口(){
//匿名内部类的类体部分
}
但是一般没必要这么做,第一种会更加简洁
二.匿名内部类实例
下面看四个简单例子,通过这四个例子可以对匿名内部类的写法有个全面的认识
程序一:(该例没有使用匿名内部类)
abstract class Person{
public abstract void eat(); //抽象方法默认为public
}
class Student extends Person{
public void eat(){
System.out.println("eat something");
}
}
public class AnonymousInnerClassDemo01{
public static void main(String[] args){
Student std = new Student();
std.eat();
}
}
程序二:(通过第一种方式创建匿名内部类)
abstract class Person{
public abstract void eat(); //抽象方法默认为public
}
public class AnonymousInnerClassDemo03{
public void print(Person p){
p.eat();
}
public static void main(String[] args){
AnonymousInnerClassDemo03 aic = new AnonymousInnerClassDemo03();
aic.print(new Person(){
public void eat(){
System.out.println("eat something");
}
});
}
}
程序三:(第一种方式的另一种写法,这种写法会创建一个类,跟程序二原理一样)
abstract class Person{
public abstract void eat(); //抽象方法默认为public
}
class Demo{
public void print(Person p){
p.eat();
}
}
public class AnonymousInnerClassDemo04{
public static void main(String[] args){
Demo d = new Demo();
d.print(new Person(){
public void eat(){
System.out.println("eat something");
}
});
}
}
程序四:(通过第二种方式创建匿名内部类)
abstract class Person{
public abstract void eat(); //抽象方法默认为public
}
public class AnonymousInnerClassDemo02{
public static void main(String[] args){
Person p = new Person(){
public void eat(){
System.out.println("eat something");
}
};
p.eat();
}
}
其实,程序一就是另外几个程序的拆分形式
三.匿名内部类注意点
1.使用匿名内部类我们必须要继承一个父类或者实现一个接口,当然也仅能只继承一个父类或者实现一个接口
2.匿名内部类仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,该类的定义会立即消失,所以匿名内部类不能重复使用
3.匿名内部类不能是抽象类,所以它必须要实现它的抽象父类或者接口里面所有的抽象方法
4.匿名内部类中不能定义构造函数,但可以用构造代码块初始化
5.匿名内部类不能存在任何的静态成员变量和方法,以前的博客中也说过
参考链接:
http://blog.csdn.net/chenssy/article/details/13170015#comments
http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html