【java基础】内部类
1|0什么是内部类?
内部类就是定义在类的内部的类,称之为内部类
Java中内部类分为以下4种:
- 成员内部类, 内部类在定义时没有使用static修饰(知晓)
- 静态内部类,内部类在定义时使用static修饰【Java中唯一可以使用static修饰类的方法】
(知晓)- 局部内部类,内部类在定义时定义在方法体内部(了解)
- 匿名内部类,它属于局部类类的特殊形态(必须会用)
内部类也是类,所以也会被JVM进行编译生成字节码文件【.class文件】
- 成员内部类生成字节码文件: 外部类类名$成员内部类类名.class
- 静态内部类生成字节码文件: 外部类类名$静态内部类类名.class
- 局部内部类生成字节码文件: 外部类类名$数字局部内部类类名.class
- 匿名内部类生成字节码文件: 外部类类名$数字.class
PS: 数字是从1开始逐渐递增【随着类的增加而增加】成员内部类(知晓)
2|0成员内部类(知晓)
外部类可以使用权限修饰符为 public 和 默认的和abstract,成员内部类可以使用【4种权限修饰
符和abstract修饰】,可以将成员内部类看做就是在类中声明成员变量或成员方法,所以成员内
部类是属于对象的
总结: 成员内部类是定义在类中,不使用static修饰,可以使用4种权限修饰符,可以使用
abstract和final修饰,允许继承类与实现接口,成员内部类中不可以定义static修饰变量与方
法,成员内部类是可以直接访问外部类定义属性和方法,如果成员内部类出现了与外部类属性重
名,可以使用【this 和 外部类.this】进行区分,外部类要访问成员内部类的属性和行为时,提供
成员内类的对象
---》 外部类类名.内部类类名 内部类对象名 = new 外部类().new 内部类();
3|0静态内部类(知晓)
静态内部类和成员内部类几乎与是一样的,唯一不点在于静态内部类使用static进行了修饰
PS:这是Java中类唯一可以使用static修饰的形式
总结: 静态内部就是使用static修饰类【Java中只有这个类可以使用static修饰】,可以使用所
有权限修饰符,abstract和final修饰,静态内部类和静态属性和静态方法是一样都属于类,静态
内部类中是可以定义【成员变量和方法、静态变量和方法】,静态内部类中不允许明确访问方式
获取外部类this对象即【外部类类名.this】,所以在静态内部类中访问外部类成员变量和成员方
法,需要提供外部对象才可以,外部类静态变量和静态方法直接访问即可,如果有重名【外部类
类名.静态变量/静态方法】
静态内部类如果要创建对象
外部类类名.静态内部类类名 对象名 = new 外部类类名.静态内部类类名();
4|0局部内部类(了解)
这个内部类不允许使用任何修饰符,只能定义在方法内部与局部变量是平级关系,访问作用域仅
限在方法的内部
为什么,局部内部类访问局部变量之后需要使用final声明?
final修饰局部变量的存储空间会发生改变,存储不再是栈中,而是方法区中常用池,局部变量就会
变成“引用”常量
局部内部类是声明在方法体内部,就会存在一个问题,局部内部类是随着方法而开始创建空间,
随着方法消亡开始回收空间,如果在方法内声明局部变量存储空间是栈【随着方法开始而创建随
着方法消亡会销毁】,如果局部内部类使用了这个局部变量,那么堆中地址就会和栈中位置产生
一个联系,堆中局部内部类就会引用到栈中局部变量,如果发生方法执行完毕,栈中空间空间会
进行立即回收,但是堆中局部内部类是不会被立即回收【GC机制】,就会出现堆栈存在一个“指
向空”引用,内报错了,所以使用final修饰符将局部变量修改为局部常量,将存储从栈中移动到方
法区中常量池,这样一来就算栈中空间被回收,但是方法区种空间还在,所以可以等待堆中局部
内部正常回收之后断练习,保证不会出现引用错误。
5|0匿名内部类
__EOF__
本文链接:https://www.cnblogs.com/blanset/p/16907344.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
作者:blanset
出处:https://www.cnblogs.com/blanset/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律