目录
一、内部类的概念
1. 当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整结构最好使用内部类。在 Java 中,可以将一个类定义在另一个类或者一个方法的内部, 前者称为内部类,后者称为外部类。内部类也是封装的一种体现。
2. 【注意事项】:
① 定义在class 类名{}花括号外部的,即使是在一个文件里,都不能称为内部类。
② 内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件。
二、内部类的分类
注意:以后说内部类一定要说前缀。
2.1 实例内部类
1. 实例内部类不要用static修饰。
2. 实例内部类的书写位置在外部类的里面,方法的外面。
3. 实例内部类的定义和普通的类的定义没什么区别。
4. 实例内部类对象的实例化方式:
5. 实例内部类的引用无法调用外部类的成员,外部类的引用无法调用实例内部类的成员。
6. 在外部类的方法中无法通过this去调用实例内部类的非静态成员,要调用得实例化实例内部类的对象然后调用(这个时候的实例化方式正常实例化就好,不必像上图中那样复杂)。
7. 在实例内部类的方法中无法通过this去调用外部类的非静态成员,要调用可以直接写名称调用(因为:实例内部类的非静态方法中包含了一个指向外部类对象的引用:OutClass.this)。
8. 如果外部类和实例内部类中有名称相同的成员变量,都是优先使用自己的。
如果硬是想要调用别人的,方法见下图:
9. 实例内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束。
10.【注意】在实例内部类中写的main方法不能被调用,在静态内部类中写的main方法可以被调用。
2.2 静态内部类(数据结构中常用)
1. 静态内部类要用static修饰。
2. 静态内部类的书写位置在外部类的里面,方法的外面。
3. 静态内部类的定义和普通的类的定义没什么区别。
4. 静态内部类对象的实例化方式:
5. 静态内部类的引用无法调用外部类的成员,外部类的引用无法调用静态内部类的成员。
6. 在外部类的方法中无法通过this去调用静态内部类的非静态成员,要调用得实例化静态内部类的对象然后调用(这个时候的实例化方式正常实例化就好,不必像上图中那样复杂)。
7. 在静态内部类的方法中无法通过this去调用外部类的非静态成员,要调用不可以像实例内部类一样直接写名称调用,此时只有兜底方式调用了:实例化外部类的对象再调用。
8. 静态内部类所处的位置与外部类成员位置相同,因此也受public、private等访问限定符的约束。
2.3 局部内部类(几乎不被使用)
1. 定义在外部类的方法体或者{}中,该种内部类只能在其定义的位置使用,一般使用的非常少。
2. 局部内部类只能在所定义的方法体内部使用。
3. 不能被public、static等修饰符修饰。
4. 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class
5. 【注意】局部内部类中被private修饰的成员,可以在类外,所在方法的里面被访问到,和其他的类不同。
2.4 匿名内部类
1. 一般对接口使用匿名内部类,不是接口也可以匿名内部类。
2. 具体做法:在方法里面。。。见下图
代码的含义其实就是可以不明确指出到底是谁实现了接口并重写了接口中的抽象方法,你写成匿名内布类的形式后也可以直接调用该接口中被重写的方法。(注意:匿名内部类并没有实例化接口的对象!!!)
3. 上图中的写法相当于:
待讨论问题:this引用所指向的对象里到底有没有age成员是未可知的,所以会报错。
因此在匿名内部类重写的方法中我们通常不会去使用带this引用语句。
本篇已完结 ......