1 package ClassUnit; 2 3 /** 4 * 可以在类的内部定义另外一个类,这种类就是所谓的嵌套类。嵌套类的作用域被限制在包含它的类之中。 5 * 因此,如果类B是在类A中定义的,那么类B不能独立于类A而存在。嵌套类可以访问包含它的类的成员, 6 * 包括私有成员。但是,包含类(包含嵌套类的类)不能访问嵌套类的成员。嵌套类直接在包含类中作为成员进行声明。 也可以在代码块中声明嵌套类。 7 * 嵌套类最重要的类型是内部类。内部类是非静态的嵌套类, 可以访问外部类的所有变量和方法,并且可以直接引用它们, 8 * 引用方式与外部类的其他非静态成员使用的方式相同。 9 * 嵌套类最重要的类型是内部类。内部类是非静态的嵌套类,可以访问外部类的所有变量和方法,并且可以直接引用它们,引用方式与外部类的其他非静态成员使用的方式相同。 10 * 下面的程序演示了如何定义和使用内部类。其中被命名为Outer 的类有一个名为 11 * out_x的实例变量,一个名为test()的实例方法,并且还定义了一个名为Inner 的内部类: 12 * 13 * @author Admin 14 * 15 */ 16 public class Outer { 17 int outer_x = 100; 18 19 void test() { 20 Inner inner = new Inner(); 21 inner.display(); 22 } 23 24 class Inner { 25 int y = 10; 26 27 void display() { 28 System.out.println("display:outer_x=" + outer_x); 29 } 30 } 31 32 /** 33 * 尽管我们一直主要关注的是, 34 * 在外部类的作用域内作为成员声明的内部类,但是也可以在任何代码块的作用域内定义内部类。例如,可以在由方法定义的代码块中,甚至在 35 * for 循环体内定义嵌套类,如下面这个程序所示: 36 */ 37 void innerNewTest() { 38 for (int i = 0; i < 10; i++) { 39 class Inner1 { 40 void display() { 41 System.out.println("Inner1.display:Outer_x=" + outer_x); 42 } 43 } 44 45 Inner1 inner = new Inner1(); 46 inner.display(); 47 } 48 } 49 50 void showy() { 51 /** 52 * 只能在Outer类的作用域内创建Inner类的实例,认识到这一点很重要。如果试图在Outer类之外的任何代码中实例化Inner类, 53 * Java编译器就会生成错误。一般来说,必须通过封闭的作用域创建内部类的实例,如上面的示例所示。 54 * 正如所解释的,内部类可以访问外部类的所有成员,但是反过来不可以。内部类的成员只有在内部类的作用域内才是已知的,并且外部类不能使用。 55 */ 56 // 在此,y被声明为Inner类的实例变量。因此,在Inner类的外部不知道y,并且showy)方法也不能使用它。 57 // System.out.println(y); //error.y not known here ! 58 } 59 } 60 61 62 63 64 65 66 package ClassUnit; 67 68 public class InnerClassDemo { 69 public static void main(String[] arg) { 70 /** 71 * 在这个程序中,被命名为Inner的内部类是在Outer类的作用域内定义的。所以,Inner类中的所有代码,都可以直接访问变量 outer_x。在 72 * Inner类中定义了一个名为displayO)的实例方法,该方法在标准输出流上显示 outer_xoInnerClassDemo类的 73 * main()方法创建了 Outer类的一个实例,并调用这个实例的test()方法。该方法创建Inner类的一个实例,并调用display0)方法。 74 */ 75 Outer o = new Outer(); 76 o.test(); 77 o.innerNewTest(); 78 /** 79 * ---------输出结果:------------------------------ 80 * display:outer_x=100 81 * Inner1.display:Outer_x=100 Inner1.display:Outer_x=100 82 * Inner1.display:Outer_x=100 Inner1.display:Outer_x=100 83 * Inner1.display:Outer_x=100 Inner1.display:Outer_x=100 84 * Inner1.display:Outer_x=100 Inner1.display:Outer_x=100 85 * Inner1.display:Outer_x=100 Inner1.display:Outer_x=100 86 * ----------------------------------------------------- 87 * 尽管嵌套类并不是对于所有情况都适用,但是当处理事件时它们特别有用。在弟 24 88 * 章我们会继续讨论这个主题。在那儿将会看到,如何使用内部类简化处理特定类型的事件所需要的代码,还将学习有关匿名内部类的内容,匿名内部类是没有名称的内部类。最后一点:最初的Java 89 * 1.0规范不支持嵌套类。嵌套类这一特性是在Java 1.1规范中引入的。 90 * 91 */ 92 } 93 } 94