在Java中,可以定义嵌套类,这是一种在其他类中声明的类.坦率的讲,嵌套类是一个比较高级的话题.事实上,在第一版Java中并没有嵌套类,直到Java1.1才添加.然而,了解他们以及使用他们的机制是十分重要的,因为嵌套类在许多实际程序中扮演了重要的角色.
嵌套类不是独立于包含他的类而存在的,因此,嵌套类的作用域就局限在他的外层类中.直接在封装类中声明的嵌套类是封装类的成员.另外,还可以在代码块中声明嵌套类.
嵌套类有两种基本类型:带有static修饰符和不带static修饰符的.我们只关心非静态类型.这种类型的嵌套类也称为内部类.他有权访问其外层类的所有变量和方法,可以像外层类的其他非静态成员那样直接引用他们.
有时内部类用于提供一系列只为封装类使用的服务.下面是一个使用内部类为封装类计算不同值的示例:
public class test2 { // @param args public static void main(String args[]) { int x[] = {1,2,3,4,5,6}; Outer outOb = new Outer(x); outOb.analyze(); } } class Outer { int nums[]; Outer(int n[]) { nums = n; } void analyze() { Inner inOb = new Inner(); System.out.println("Minimum : "+inOb.min()); System.out.println("Maximum : "+inOb.max()); } class Inner { int min() { int m = nums[0]; for(int i=1;i<nums.length;i++) if(nums[i]<m) m=nums[i]; return m; } int max() { int m = nums[0]; for(int i=1;i<nums.length;i++) if(nums[i]>m) m=nums[i]; return m; } } }
输出:
Minimum : 1 Maximum : 6
在本例中,内部类Inner计算来自数组nums(Outer的成员)的不同值.如上所述,内部类有权访问封装类的成员,所以Inner直接访问nums数组是完全可以的.当然,反之则不正确.例如,如果不创建Inner对象,analyze()就无法直接调用min()方法.
问:静态嵌套类与非静态嵌套类的区别是什么?
答:前台嵌套类是使用static修饰符的类.因为是静态的,所以只能访问封装类中的其他静态成员.访问外部类成员时,必须通过对象应用来进行.