在一个类中定义另外一个类,这个类就叫做内部类或者内置类(inner class)。内部类可以让我们将逻辑上相关的一组类组织起来,并由外部类(outer class)来控制内部类的可见性。当我们建立一个inner class时,其对象就拥有了与外部类对象之间的一种关系,这是通过一个特殊的this reference形成的,使得内部类对象可以随意的范文外部类中所有的成员。
内部类结论:
1、内部类是一个单独的类,在内部类当中可以访问外部类当中的私有变量。
2、内部类访问属性的顺序是,先搜索内部类属性域,再搜索外部类属性域。
3、内部类的特殊语法规则:
- 访问外部类属性的语法为OuterClass.this.Property,访问内部类属性的语法为this.Property(当然,如果没有冲突,则不需要加前缀,直接Property就可以了)。
- 在外部类作用域之外,可以这样引用内部类:OuterClass.InnerClass,意思是,在外部类之外也可以定义一个内部类的对象,具体可以参见实例代码,关键点在于,在外部类之外的类需要继承外部类,才能定义内部类的对象。
4、在外部类作用域之外,不能直接访问内部类,要产生一个内部类,必须先初始化一个外部类。
5、可以在方法中定义内部类,如果要访问方法中定义的本地变量或者方法的参数,则变量或方法的参数必须定义为final。不过,此内部类可以直接访问外部类的方法。
6、内部类可以声明为private或protected;还可以声明为abstract或final。
7、若内部类声明为静态类,则只能访问外部类的静态变量和静态方法。
8、非静态的内部类是不能定义任何一个静态方法的。
内部类的例子代码,包含了以上内部类的结论:
class OuterClass
{
private int TestInt=32767;
//非静态内部类
class InnerClass
{
public InnerClass()
{
//内部类可以访问外部类的任何内容(通过特殊的this指针),如果内部类的属性或方法名与外部类冲突,则优先使用内部类中的定义。
System.out.println("这里是非静态内部类,获取外部类的私有变量的值:TestInt="+TestInt);
}
}
/*静态内部类
* 静态内部类只能调用外部类中的静态属性和静态方法
*/
static class InnerStaticClass
{
public static void About()
{
System.out.println("这里是静态内部类,被外部类直接调用。");
}
}
//final型的方法,供局部内部类调用
private void FunctionClassTest()
{
System.out.println("这里是外部类的方法FunctionClassTest,被局部内部类调用。");
}
public void showMessage()
{
final int a=0;
int b=1;
//局部内部类,访问方法中定义的本地变量或者方法的参数,需要把变量或方法的参数声明为final,如果访问外部类的方法,则可以直接调用。
class FunctionClass
{
public FunctionClass()
{
System.out.println("这里是局部内部类,定义在showMessage方法中,访问方法中定义的本地变量或者方法,需要把变量或方法声明为final。");
System.out.println("这里是局部内部类,访问本方法中的final类型的a变量:a="+a);
FunctionClassTest();
}
}
//创建局部类对象
new FunctionClass();
//调用静态类中的静态方法
InnerStaticClass.About();
}
}
public class InnerClassExercise extends OuterClass{
/**
* @param args
*/
public static void main(String[] args){
/*在与OuterClass无关的类中创建OuterClass类中的内部类InnerClass的对象。
* 注意,在上面还必须继承OuterClass类,即: extends OuterClass。
*/
InnerClass A=new OuterClass().new InnerClass();
OuterClass B=new OuterClass();
B.showMessage();
}
}