内部类是一个编译时的概念,一旦编译成功,就会成为两个完全不同的类。对于外部类Outer和内部类Inner编译完成后出现outer.class和outer$inner.class两类。所有内部类的成员变量和方法可以和外部相同。
- 成员内部类
成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。
要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的
public class Outer {
public static void main(String[] args) {
Outer outer = new Outer(); //创建外部类
Outer.Inner inner = outer.new Inner(); //创建内部类
inner.print("Outer.new");
inner = outer.getInner();
inner.print("Outer.get");
}
// 推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时
public Inner getInner() {
return new Inner();
}
public class Inner {
public void print(String str) {
System.out.println(str);
}
}
}
运行结果:
Outer.new
Outer.get
- 局部内部类
局部内部类,是指内部类定义在方法和作用域内
- 匿名内部类
- 静态内部类
class Out {
private static int age = 12;
static class In {
public void print() {
System.out.println(age);
}
}
}
public class Demo {
public static void main(String[] args) {
Out.In in = new Out.In();
in.print();
}
}
可以看到,如果用static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性
其次,因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类的对象(通过类名访问static,生不生成外部类对象都没关系)