Java基础学习系列,局部内部类
作者:adminjiang发布时间:2021-07-09分类:计算机教程浏览:564
What
局部内部类就是定义在某个方法内部的内部类,它的作用域仅限于这个方法。
Why
当我们在外围类中定义的内部类仅仅在某个方法中使用了一次,这种情况下,我们就可以选择去使用局部内部类。
How
以上节课的例子继续讲解,由于TestListener这个内部类仅仅在start方法中使用了一次,所以我们在这里可以使用局部内部类
public class InnerClassTest { private Integer times; private boolean beep; public InnerClassTest(Integer times, boolean beep) { this.interval = interval; this.beep = beep; }; public void start(){ class TestListener implements ActionListner { public void actionPerformed(ActionEvent event) { System.out.println("TestListener is running"); if (beep) { Tookit.getDefaultToolkit().beep(); } } } ActionListener listener = new TestListener(); Timer t = new Timer(times, listner); t.start(); } }
这里需要注意,局部类不可以使用public或者private访问修饰符进行声明,因为它作用域仅仅被限定在声明这个局部类的块中。
局部类有一个优势,它可以对外部世界完全的隐藏,即使他的外部类中的其他模块也不可以访问它,除了start方法以外,没有任何方法知道这个内部类的存在。
外部方法访问变量(进阶)
与其他的内部类相比,局部类还有一个其他内部类所不具备的有优点。它不仅可以访问包含它们的外部类,还可以访问局部变量,但是这些局部变量必须声明为final,它们一旦被赋值,就不能被改变。
下面我们接着来改变上面的那个栗子:
public void start(int times, boolean beep){ class TestListener implements ActionListner { public void actionPerformed(ActionEvent event) { System.out.println("TestListener is running"); if (flag) { Tookit.getDefaultToolkit().beep(); } } } ActionListener listener = new TestListener(); Timer t = new Timer(times, listner); t.start(); }
我们可以看到,外围类不在需要去存储实例变量beep了,它只是引用start方法中的参数。
接下来我们来深入了解这个方法的控制流程:
1.调用start方法
2.调用内部类的构造器,初始化对象变量listener
3.将listener引用传递给Timer构造器,定时器开始计时,start方法结束。此时,start方法中beep变量被回收。
4.然后actionPerformed方法执行if(beep)。
看到这里,我相信大部分人会有疑问,为什么beep变量被回收,但是actionPerformed方法仍然可以调用到这个方法?
实际上,内部类在beep域被释放之前将beep域用start方法中的局部变量进行备份,我们接下来来看一下反编译后的内部类,来证实我们的猜测:
class InnerClassTest$TestListener { public InnerClass$TestListener(InnerClassTest, boolean); public void actionPerformed(java.awt.event.ActionEvent); final boolean val$beep; final InnerClassTest this$0; }
请注意构造器的boolean参数和val$beep实例变量。当创建一个对象的时候,beep就会传递给构造器,并存储在val$beep域中。编译器必须检测对局部变量的访问,为每一个变量建立相应的数据域,并将局部变量拷贝到构造器中,以便将这些数据域初始化为局部变量的副本。
匿名内部类
匿名内部类其实就是对局部内部类的一个深化的应用,如果我们只是需要创建这个类的一个对象,那么我们完全不必去给这个类命名,这种类就被称为匿名内部类。
接下来,我们接着对上面的例子进行改编:
public void start(int times, boolean beep){ ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent event) { System.out.println("TestListener is running"); if (flag) { Tookit.getDefaultToolkit().beep(); } } } Timer t = new Timer(times, listner); t.start(); }
这段语句的含义是:创建一个实现ActionListener接口的类的新对象,需要实现的方法定义在括号内。
通用的语法格式是:
new SuperType(constrution params) { inner class methods and data }
其中SuperType既可以是接口,那么内部类就要去实现这个接口,它同样可以是一个类,那么内部类就要去扩展它。
由于构造器的名字必须与类名相同,但是匿名类并没有类名,所以,匿名类不能有构造器。取而代之的是,将构造器参数传递给父类构造器。尤其是在内部类实现接口的时候,不能有任何构造参数。
如果构造参数的闭小括号后跟的是单引号,那么就是在构造一个类的新对象,如果说构造参数的闭小括号后面跟一个开大括号,正在定义的就是匿名内部类。
静态内部类(仅供了解)
有时候,使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外部类对象。所以可以把内部类声明为static,以便取消产生的引用。
只有内部类可以声明为static,静态内部类的对象除了没有对生成它的外围类对象的引用特权外,与其他所有内部类完全一样。
与常规内部类不同的地方是,静态内部类可以有静态域和方法,声明在接口中的内部类自动生成static和public类。
广州北大青鸟依托北京大学雄厚资源,是北大青鸟华南地区就业示范校区,学校提供学历+技能+就业服务,主要开设热门课程java培训,UI设计培训,PHP培训,Web前端培训,软件开发编程培训等全程项目实战,免费就业推荐等,详情请点击右边的咨讯框咨询在线的老师,同时还可以获取免费的试听课程,欢迎咨询哦!!!
- 上一篇:Java工程师都要会什么
- 下一篇:佛山Java培训学习要多长时间才能工作
相关推荐
- 清远信息:2024年广清杯清远南粤家政技能大赛举行决赛|||计算机培训机构
- 汕尾信息:陈良川带队到汕尾技师学院调研|||计算机职业技能培训班
- 东莞信息:凤岗凤岗镇组织召开社保参保缴费及劳动用工政策宣讲会|||计算机软件培训学校
- 阳江信息:2024年度注册城乡规划师职业资格考试的合格标准是怎样的?|||计算机软件培训学校
- 阳江信息:职业技能提升补贴对象有哪些?|||大学生计算机培训学校
- 清远信息:清远市首家社保服务合作网点在清城区举办启动仪式|||计算机职业技能培训班
- 汕头信息:招聘658名中高端人才!2024年汕头市引进中高端人才专场招聘会举行|||北大青鸟计算机培训中心
- 东莞信息:广东省社保智能经办现场会在东莞召开|||大学生计算机培训学校
- 东莞信息:东坑镇举办2024年重点群体系列招聘活动|||计算机职业技能培训班
- 东莞信息:万江万江街道成功举办第四届粤菜师傅烹饪技能竞赛|||广州计算机编程培训
- 计算机教程排行
-
- 1汕头信息:“公共就业服务进校园”粤东专场在汕头大学举行|||计算机网络培训学校
- 2江门信息:构建和谐劳动关系优化提升营商环境江门市开展推进新时代和谐劳动关系创建活动|||广州学电脑培训学校
- 3汕头信息:2024年广东省公共就业服务进校园粤东片区专场活动诚邀各用人单位参会|||广州计算机编程培训
- 4广州中考成绩公布,高中阶段学校录取控制分数线公布,普高最低控制线502分
- 5清远信息:校企双向奔赴清远市人社部门携企赴省内外高校招才引智|||广州计算机编程培训
- 6江门信息:工伤保险缴费误区:最低工资非缴费基准,违规用人单位将面临法律风险!|||计算机软件培训学校
- 7惠州信息:2024年第一季度惠州人力资源市场供求情况|||北大青鸟计算机培训中心
- 8惠州信息:“惠州市就业驿站巡礼”之惠阳新圩站|||大学生计算机培训学校
- 9汕尾信息:世界技能大赛获奖选手全省巡回宣讲交流活动走进汕尾|||电脑计算机编程培训学校
- 标签列表
-
- Java (3694)
- 北大青鸟 (3713)
- 软件开发 (3613)
- JAVA (3413)
- UI设计入门 (2093)
- 惠州北大青鸟 (4375)
- 惠州IT培训 (2558)
- UI设计培训 (2090)
- 惠州UI设计培训 (2095)
- 惠州UI设计培训学校 (2090)
- 惠州计算机软件培训 (6260)
- 惠州计算件软件开发 (6260)
- 惠州计算机软件基础 (6261)
- 惠州计算机JAVA培训 (3574)
- 惠州计算机Java软件开发 (3620)
- 惠州计算机JAVA软件开发 (4645)
- 惠州计算机JAVA软件开发学校 (3338)
- 惠州计算机Java软件开发培训 (3338)
- 北大青鸟IT计算机学校 (5048)
- 北大青鸟IT软件学校 (5062)
- 北大青鸟IT学校 (5059)
- 惠州计算机UI设计软件开发 (2088)
- UI设计基础教程 (2088)
- UI设计是什么 (2088)
- UI设计教程 (2088)
- 网站分类
-
- 计算机教程
- 计算机入门
- 职业学校
- 新闻动态
- 专业课程
- 热门技术
- SEO
- 培训教程
- windows
- linux教程
- 系统集成
- 网站开发
- Html5
- 办公软件
- 师资力量
- 热点问答
- 联系我们
- 计算机学校
- 惠州计算机学校
- 河源计算机学校
- 广州计算机学校
- 深圳计算机学校
- 湛江计算机学校
- 佛山计算机学校
- IT计算机培训信息
- 设计专业
- UI
- 影视特效
- 游戏动漫设计
- Photoshop
- AI设计
- 软件教程
- Java技术
- C语言/C++语言培训
- C#
- Python技术
- PHP
- 数据库
- SQL Server
- 网络教程
- 网络安全
- 网络营销
- 软件专业
- 大数据专业
- 前端开发专业
- 软件测试专业
- Python专业
- 软件实施
- 珠海计算机学校
- 初中生学什么好
- 计算机认证
- 文章归档
-
- 2024年11月 (14)
- 2024年10月 (32)
- 2024年9月 (29)
- 2024年8月 (68)
- 2024年7月 (59)
- 2024年6月 (43)
- 2024年5月 (48)
- 2024年4月 (80)
- 2024年3月 (65)
- 2024年2月 (54)
- 2024年1月 (25)
- 2023年12月 (12)
- 2023年11月 (73)
- 2023年10月 (134)
- 2023年9月 (34)
- 2023年8月 (3)
- 2023年7月 (3)
- 2023年6月 (12)
- 2023年5月 (30)
- 2023年4月 (72)
- 2023年3月 (11)
- 2023年2月 (34)
- 2023年1月 (37)
- 2022年12月 (78)
- 2022年11月 (359)
- 2022年6月 (1193)
- 2022年5月 (570)
- 2022年4月 (1567)
- 2022年3月 (982)
- 2022年2月 (54)
- 2022年1月 (182)
- 2021年9月 (308)
- 2021年8月 (1704)
- 2021年7月 (2423)
- 2021年6月 (1806)
- 2021年5月 (1569)
- 2021年4月 (1380)
- 2021年3月 (1255)
- 2021年2月 (709)
- 2021年1月 (1521)
- 2020年12月 (3626)
- 2020年11月 (1646)
- 2020年10月 (1046)
- 2020年9月 (592)
- 最近发表
-
- 清远信息:2024年广清杯清远南粤家政技能大赛举行决赛|||计算机培训机构
- 汕尾信息:陈良川带队到汕尾技师学院调研|||计算机职业技能培训班
- 东莞信息:凤岗凤岗镇组织召开社保参保缴费及劳动用工政策宣讲会|||计算机软件培训学校
- 阳江信息:2024年度注册城乡规划师职业资格考试的合格标准是怎样的?|||计算机软件培训学校
- 阳江信息:职业技能提升补贴对象有哪些?|||大学生计算机培训学校
- 清远信息:清远市首家社保服务合作网点在清城区举办启动仪式|||计算机职业技能培训班
- 汕头信息:招聘658名中高端人才!2024年汕头市引进中高端人才专场招聘会举行|||北大青鸟计算机培训中心
- 东莞信息:广东省社保智能经办现场会在东莞召开|||大学生计算机培训学校
- 东莞信息:东坑镇举办2024年重点群体系列招聘活动|||计算机职业技能培训班
- 东莞信息:万江万江街道成功举办第四届粤菜师傅烹饪技能竞赛|||广州计算机编程培训