内部类

内部类和常用类概述

内部类

分类

成员内部类

注意点

  • 在类的内部定义,与实例变量、实例方法同级别的类

  • 外部类的一个实例部分,创建内部类对象时必须依赖外部类对象

    创建外部类对象和创建内部类对象实际上可以一步到位,如下图所示

  • 外部类和内部类存在重名属性时优先访问内部类属性,如下图打印出来的是内部类的name属性

    在这种情况下我如果想要访问外部类的这个重名属性,怎么办呢?

在输出命令中输出:外部类名字.this.重名属性即可,如下图所示

所以最好保持以下好习惯

  • 成员内部类不能定义静态成员(static),但是可以定义静态常量(static final)!

静态内部类

在成员内部类基础之上添加static关键字,和外部类同级

注意点

  • 因为静态内部类和外部类同级,所以它不依赖外部类对象,可直接创建或者通过类名访问可声明静态成员

外部属性、内部静态属性、内部非静态属性的调用

外部类属性的调用

内部类属性的调用

完整程序

调用静态内部类的方法,直接创建静态内部类对象即可,因为静态内部类和外部类是同级的

局部内部类

注意

  1. 同局部变量一样,class前边不能加任何访问修饰符(public/private/protected......)

    如上图,报错了

  2. 静态方法不能访问非静态成员,因为静态属性是类的属性,不是单个成员的属性

    如上图所示,虽然局部内部类方法是非静态,但包含局部内部类的方法是静态的,当然不能访问外部类中的非静态成员nameage

  3. 在外部是不能创建局部内部类对象的,局部内部类的方法仅限在创建局部内部类的方法中使用

如何解决呢?我们可以创建外部类对象,通过外部类对象调用生成局部内部类的方法(即为程序中的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"

  1. 局部内部类中是不能包含静态成员(static)的,但可以包含静态常量(final static)成员

完整程序

匿名内部类(没有类名的局部内部类)


下图所示class文件其实就是系统生成的匿名内部类

***完整程序(好好理解)

概念

在一个类的内部再定义一个完整的类,如下图,head类即为Body类的一个内部类

特点

  • 编译成功后可生成独立的字节码文件,即内部类也会在文件夹内建立一个class文件

  • 内部类可 直接访问外部类私有成员而不破坏封装

  • 可为外部类提供必要的内部功能组件

posted @ 2022-04-01 11:54  无关风月7707  阅读(31)  评论(0编辑  收藏  举报