2018-05-07
内部类
可以在一个类的内部定义另一个类。
为什么使用内部类?
1)增强封装,把内部类隐藏在外部类之中,不允许其他类访问内部类。
2)内部类能提高代码的可读性和可维护性,把小型类嵌入到内部类中,结构可以更靠近。
3)内部类可以直接访问外部类成员
内部类根据不同的修饰符或者定位的位置不同,分成四种:
1)实例内部类:内部类没有使用static修饰。
2)静态内部类:内部类使用了static修饰。
3)局部内部类:在方法中定义的内部类。
4)匿名内部类:适合于仅使用一次的内部类,属于局部内部类的特殊情况。
内部类可以看作是外部类的一个成员,好比字段。那么内部类可以使用public、缺省、protected、private修饰,还可以用final修饰。
------------------------------------------------------------------------------------------------------------------------
一、实例内部类
没有使用static修饰的内部类,说明内部类属于外部类的对象,不属于外部类本身。
特点:
1、创建实例(对象)内部类之前,必须存在外部类对象创建内部类对象。(当存在内部类对象时,一定存在外部类对象)
2、实例内部类自动持有外部类的实例(对象)的引用,内部类可以直接访问外部类成员。
3、外部类中不能直接访问内部类的成员,必须通过内部类的实例去访问。
4、实例内部类中不能定义静态成员,只能定义实例成员。
5、如果外部类和实例内部类存在同名的字段和方法abc,那么在内部类中this.abc表示访问内部类成员。
二、静态内部类
使用static修饰的内部类
特点:
1、静态内部类的实例不会自动持有外部类的实例的引用。在创建内部类实例时不必创建外部类的实例
2、静态内部类可以直接访问外部类静态成员,如果访问外部类实例成员,必须通过外部类的实例(对象)去访问。
3、在静态内部类中可以定义静态成员和实例成员。
4、测试类可以通过完整的类名直接访问静态内部类的静态成员。
三、局部内部类
在方法中定义的内部类,其可见范围是当前方法和局部变量是容一个级别。
1、不能使用public、protect、private、static修饰符。
2、局部内部类只能在当前方法中使用。
3、局部内部类和实例内部类一样,不能包含静态成员。
4、局部内部类和实例内部类一样,可以访问外部类的所有成员。
5、局部内部类访问的局部变量必须使用final修饰(在Java8中是自动隐式加上final,但是依然是常量,不能改变值)
四、匿名内部类