一.什么是嵌套类和内部类
可以在一个类内部定义另一个类。 该类称为“嵌套类”(nested classes ),有两种类型:静态嵌套类和非静态嵌套类。 很少使用静态嵌套类,最重要的是非静态嵌套类,即称为内部类(inner )。 嵌套类是从JDK1.1引入的。 inner类分为以下三类:
其一,由一个类(外部类)直接定义的内部类
其二,由一种方法(外部类方法)定义的内部类
其三,匿名内部类。
接下来,我们将讨论这些嵌套类的使用和注意事项。
二.静态嵌套类
以下代码定义静态嵌套类。
公共类静态测试{
私有状态名称=' Java John ';
私有字符串id=' x001 ';
静态类人员{
私有字符串地址=' swjtu,chenDu,China ';
公共字符串邮件=' josserchai @ Yahoo.com '; //内部类的公共成员
公共语音显示(
//system.out.println(id; //无法直接访问外部类的非静态成员
system.out.println(name; //只能直接访问外部类的静态成员
system.out.println (inner ' address; //访问本内部类的成员。
}
}
公共语音打印机(
人员人员=新人员(;
person.display (;
//system.out.println(mail ); //无法访问
//system.out.println(address ); //无法访问
系统. out.println (person.address; //可以访问内部类的私有成员
系统. out.println (person.mail; //可以访问内部类的公共成员
}
publicstaticvoidmain (字符串[ ] args ) {
staticteststatictest=newstatictest (;
staticTest.printInfo (;
}
}
在静态嵌套类内部,无法访问外部类的非静态成员。 这受Java语法的“静态方法无法直接访问非静态成员”限制。 要访问外部类的变量,必须用其他方法解决。 因此,很少使用静态嵌套类。 请注意,外部类访问内部类的成员是特殊的,不能直接访问,但静态嵌套中的所有成员和方法默认为静态的,因此可以从内部类访问。 另外,请注意,内部静态类Person仅在类StaticTest的范围内显示,在其他类中引用或初始化时会出错。
三.在外部类中定义内部类
以下代码在外部类中定义两个内部类及其调用关系。
公共类输出器{
int outer_x=100;
类inner {
公共int y=10;
私密int z=9;
int m=5;
公共语音显示(
system.out.println (display outer_x : ) outer _ x );
}
私密void显示2 (
system.out.println (display outer_x : ) outer _ x );
}
}
voidtest(}
Inner inner=new Inner (;
inner.display (;
inner.display2(;
//system.out.println (innery : ) y ); //无法访问内部变量
system.out.println(innery: ) inner.y ); //可以访问
system.out.println(innerz: ) inner.z ); //可以访问
system.out.println(innerm: ) inner.m ); //可以访问
InnerTwo innerTwo=new InnerTwo (;
innerTwo.show (;
}
class InnerTwo{
Inner innerx=new Inner (;
公共void show () }
//system.out.println(y; 无法访问Innter的y成员
//system.out.println(inner.y ); 不要直接访问Inner成员和方法
innerx.display (; //可以访问
innerx.display2(; //可以访问
系统. out.println (innerx.y; //可以访问
system.out.println(innerx.z; //可以访问
系统. out.println (innerx.m; //可以访问
}
}
publicstaticvoidmain (string args [ ] ) {
Outer outer=new Outer (;
outer.test (;
}
}
需要对上述代码进行说明。 对于内部类,通常在定义类的class关键字之前不使用public或private等修饰符。 如果添加也不会产生任何影响,同时这些修饰符似乎也不会影响内部类的变量或方法(请参见。 另外,请注意,内部类Inner和InnterTwo仅在类Outer的范围内是已知的,如果非类Outer代码尝试初始化或使用类Inner,则编译不会通过。 此外,内部类的变量成员只能在内部查看,如果需要访问外部类或同一层次的内部类,则必须采用示例程序方法,而不能直接访问内部类的变量。