内部类介绍
(1)把类定义在另一个类的内部,该类就被称为内部类。
举例:把类B定义在类A中,类B就被称为内部类。
(2)内部类的访问规则
1、可以直接访问外部类的成员,包括私有
2、外部类要想访问内部类成员,必须创建对象
(3)内部类的分类
1、成员内部类
2、局部内部类
3、匿名内部类
(4)成员内部类访问规则
成员内部类不是静态的:外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
成员内部类是静态的:外部类名.内部类名 对象名 = new 外部类名.内部类名();
(5)局部内部类
1、局部内部类访问局部变量必须加final修饰。
2、为什么呢?
因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。所以,堆内存还是用该变量,而该变量已经没有了。为了让该值还存在,就加final修饰。通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。
(6)匿名内部类(掌握)
1、是局部内部类的简化形式
2、前提存在一个类或者接口
3、格式:new 类名或者接口名() {重写方法;}
4、本质:其实是继承该类或者实现接口的子类匿名对象
内部类分类
1. 静态内部类:
1. 静态内部类本身可以访问外部的静态资源,包括静态私有资源。但是不能访问非静态资源,可以不依赖外部类实例而实例化。
2. 成员内部类:
1. 成员内部类本身可以访问外部的所有资源,但是自身不能定义静态资源,因为其实例化本身就还依赖着外部类。
3. 局部内部类:
1. 局部内部类就像一个局部方法,不能被访问修饰符修饰,也不能被static修饰。
2. 局部内部类只能访问所在代码块或者方法中被定义为final的局部变量。
4. 匿名内部类:
1. 没有类名的内部类,不能使用class,extends和implements,没有构造方法。
2. 多用于GUI中的事件处理。
3. 不能定义静态资源
4. 只能创建一个匿名内部类实例。
5. 一个匿名内部类一定是在new后面的,这个匿名类必须继承一个父类或者实现一个接口。 .
6. 匿名内部类是局部内部类的特殊形式,所以局部内部类的所有限制对匿名内部类也有效。