Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类。内部类又分为:==成员内部类==、==局部内部类==、==匿名内部类== 和 ==静态内部类== 四种。
静态内部类
- 静态内部类的创建是不需要依赖于外围类的。
- 静态内部类不能使用任何外围类的非static成员变量和方法。
内部类内要创建静态内部类,此内部类也需要是要静态内部类
Outer.Inner in=new Outer.Inner();
匿名内部类
继承一个父类或者实现一个接口,例如Android中OnClickListener。
- 使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
- 匿名内部类中是不能定义构造函数的。
- 匿名内部类中不能存在任何的静态成员变量和静态方法。
- 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
- 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
public abstract class Bird {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract int fly();
}
public class Test {
public void test(Bird bird){
System.out.println(bird.getName() + "能够飞 " + bird.fly() + "米");
}
public static void main(String[] args) {
Test test = new Test();
test.test(new Bird() {
public int fly() {
return 10000;
}
public String getName() {
return "大雁";
}
});
}
}
在Test类中,test()方法接受一个Bird类型的参数,同时我们知道一个抽象类是没有办法直接new的,我们必须要先有实现类才能new出来它的实现类实例。所以在mian方法中直接使用匿名内部类来创建一个Bird实例。由于匿名内部类不能是抽象类,所以它必须要实现它的抽象父类或者接口里面所有的抽象方法。
成员内部类
- 成员内部类中不能存在任何static的变量和方法。
- 成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
局部内部类
嵌套在方法和作用于内的。