------- android培训、java培训、期待与您交流! ----------
java中的类,按照其所处的位置可以分为顶层类和内部类,顶层类与内部类两者既有区别
又有相同点。本篇博文将详细介绍内部类的使用方式以及其语法特点。
所谓内部类,就是定义在一个类中的类,按照它的作用域可以分为 成员内部类和局部内部
类,而成员内部类又分为实例内部类和静态内部类。这与内中的各种变量的分类是一致的。
前面在讲修饰符时曾经提到过:顶层类只能处于public和默认访问级别,而成员 内部类可以处于
4中不同的访问级别。
class A{
public class B{
}
}
(1)上述代码中定义了一个公开的成员内部类,如果不希望客户程序访问成员内部类,我们可以将
B类的修饰符改成private。
<span style="font-size:12px;">class A{
private class B{
}
}</span>
(2)成员内部类的完整类名为:
外部类名.内部类名
(3)用static关键字修饰的成员内部类叫做静态内部类,而没有static关键字的叫做实例内部类。
实例内部类具有以下几个特点:
(3.1)在创建实例内部类的实例时,外部类的实例必须存在。例如,要创建B内的实例,必须先创建
A类的实例。所以其实例创建的方式如下
class A{
private class B{
}
public static void main(String[] args){
A.B b=new A().new B();//创建一个实例内部类
}
}
(3.2)实例内部类的实例自动持有外部内实例的引用。在内部类中可以直接访问外部类的所有成员,
包括成员变量和成员方法。
<span style="font-size:12px;">class A{
int a=1;
static int b=0;
static void show(){}
void method(){}
private class B{
a++;//编译成功
b++;//编译成功
show();//编译成功
method();//编译成功
}
public static void main(String[] args){
A.B b=new A().new B();//创建一个实例内部类
}
}</span>
(3.3)外部类实例与内部类实例是1对多的关系,一个内部类实例只会引用一个外部类实例,而一个
外部类实例会对应零或者多个内部类实例。所以在外部内中不可以直接访问内部类实例成员,必须通
过内部类实例来访问。
<span style="font-size:12px;">class A{
void show(){
x++;//编译失败
}
private class B{
int x;
}
</span>
(3.4)在实例内部类中不能定义静态成员,而只能定义实例成员。
class A{
private class B{
int x;
static int w=1;//编译失败,不可定义静态成员
}
}
}
(3.5)如果实例内部类B与外部类A包含同名的成员(比如x),那么在类B中this.x代表B中的x,而
A.this.x代表A中x。
(4)静态内部类是成员内部类的一种,用static关键字修饰。静态内部类有以下几个特点:
(4.1)静态内部类的实例不会自动持有外部类实例的引用,在创建内部类的实例时,不必创建外部
类的实例。
(4.2)静态内部类可以直接访问外部类的静态成员,如果想要访问外部类的实例成员,就必须通过
外部内的实例去访问。
(4.3)在静态内部类中可以定义实例成员以及静态成员。
(4.4)客户类可以通过完整的类名访问静态内部类。
(5)局部内部类是在一个方法中定义的内部类,它的可见范围是当前方法,和局部变量一样,局部
内部类不能用访问控制修饰符来修饰。局部内部类有以下几个值得注意的特点:
(5.1)局部内部类只能在当前方法中使用
class A {
void show(){
B b=new B();//编译失败
}
void method{
class B{}
}
(5.2)局部内部类和实例内部类一样不能包含静态成员。
class A {
void method{
class B{
static int x=9;//编译失败
}
}
}
(5.3)局部内部类和实例内部类一样可以访问外部类的所有成员。