java8 内部类_Java8基础知识(五)内部类
内部类
内部类是定义在类中的类,其主要优点如下:
内部类方法可以访问定义所在类中的数据。
内部类可以对同一个包中其他类隐藏。
可以快捷地定义回调函数。
特殊语法
外围类引用OuterClass.this表示内部类对外围类的引用。
相反地,outerObject.new InnerClass(construction parameters)用于编写内部类的构造器。
在外围类的作用域之外,通过OuterClass.InnerClass引用内部类。
内部类中声明的所有静态域都必须是final。
内部类不应有静态方法。
内部类机制
在编译时,编译器将内部类翻译为用$分隔外部类名与内部类名的常规类文件,这导致虚拟机无法辨别。
但实际上,内部类又比常规类有更大的访问权限。这是因为编译器在外围类添加静态方法,将返回作为参数传递给它的对象域。内部类将调用这些静态方法,以获取外围类的变量的值。
这种机制实际上存在一定的安全隐患,可以在外围类的包中创建一个用虚拟机指令调用编译器添加的静态方法的类文件,以此来读取外围类的私有变量。当然,这种攻击方式十分困难。
局部内部类
与成员内部类不同,局部内部类定义在方法之中,不能使用public或private声明,其作用域被限定在声明该局部类的块中。这样的声明可以将局部内部类隐藏,使得仅在这个块中可以访问它。
局部内部类还可以访问声明为final的局部变量,这个特点和lambda表达式的最终变量是类似的。
注意:若要让局部内部类访问局部变量,编译器会为其构造器添加局部变量的类型作为参数,同时在局部内部类中添加局部变量的final类型副本(这是一个新的变量)。
匿名内部类
若一个内部类只创建一个对象,则不需要为其命名,称其为匿名内部类。
匿名内部类的语法格式通常如下:
new SuperType(construction parameters) {
inner class methods and data
}
匿名内部类可以用于实现事件监听器和其他回调,但更应使用lambda表达式作为代替,可读性和简洁性更强。
注:在静态方法中直接调用getClass方法是不奏效的。因为调用getClass实际是调用this.getClass,但静态方法没有this参数。因此可以建立Object的匿名子类的匿名对象,通过getEnclosingClass来获取外围类。
// 该表达式可以获取包含静态方法的类
new Object(){}.getClass().getEnclosingClass()
静态内部类
当隐藏的内部类不需要引用外围类对象时,可以将其声明为static,称其为静态内部类。
由于静态内部类不引用其他对象,静态内部类没有对生成它的外围类对象的引用特权,其余和其他内部类一样。
java8 内部类_Java8基础知识(五)内部类相关推荐
- JavaSE基础知识(五)--面向对象代码实现初步(实现一个简单的类类型代码)
Java SE 是什么,包括哪些内容(五)? 本文内容参考自Java8标准 一.面向对象(代码实现): 首先,在这里我需要说明一个根本性的问题:实际上,面向对象编程包括了两部分,一个是你的编程思想,一 ...
- git 分支复制_Git基础知识(五)
Git基础知识(五) 分支 都说Git的分支是它的必杀技特性,由于没有接触过太多的版本管理工具,就使用过的SVN来说,两者真的差别巨大.SVN创建一个分支,需要将内容复制一遍!这个时间真的是非常的漫长 ...
- C# 基础知识 (五).变量类型和字符串处理
这篇文章是阅读<C#入门经典(Beginning C#)>书籍里面的内容,作者Karli Watson.主要包括自己缺乏的一些C#基础知识和在线笔记使用,文章主要包括C#简 ...
- Java基础知识(五) 字符串与数组
Java基础知识 字符串与数组 1. 字符串的创建与存储的机制是什么 2. "==".equals和hashCode有什么区别 3. String.StringBuffer.Str ...
- JavaSE基础知识(五)--面向对象思想概述
Java SE 是什么,包括哪些内容(五)? 本文内容参考自Java8标准 一.面向对象: 1.回顾前面的博文("了解这个开头,更有利于了解对象以及面向对象的思想") 首先我们知道 ...
- 卷积神经网络基础知识五(mobilenet)
一.简单介绍 1.1 绪论 论文下载地址: MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applicat ...
- java基础知识五、六、七、八
第五章 在较大的数之前先增加较小数是减小误差的一种方法. 第六章 方法签名(Method Signature)指方法名称.参数类型和参数数量.java编译器根据方法签名决定使用哪个方法. 调用方法时, ...
- Matlab基础知识五
第五节 1.subplot() plot() 绘制二维图像,一般默认格式为plot(x,y),也可以用带属性的格式,增加线条的属性(标记符号.线型.颜色.粗细等) subplot(m,n,1); 改变 ...
- Java并发基础知识(五)
线程池 为什么要用线程池? Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池能够带来3个好处. 第一:降低资源消耗.通过 ...
最新文章
- 168 Excel Sheet Column Title
- 收敛标准对卷积核数量最优值的影响
- Android使用WebView加载网页
- 压测导致mysql数据库CPU很高_排查压测问题引发的系统性能调优过程
- 【两种解法】Quadtrees UVA - 297(隐式建树+显式建树)
- Bootstrap按钮组中按钮的尺寸
- css除法,CSS_关系数据库 除法,假设有两个关系,R(a,b,c)和T(b,c - phpStudy
- .NET 2.0中的企业库异常处理块
- xp系统怎么解除防火墙阻止_xp系统关闭防火墙方法
- 度分秒换算题及答案C语言,度分换算(度分秒换算50题及答案)
- h264js解码直播解码显示
- 信息系统监理工程师模拟题
- FTP上传软件常见错误问题集锦
- vue 多种方法实现名字拼接
- 最新外卖霸王餐系统程序源码|美团/饿了么霸王餐系统(含数据库)(可对接公众号)
- 华为云WeLink端云协同会议是什么?
- 把kali装到U盘里
- 计算机硬盘分区信息,你知道电脑硬盘分区Guid格式和MBR格式有什么区别吗?来看看!...
- R语言作图好看的秘籍:RColorBrewer调色板详解
- 971. 翻转二叉树以匹配先序遍历
热门文章
- 领扣(LeetCode)删除链表的倒数第N个节点 个人题解
- NEFU_117素数个数的位数
- 游戏里的---Change
- 算法(七):图解动态规划
- 大数据之-Hadoop3.x_MapReduce_编程规范---大数据之hadoop3.x工作笔记0086
- 大数据_Hbase-内容回顾_知识点补充_线程安全与wait的区别---Hbase工作笔记0019
- 最近调试人脸问题的总结--命令行+抽取第二级子目录的名称
- linux下svn命令
- php多少内置函数,php有多少个内置函数
- 随想录(熟练掌握uml)