/**PageBeginHtml Block Begin **/ /***自定义返回顶部小火箭***/ /*生成博客目录的JS 开始*/ /*生成博客目录的JS 结束*/

内部类

  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 
posted @ 2021-07-21 12:38  一品堂.技术学习笔记  阅读(39)  评论(0编辑  收藏  举报