Java的内部类详解(结合代码全面分析)
时间:2022-07-25
本文章向大家介绍Java的内部类详解(结合代码全面分析),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
分分钟搞清楚Java内部类
概述
内部类是一种特殊的类,指的是定义在一个类的内部的类。实际开发中,为了方便的使用外部类的相关属性和方法,这时候我们通常会定义一个内部类。
一般情况下,我们把类定义成独立的单元,有些情况下,我们把一个类放在另一个类的内部定义,称为内部类(innerclasses)。
内部类可以使用 public、private、default、protected 以及 static 修饰。而外部顶级类只能使用 public 和 default 修饰。
注意
内部类只是一个编译时的概念,一旦我们编译成功,就会成为完全不同的两个类。对于一个名为 Outer 的外部类和其内部定义的名为 Inner 的内部类。编译完成后会出现两个类的字节码文件。所以内部类是相对独立的一种存在,其成员变量、方法名可以和外部类相同。
示例
上面代码编译后产生两个字节码文件
- 内部类作用
- 内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其它类直接访问
- 内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。但外部类不能访问内部类的内部属性
分类
- 成员内部类
- 非静态内部类
- 静态内部类
- 匿名内部类
- 局部内部类
非静态内部类
非静态内部类(外部类里使用非静态内部类和平时使用其他类没什么不同)
- 非静态内部类对象必须寄存在一个外部类对象里。因此,如果有一个非静态内部类对象,那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。
- 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员。
- 非静态内部类不能有静态方法、静态属性和静态初始化块。
-
成员变量访问要点:
- 内部类里方法的局部变量:变量名
- 内部类属性:this.变量名
- 外部类属性:外部类名.this.变量名
内部类中访问成员变量
我这人不喜欢一大堆理论阐述,直接来段代码玩玩就明白了。Look!
示例
- 内部类的访问:
1.外部类中定义内部类:
new Inner()
。 2.外部类以外的地方使用非静态内部类:Outer.Inner varname=new Outer().new Inner()
。
内部类的访问
静态内部类
static class className{
...
}
要点
1. 静态内部类可以访问外部类的静态成员,不能访问外部类的普通成员。
2. 静态内部类看做外部类的一个静态成员。
匿名内部类
适合那种只需要使用一次的类。比如:键盘监听操作等等。在安卓开发、awt、swing 开发中较为常见。
new 父类构造器(实参类表)实现接口(){
//匿名内部类类体
}
注意
匿名内部类没有访问修饰符。
匿名内部类没有构造方法,因为它连名字都没有,何来构造方法呢。
局部内部类
定义在方法内部的,作用域只限于本方法,称为局部内部类。
局部内部类的使用主要是用来解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到时候又不希望这个类时公共可用的,所以就产生了局部内部类。局部内部类和成员内部类一样被编译,只是它的作用于发生了改变,它只能在该方法中被使用,出了该方法就会失效。
局部内部类在实际开发应用中很少。
over!
- 【springboot】 springboot 整合mybatis-plus
- jfinal-swagger让你的应用接口更加简单
- 【springboot】 spring session 分布式会话共享
- 基于jfinal Template的Shiro 标签
- 基于Spring Cloud 少量配置完成单点登录开发
- Spring 必知概念(一)
- 如何在EHAB(EntLib)中定义”细粒度”异常策略?
- MVC、MVP以及Model2[下篇]
- Dora.Interception: 一个为.NET Core度身定制的AOP框架
- 为了支持AOP的编程模式,我为.NET Core写了一个轻量级的Interception框架[开源]
- 关于Expression Tree和IL Emit的所谓的"性能差别"
- 采用一个自创的"验证框架"实现对数据实体的验证[扩展篇]
- 采用一个自创的"验证框架"实现对数据实体的验证[改进篇]
- Flash XSS检测脚本的简单实现
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android编程实现悬浮窗获取并显示当前内存使用量的方法
- Android ListView中动态添加RaidoButton的实例详解
- Android沉浸式状态栏设计的实例代码
- Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法
- R语言使用bootstrap和增量法计算广义线性模型(GLM)预测置信区间
- Android 中两个Activity 之间的传值问题
- 学习使用Material Design控件(二)使用DrawerLayout实现侧滑菜单栏效果
- Android Spinner列表选择框的应用
- Android实现截屏方式整理(总结)
- 用RSHINY DASHBOARD可视化美国投票记录
- Android 侧滑关闭Activity的实例
- Android 两个Fragment之间的跳转和数据的传递实例详解
- Android编程实现保存图片到系统图库的方法示例
- Android自定义单选多选下拉列表的实例代码
- R语言POT超阈值模型在洪水风险频率分析中的应用研究