文章目录
一、内部类的分类和定义
1.1 成员内部类的定义
- 成员内部类,就是内部类的定义和成员变量在同一个位置;成员内部类中也可以有内部类方法
1.2 成员内部类的使用方法
- 间接方式: 在外部类的方法当中,使用内部类 ;在外部类的方法中创建一个内部类的对象,通过内部类的对象调用内部类的方法和变量;在外面通过调用外部类的方法实现间接调用内部类的方法和变量。
- 直接方式:
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
1.3 内部类的同名变量的访问方法
2.1 局部内部类的定义
- 局部内部类,局部内部类中又包含着匿名内部类 ;
- 局部内部类,顾名思义就是和局部变量的位置是相同的,在 外部类的方法 中定义的类就叫局部内部类
- 局部内部类的使用范围就只限于当前外部类的方法中,除了自身定义的方法,就不能用了
2.2 局部内部类的使用方法
- 在外部类的方法中定义内部类
- 在外部类的方法中创建内部类的对象
- 通过外部调用外部类的方法,从而实现调用局部内部类的效果
2.2.1 局部内部类的 final 问题
- 如果希望局部内部类访问其所在方法的局部变量,那么这个局部变量必须是有效 final 的。
- 因为局部内部类和局部变量都存在于外部类的方法中;
- 使用内部类调用局部变量的时候,需要在方法中将内部类通过
new
创建一个对象,那么被创建的这个对象存在于堆内存, - 而局部变量跟着外部方法走,存在于栈内存,方法运行结束之后立刻出栈,局部变量就会立刻消失
- 堆内存中的成分存活时间更长,因此,为了保证局部变量被回收的时候处于堆内存中的对象依然可以正常使用,需要通过
final
关键字对这个局部变量进行修饰
2.2.2 匿名内部类(**重点)
- 如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况下就可以省略掉该类的定义,而改为使用【匿名内部类】;通过这种方式可以省去为接口单独定义一个实现类的繁杂过程,直接使用匿名内部类,并且在大括号中进行重写就可以完成这个过程。
2.2.3 匿名内部类的注意事项
- 匿名内部类在创建对象的时候 只能使用唯一的一次,如果希望多次创建对象,并且保持创建的对象有相同的内容,那么就需要单独地定义一个单独的实现类。
- 匿名内部类 和 匿名对象 有区别。匿名内部类是没有单独定义的实现类,因此在实现的时候直接 new 接口名称,通过大括号进行重写, 而匿名对象是没有对象名称,通过下面的代码进行展示:
【使用匿名内部类】
【使用匿名内部类 + 匿名对象】
- 很明显,在这里,只能调用一个方法,所以这又牵扯到 匿名对象的性质,就是调用方法的时候只能使用一次,如果要调用两个方法
method1
和method2
就必须创建一个对象来调用。而匿名内部类的性质是在创建对象的时候只能使用一次。
- 很明显,在这里,只能调用一个方法,所以这又牵扯到 匿名对象的性质,就是调用方法的时候只能使用一次,如果要调用两个方法
二、内部类修饰符注意事项
- 外部类:可以用
public
或者(default)
修饰 - 成员内部类:可以用
public
、protected
、(default)
、private
来修饰都可以 - 局部内部类:前面不能有任何修饰符,因为只有当前的外部类方法可以对其进行操作;其他的都不行