在类中再定义一个类,则将在类中再定义的那个类称为内部类;
内部类可分为成员内部类、局部内部类、匿名类
1、成员内部类
在内部类中可以随意使用外部类的成员方法以及成员变量,尽管这些类成员被修饰为private;
但内部类的成员只有在内部类的范围之内是可知的,不能被外部类使用
内部类的对象实例化操作必须在外部类
使用this关键字获取内部类与外部类的引用
public class TheSameName{ private int x; private class Inner{ private int x=9; public void doit(int_x){ x++; //调用的是形参x this.x++; //调用内部类的变量x TheSameName.this.x++; //调用外部类的变量x } } }
2、局部内部类
interface OutInterface2{ } class OuterClass3{ public OutInterface2 doit(final String x){ class InnerClass2 implements OutInterface2{ InnerClass2(String s){ s=x; System.out.println(s); } } return new InnerClass2("doit"); } }
内部类被定义在了doit()方法内部,内部类InnerClass2是doit()方法的一部分,并非OuterClass3类中的一部分,所以在doit()方法的外部不能访问该内部类,但是该内部类可以访问当前代码快的常量以及外部类的所有成员。
3、匿名内部类
匿名类的所有实现代码都需要在大括号之间进行编写
return new A(){ ...//内部类体 };
匿名内部类没有名称,实质上这种内部类的作用就是创建一个实现于OutInterface2接口的匿名类的对象:
class OuterClass4{ public OutInterface2 doit(){ return new OutInterface2(){ private int i=0; public int getValue(){ return i; } }; //这个分号并不是代表定义内部类结束的标识,而是代表创建OuterInterface2引用表达式的标识 } }
4、静态内部类
在内部类前添加修饰符static,这个内部类就变成静态内部类了;
一个静态内部类中可以声明static成员,但是在非静态内部类中不可以声明静态成员;
静态内部类不可以使用外部类的非静态成员;
5、内部类的继承
public class OutputInnerClass extends ClassA.ClassB{ //继承内部类ClassB public OutputInnerClass(ClassA a){ a.super(); } } class ClassA{ class ClassB{ } }
在某个类继承内部类时,必须硬性给予这个类一个带参数的构造方法,并且该构造方法的参数为需要继承内部类的外部类的引用,同时在构造方法中使用a.super()语句,这样才能为继承提供了必要的对象引用。