内部类
内部类和常用类概述
内部类
分类
成员内部类
注意点
-
在类的内部定义,与实例变量、实例方法同级别的类
-
外部类的一个实例部分,创建内部类对象时必须依赖外部类对象
创建外部类对象和创建内部类对象实际上可以一步到位,如下图所示
-
外部类和内部类存在重名属性时优先访问内部类属性,如下图打印出来的是内部类的name属性
在这种情况下我如果想要访问外部类的这个重名属性,怎么办呢?
在输出命令中输出:外部类名字.this.重名属性即可,如下图所示
所以最好保持以下好习惯
- 成员内部类不能定义静态成员(static),但是可以定义静态常量(static final)!
静态内部类
在成员内部类基础之上添加static关键字,和外部类同级
注意点
- 因为静态内部类和外部类同级,所以它不依赖外部类对象,可直接创建或者通过类名访问,可声明静态成员
外部属性、内部静态属性、内部非静态属性的调用
外部类属性的调用
内部类属性的调用
完整程序
调用静态内部类的方法,直接创建静态内部类对象即可,因为静态内部类和外部类是同级的
局部内部类
注意
-
同局部变量一样,class前边不能加任何访问修饰符(public/private/protected......)
如上图,报错了 -
静态方法不能访问非静态成员,因为静态属性是类的属性,不是单个成员的属性
如上图所示,虽然局部内部类方法是非静态,但包含局部内部类的方法是静态的,当然不能访问外部类中的非静态成员name 和 age 了 -
在外部是不能创建局部内部类对象的,局部内部类的方法仅限在创建局部内部类的方法中使用
如何解决呢?我们可以创建外部类对象,通过外部类对象调用生成局部内部类的方法(即为程序中的show方法),再通过show方法调用其内部的局部内部类内部的show2方法(有点绕,多理解)
但是这样直接调用show方法运行结果为空,这是为什么呢?
因为在show方法中我们只定义了一个局部变量,并没有在局部内部类外部创建局部内部类对象(相当于局部内部类整体完全没有参与编译)
不用担心局部内部类外部无法创建对象,把对象创建在局部内部类之外,show方法中不就行了(因为局部内部类在show方法中)
创建完局部内部类对象之后记得在下边调用show2方法,如下图所示
4. 在show2访问局部变量(jdk1.7要求该变量必须是常量final,jdk1.8自动添加final)
小思考:为什么必须要是常量呢?
因为show方法执行完之后局部变量address就消失了,但inner这个创建的对象并不会立即消失,Inner这个类也不会消失,变量没有了但是类还在,类里边的方法show2当然不能引用这个局部变量address了
其实此时上图中的红框位置已经不再是address这个局部变量了,而是变成了show方法中定义成的常量"shenzhen"了
- 局部内部类中是不能包含静态成员(static)的,但可以包含静态常量(final static)成员
完整程序
匿名内部类(没有类名的局部内部类)
下图所示class文件其实就是系统生成的匿名内部类
***完整程序(好好理解)
概念
在一个类的内部再定义一个完整的类,如下图,head类即为Body类的一个内部类
特点
-
编译成功后可生成独立的字节码文件,即内部类也会在文件夹内建立一个class文件
-
内部类可 直接访问外部类私有成员而不破坏封装
-
可为外部类提供必要的内部功能组件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律