首页 理论教育 成员内部类

成员内部类

时间:2022-02-28 理论教育 版权反馈
【摘要】:当内部类被声明为一个类的成员时,称之为成员内部类。像其他成员一样,成员内部类可以用static修饰,称之为静态内部类;没有用static修饰的成员内部类,称之为实例内部类。在外部类中不能直接引用内部类成员,必须通过内部类的实例去引用。如果不希望客户程序访问成员内部类,外部类可把成员内部类定义为private类型,如:private class Inner{…其文件名为外部类加$符号,再加内部类名,再加.class后缀名。静态内部类Inner中定义静态变量staInVar和实例变量inVar和inVar2。

4.8.1 成员内部类

下面是一个内部类的典型定义形式:

img248

当内部类被声明为一个类的成员时,称之为成员内部类。像其他成员一样,成员内部类可以用static修饰,称之为静态内部类;没有用static修饰的成员内部类,称之为实例内部类。注意,不管是何种类型的内部类,都应该保证内部类与外部类不重名。

1.实例内部类

【例4-28】 实例内部类的定义与使用。

img249

程序运行结果:

img250

分析与思考:(1)Inner类的完整类名为Outer1.Inner。在Outer1类中,可直接引用In-ner类,因为Inner类是Outer1类中的实例成员,类中的成员是可以引用类中的所有成员(包括私有成员);在Ex4_28类中,必须引用它的完整类名,因为Ex4_28类是Outer1类及其内部类的客户类。

(2)在实例内部类中,可以直接引用外部类的所有成员,包括成员变量和成员方法。因此,在Inner类内部可直接引用外部类的私有成员outVar。

(3)在创建实例内部类时,外部类实例必须已经存在。因此,首先创建外部类实例,其次通过外部类实例创建内部类实例。采用Outer1object=new Outer1();、Outer1.Inner obj=object.new Inner();或等价语句Outer1.Inner obj=new Outer1().new Inner();。

(4)外部类与内部类是一对多的关系:一个内部类实例只会引用一个外部类实例;而一个外部类实例对应零个或多个内部类实例。如例4-28中,创建了2个外部类实例object和无名外部类实例new Outer1()。创建了4个内部类实例obj、o、object.inner和new Outer1().inner。其中object对应obj和object.inner;无名外部类实例new Outer1()对应o和new Outer1().inner。在外部类中不能直接引用内部类成员,必须通过内部类的实例去引用。因此使用语句obj.showOutVar();、o.showOutVar();以及object.inner.showOutVar();。

(5)如果不希望客户程序访问成员内部类,外部类可把成员内部类定义为private类型,如:private class Inner{…}。

(6)与其他类一样,内部类也产生单独的字节码文件。其文件名为外部类加$符号,再加内部类名,再加.class后缀名。如内部类Inner的字节码文件名为Outer1$Inner.class。

【例4-29】 在多重嵌套中,实例内部类的定义与使用。

img251

img252

程序运行结果:

img253

分析与思考:(1)实例内部类中不能定义静态成员,只能定义实例成员。

(2)在内部类的多重嵌套中,内部类可以访问所有外部类的成员。如果实例内部类与外部类包含同名成员,则引用外部类成员的形式是外部类名.this.成员名。类Inner2是类Inner的内部类(类Inner是类Inner2的外部类),类Inner是类Outer2的内部类(类Outer2是类Inner的外部类)。这样,内部类Inner2可访问外部类Inner的var,即Inner.this.var,也可访问外部类Outer2的var,即Outer2.this.var++。

(3)将printVar()中的Inner.this.var++;改为var++;,程序运行结果会发生变化吗?将void showVar()修饰为private,结果会怎样?

2.静态内部类

【例4-30】 静态内部类的定义与使用。

img254

img255

程序运行结果:

img256

分析与思考:(1)在创建静态内部类的实例时,不必创建外部类实例。创建静态内部类Inner对象,不必创建其外部类Outer3实例,直接通过静态内部类的完整类名创建对象,即new Outer3.Inner();。

(2)静态内部类中可直接访问外部类的静态变量,不能访问外部类的实例变量,但可通过外部类的实例访问外部类的实例变量。

(3)在静态内部类中可以定义静态成员和实例成员。静态内部类Inner中定义静态变量staInVar和实例变量inVar和inVar2。

(4)在其他类中可通过完整的类名直接访问静态内部类的静态成员。在Ex4_30类中通过Outer3.Inner.staInVar访问静态内部类Inner静态变量staInVar。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈