zoukankan      html  css  js  c++  java
  • 内部类

      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 
    为人:谦逊、激情、博学、审问、慎思、明辨、 笃行
    学问:纸上得来终觉浅,绝知此事要躬行
    为事:工欲善其事,必先利其器。
    态度:道阻且长,行则将至;行而不辍,未来可期
    转载请标注出处!
  • 相关阅读:
    toodifficult 题解
    Code Chef February Challenge 2019题解
    LOJ#3085. 「GXOI / GZOI2019」特技飞行(KDtree+坐标系变换)
    LOJ#3084. 「GXOI / GZOI2019」宝牌一大堆(递推)
    LOJ#3083. 「GXOI / GZOI2019」与或和(单调栈)
    LOJ#6046. 「雅礼集训 2017 Day8」爷(分块)
    LOJ#6045. 「雅礼集训 2017 Day8」价(最小割)
    LOJ#6044. 「雅礼集训 2017 Day8」共(Prufer序列)
    BZOJ4766: 文艺计算姬(Prufer序列)
    BZOJ3729: Gty的游戏(伪ETT)
  • 原文地址:https://www.cnblogs.com/ios9/p/15038968.html
Copyright © 2011-2022 走看看