内部类的分类
成员内部类、
局部内部类、
静态内部类、
匿名内部类(GUI中用到)
成员内部类
内部类和外部类的实例变量可以共存。 在内部类中访问实例变量:this.属性在内部类访问外部类的实例变量:外部类名.this.属性。
成员内部类的特点:
1.内部类作为外部类的成员,可以访问外部类的私有成员或属性。
2.编译出现outer.class和outer$inner.class两类。
3.成员内部类不能有静态属性和方法
在Outer类实例化: Inner in = new Inner() ;
在外面:Outer.Inner in = new Outer().new Inner() ;
局部内部类
在方法中定义的内部类称为局部内部类。 1.与局部变量类似,在局部内部类前不加修饰符public和private,其范围为定义它的代码块。 2.局部内部类不仅可以访问外部类实例变量,而且可以访问外部类的局部常量 3.在类外不可直接访问局部内部类(保证局部内部类对外是不可见的)。 在方法中才能调用其局部内部类。
4.方法里面实例化内部类,要在内部类定义之后
5.访问方法中的局部变量是,变量只能是final才能访问。
静态内部类
静态内部类定义在类中,任何方法外,用static定义。静态内部类只能访问外部类的静态成员。 生成(new)一个静态内部类不需要外部类成员:这是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成: Outer.Inner in=new Outer.Inner();
而不需要通过生成外部类对象来生成。这样实际上使静态内部类成为了一个顶级类。Outer.this.xxxx是访问对象变量的。。。。。。。
Outer.xxx访问静态变量
匿名内部类
匿名内部类是一种特殊的局部内部类,它是通过匿名类实现接口。 类和方法里面都可以定义IA被定义为接口。 IA I=new IA(){};
注:一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。 因其为局部内部类,那么局部内部类的所有限制都对其生效。 匿名内部类是唯一一种无构造方法类。 匿名内部类在编译的时候由系统自动起名Out$1.class。 如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。因匿名内部类无构造方法,所以其使用范围非常的有限。