分类: Java
2008-03-29 20:18:22
内部类学习笔记
1,内部类定义:在一个类的内部定义的类
2,内部类分类:
实例内部类
3,顶层类只能处于public和默认访问级别,而成员内部类可以处于pulbic、protected、 private和默认4种访问级别,且不论何种内部类都不能和外部类同名
4,实例内部类的特点:
<1>在创建实例内部类的实例时,外部类的实例必须已经存在
<2>实例内部类的实例自动持有外部类的实例的引用,在内部类中可以访问外部类的任何级别的所有成员 (成员变量、成员方法)
<3>外部类实例与内部类实例之间是一对多关系,一个内部类实例只会引用一个外部类实例,而一个外部 类实例对应零或多个内部类实例,在外部类中不能直接访问内部类的成员,必须通过内部类的实例去访问
<4>在实例内部类中不能定义静态成员(静态变量、静态方法、静态内部类等),只能定义实例成员
<5>如果内部类和外部类都包含相同的成员,比说说成员变量i,那么this.i表示内部类 的成员变量i,外 部类.this.i表示外部类的成员变量i
5,静态内部类的特点:
用static修饰的成员内部类
<1>静态内部类的实例不会自动持有外部类的特地实例的引用,在创建内部类的实例时,不 必创建外部 类的实例
<2>静态内部类可以直接访问外部类的静态成员(静态变量、静态方法、静态内部类等),如果访问外部类 的实例成员,则必须通过外部类的实例去访问
<3>在静态内部类中可以定义静态成员和实例成员,而实例内部类只能定义实例成员
<4>客户类何以通过完整的类名直接访问静态内部类的静态成员
6,局部内部类的特点:
在一个方法中定义的内部类,可以范围在当前方法,和局部变量一样,局部内部类不能用访问控制修饰符 (public、private和protected)及static来修饰
<1>局部内部类只能在当前方法中使用
<2>局部内部类和实例内部类一样,不能包含static成员
<3>在局部内部类中定义的内部类不能被public、protected、private这些访问控制修饰符修饰
<4>局部内部类和实例内部类一样,可以访问外部类的所有成员(变量,方法等),还可以访问所在方法中 的final类型的参数和变量
7,内部类中不存在覆盖的概念,如果子类和父类中存在同名的内部类,这两个内部类分别处于 不同的命名空间中,因此不会发生冲突
8,匿名类的特点:
是一种特殊的内部类,这种类没有名字
<1>匿名类没有构造方法,但是会调用父类的构造方法
<2>你们类尽管没有构造方法,但可以在匿名类中提供一段实例初始化代码,JVM会在调用 了父类的构 造方法后,执行这段代码,实例初始化代码具有和构造方法同样的效果
<3>除了可以在外部类的方法内定义匿名类以外,还可以声明一个成员变量时定义匿名类
<4>匿名类除了可以继承类以外,还可以实现接口
<5>匿名类和局部内部类一样,可以访问外部类的所有成员,如果匿名类位于一个方法中,还可以访问所 在方法的final类别的变量和参数
<6>匿名内部类的名字在方法外是不可见的,因此与匿名类一样,可以起到封装类型名字的 作用
9,内部类的用途:
<1>封装类型
<2>直接访问外部类的成员
<3>回调(CallBack)外部类的方法
10,内部类的类文件:
<1>成员内部类:外部类的名字 + $ + 内部类的名字
<2>局部内部类:外部类的名字 + $ + 数字 + 内部类的名字
<3>匿名类: 外部类的名字 + $ + 数字
11,内部类总结:
比较方面 |
实例内部类 |
静态内部类 |
局部内部类 |
主要特征 |
内部类的实例 引用特地的外部类实例 |
内部类的实例不与 外部类的任何实例关联 |
可见范围 为所在方法 |
可用修饰符 |
所有访问控制修饰符, abstract,final |
所有访问控制修饰符, static,abstract,final |
abstract,final |
可以访问外部类的哪些成员 |
直接访问外部类 的所有成员 |
只能直接访问 外部类的静态成员 |
直接访问外部类 的所有成员,并且能访问所在方法的final类型的变量和参数 |
拥有成员的类型 |
只能拥有实例成员 |
实例成员,静态成员 |
只能拥有实例成员 |
外部类如何 访问内部类 |
必须通过 内部类的实例来访问 |
静态成员可以通过 内部类的完整类名来访问 |
必须通过 内部类的实例来访问 |