“简单不先于复杂,而是在复杂之后.” —— Alan Perlis
内部类
- 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性。
广泛意义上的内部类一般分为以下几种类型:
- 成员内部类
最普通的内部类,它定义在另一个类的内部,如下所示
//外部类
class Out {
private int age = 12;
//内部类
class In {
public void print() {
System.out.println(age);
}
}
}
public class NormalInnerClass {
public static void main(String[] args) {
Out.In in = new Out().new In();
in.print();
//或者采用下种方式访问
/*
Out out = new Out();
Out.In in = out.new In();
in.print();
*/
}
}
- 局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
interface extendInnerClass{
public int setAge();
}
//外部类
class Out {
private int age = 12;
public extendInnerClass getInnerClass(){
// 局部内部类
class innerClass implements extendInnerClass{
public int setAge(){
age++;
return age;
}
}
return new innerClass();
}
}
public class NormalInnerClass {
public static void main(String[] args) {
Out out = new Out();
System.out.println(out.getInnerClass().setAge());
}
}
注意,局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。
静态内部类
class Out3 {
private static int age = 12;
static class In {
public void print() {
System.out.println(age);
}
}
}
public class staticInnerClass {
public static void main(String[] args) {
Out3.In in = new Out3.In();
in.print();
}
}
可以看到,如果用static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性
其次,因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类的对象(通过类名访问static,生不生成外部类对象都没关系)
- 匿名内部类
匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。