Java语言允许在A类内部定义一个B类,我们就把这个B类称为嵌套类(Nested Classes)。
嵌套类分为两种:一种为静态嵌套类(Static Nested Classes),另一种是非静态嵌套类(Non-static Nested Classes),也就是我们常说的“内部类(Inner Classes)”。
嵌套类的定义形式:
public class OuterClass{
......
<public / protected/ private><static> NestedClass{
......
}
}
为何我们要用嵌套类?总结以下两点:
1、如果A类仅仅在为B类提供方便,我们就把A类定义为B类的一个内部类,这样逻辑上将类与类之间的关系紧密联系起来了,有利于代码的维护;
2、充分表现了面向对象程序设计的封装性特点,如果我们将A类定义为B类的内部类,那么可以达到如下效果:A类不但可以访问B类的成员或方法(甚至私有成员都可以访问),而且对于同一个包中其他类来说,内部类能够很好地隐藏起来。
注意事项:
1、内部类在事件处理方面应用广泛,可以非常方便地编写事件驱动程序,而不用写很多代码。
一、静态嵌套类(Static Nested Classes)
静态嵌套类不能访问外部类的成员变量和成员方法。
可以使用以下形式访问静态嵌套类:OutClass.StaticNestedClass ;
可以使用以下方式为静态嵌套类创建一个实例:OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
二、’内部类(Inner Classes)
内部类有三种:成员内部类、局部内部类和匿名内部类。
内部类作为外部类的成员,它可以直接访问外部类的所有变量和方法。但是,由于内部类与实例相关联,所以不能定义静态变量或静态方法。
创建内部类的实例:OuterClass.InnerClass innerObject = outerObject.new InnerClass();
成员内部类:它就如同外部类的成员变量和成员方法,在外部类体中定义的内部类,是外部类的一个成员类。
局部内部类:在方法体中定义的内部类,称为局部内部类。
public void method(){
NestedClass{
......
}
....
}
注:局部内部类,在定义的时候,不能用修饰符。
匿名内部类:在方法体中定义的没有类名的内部类,我们称之为匿名内部类。