内部类
* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。
* @author Alan
* @Email no008@foxmail.com
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
为人:谦逊、激情、博学、审问、慎思、明辨、 笃行
学问:纸上得来终觉浅,绝知此事要躬行
为事:工欲善其事,必先利其器。
态度:道阻且长,行则将至;行而不辍,未来可期
.....................................................................
------- 桃之夭夭,灼灼其华。之子于归,宜其室家。 ---------------
------- 桃之夭夭,有蕡其实。之子于归,宜其家室。 ---------------
------- 桃之夭夭,其叶蓁蓁。之子于归,宜其家人。 ---------------
=====================================================================
* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。 * @author Alan -liu * @Email no008@foxmail.com
转载请标注出处! ✧*꧁一品堂.技术学习笔记꧂*✧. ---> https://www.cnblogs.com/ios9/
学问:纸上得来终觉浅,绝知此事要躬行
为事:工欲善其事,必先利其器。
态度:道阻且长,行则将至;行而不辍,未来可期
.....................................................................
------- 桃之夭夭,灼灼其华。之子于归,宜其室家。 ---------------
------- 桃之夭夭,有蕡其实。之子于归,宜其家室。 ---------------
------- 桃之夭夭,其叶蓁蓁。之子于归,宜其家人。 ---------------
=====================================================================
* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。 * @author Alan -liu * @Email no008@foxmail.com
转载请标注出处! ✧*꧁一品堂.技术学习笔记꧂*✧. ---> https://www.cnblogs.com/ios9/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?