目录
12 内部类
12.1 内部类的定义
Java 中的内部类是一个被定义在另一个类内部的类
① 定义在 class 类名{}花括号外部的,即使是在一个文件里,都不能称为内部类
② 内部类和外部类共用同一个 java 源文件,但是经过编译之后,内部类会形成单独的字节码文件
12.2 内部类的分类
成员内部类(实例内部类、静态内部类)、局部内部类、匿名内部类
12.2.1 实例内部类
即未被 static 修饰的成员内部类
① 在实例内部类的成员变量不能是静态的
原因:实例内部类是需要外部类引用对象调用的,而静态成员是不需要实例化对象的
解决方法:加上 final,此时就不是变量而是常量了,编译时就确定了,就不依赖于有没有对象了
实例化内部类对象不能直接主函数里 new 生成对象
解决方法
先通过外部类生成一个外部对象,其次通过外部类对象的引用来实例内部类对象
② 实例内部类对象必须在先有外部类对象前提下才能创建
因为其本身是实例内部成员,因此要有外部类的引用
在实例内部类方法中访问同名的成员时,优先访问自己的
③ 如果要访问外部类同名的成员,必须:外部类名称.this.同名成员来访问
④ 实例内部类的非静态方法中包含了一个指向外部类对象的引用
外部类中,不能直接访问实例内部类中的成员
⑤ 如果要访问必须先要创建内部类的对象
(调用成员方法的同时也先需要实例化外部类对象)
⑥ 外部类中的任何成员都可以在实例内部类方法中直接访问
⑦ 实例内部类所处的位置与外部类成员位置相同,受 public、private 等访问限定符的约束
12.2.2 静态内部类
被 static 修饰的内部成员类称为静态内部类
创建静态内部类对象时,不需要先创建外部类对象
在静态内部类中只能访问外部类中的静态成员
如果一定在内部类访问外部类中非静态成员就要创建外部类对象然后利用对象引用访问
12.2.3 局部内部类
定义在外部类的方法体或者 {} 中
该种内部类只能在其定义的位置(该方法体内部)使用,一般使用的非常少
不能被 public、static 等修饰符修饰
编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class
12.2.4 匿名内部类
相当于有一个类继承了 IA 接口重写了 test方法
可以用 IA 接收一下这个匿名对象,已经 new 过了
通过对象的引用去调用 test方法
或者直接匿名对象.test方法调用
打印结果