一、内部类的定义:
内部类(Inner Class)就是定义在另外一个类里面的类。与之对应,包含内部类的类被称为外部类。
二、为什么使用内部类:
1、内部类提供了更好的封装,可以吧内部类隐藏在外部类中,不允许同包的其他类进行访问;
2、内部类的方法可以直接该类定义所在的作用域中的所有数据,包括私有数据;
3、内部类所实现的功能,使用外部类也可以实现,只是有时(当定义一个回调函数)使用内部类更加方便。
三、内部类可分为几种:
1、静态内部类 static inner class(also called nested class)
2、成员内部类 member inner class
3、局部(方法)内部类 local inner class
4、匿名内部类 anonymous inner class
被编译为一个完全独立的.class文件,名称为Outer$Inner.Class的形式
1、声明在类的成员位置(成员内部类)
1.1 内部类能不能访问外部类的成员变量?可以
1.2 内部类的方法怎么调用?
因为内部类在外部类的成员位置,所以要通过外部类的对象来调用
Outer.Inner inner=new Outer().new Inner();
1.3 内部类的修饰符问题:
一般用private修饰,本来这个内部类就是只给外部类用的,而且可能只用一次。
1.4在外部类中创建内部类实例:
this.new Innerclass();
1.5在外部类之外创建内部类实例:
(new Outerclass()).newInnerclass();
1.6在内部类访问外部类的成员:
Outerclass.this.member
2、声明在类的成员位置,用static修饰的(静态内部类)
2.1静态内部类只能访问外部类的静态成员
2.2静态内部类可以有非静态的方法
2.3怎么调用静态内部类(内部类的实例)?
Outer.Inner2 inner2=new Outer.Inner2();
2.4内部类的修饰符问题:
一般用public修饰,这个是为了访问方便。
3、声明在类的局部位置(局部(方法)内部类 )
3.1 在方法中要new这个内部类的对象并调用
3.2如果局部内部类中要使用外部类的方法的局部变量,需要在变量前面加final, 为什么?
因为局部变量使用完毕后很快就消失了,而内部类所在的堆内存的数据并不会马上就消失,如果内部类需要用到该变量,
但是该变量消失了,这样就会出问题。所以必须要在变量之前加final,这样加载到堆内存中的就是一个常量。
3.2像局部变量一样,不能被public ,protected,private和static修饰。
3.3局部内部类只能在方法中使用,即只能在方法中生成局部内部类的实例并调用其方法。
4、匿名内部类(常用)(匿名内部类)
声明在类的局部位置,可以不起名字。
4.1前提:得有一个类(抽象类)或者接口
4.2格式:new 抽象类/接口(){重写方法}
表面上是new抽象类/接口,实际上是偷偷地创建了抽象类的子类/接口的实现类,
用得最多的就是抽象类/接口作为形参的时候。
4.3不使用关键字class,extends,implement,没有构造方法。
4.4匿名内部类的使用的比较多,通常是作为一个方法参数。