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{
 ......
} 
....
}

注:局部内部类,在定义的时候,不能用修饰符。


匿名内部类:在方法体中定义的没有类名的内部类,我们称之为匿名内部类。