匿名内部类
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
注意:
-
匿名内部类不能定义任何静态成员、方法。
-
匿名内部类中的方法不能是抽象的;
-
匿名内部类必须实现接口或抽象父类的所有抽象方法。
-
匿名内部类访问的外部类成员变量或成员方法必须用static修饰;
例子
- 定义一个接口
public interface Clac {
public abstract int sum(int a, int b);
}
- 在没有使用匿名内部类时,需要定义一个类来实例化接口才能使用,如:
//实例化接口
public class Clacc implements Clac {
@Override
public int sum(int a, int b) {
// TODO Auto-generated method stub
return a + b;
}
}
public class NoNameMethon {
public static void main(String[] args) {
Clac clac = new Clacc();
int sum = clac.sum(10, 20);
System.out.println("a+b的结果是:"+sum);
}
}
运行结果是30
- 使用匿名内部类
public class NoNameMethon {
public static void main(String[] args) {
Clac clac = new Clac() {
@Override
public int sum(int a, int b) {
// TODO Auto-generated method stub
return a + b;
}
};
int sum = clac.sum(10, 20);
System.out.println("a+b的结果是:"+sum);
}
}
运行结果是30
匿名内部类构造的特点:
- 匿名内部类也就是没有名字的内部类,无class关键字,直接使用new来生成一个对象的引用正因为没有名字,所以匿名内部类只能使用一次。
- 匿名内部类还有个前提条件:必须继承一个父类(抽象类,普通类)或实现一个接口(两者不可兼得,并且只能是一个),它相当于一个具体类(只是没有名字),所以可以使用new。
- 使用匿名内部类定义回调函数,节省代码。
- 不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。 无构造函数,使用构造(空白)代码块进行初始化。