展望2011

2007-01-13 | java的内部类研究(1)【转】

上一篇 / 下一篇  2007-04-27 21:57:58 / 个人分类:编程基础

5i;KH+F's%R0介绍嵌套类和内部类[java虫虫 发表于 2005-10-18 11:13:45]51Testing软件测试网1ig asS9Y

51Testing软件测试网N| Hkk H

在另一个类中定义的类就是嵌套类(nested classes)。嵌套类的范围由装入它的类的范围限制。这样,如果类B被定义在类A之内,那么B为A所知,然而不被A的外面所知。嵌套类可以访问嵌套它的类的成员,包括private 成员。但是,包围类不能访问嵌套类的成员。51Testing软件测试网&kb6[y%lCY~ Q4}|

51Testing软件测试网$~hYR]4_A&}

嵌套类一般有2种类型:前面加static标识符的和不加static 标识符的。一个static的嵌套类有static修饰符。因为它是static,所以只能通过对象来访问它包围类的成员。也就是说,它不能直接引用它包围类的成员。因为有这个限制,所以static嵌套类很少使用。

,icf,r'OFrY0

1s,M$w P/k0嵌套类最重要的类型是内部类(inner class)。内部类是非static的嵌套类。它可以访问它的外部类的所有变量和方法,它可以直接引用它们,就像外部类中的其他非static成员的功能一样。这样,一个内部类完全在它的包围类的范围之内。51Testing软件测试网BP'@w sG7M(d

51Testing软件测试网F4Y%m9? A![ ]9M

下面的程序示例了如何定义和使用一个内部类。名为Outer 的类有一个名为outer_x 的示例变量,一个名为test()的实例方法,并且定义了一个名为Inner 的内部类。51Testing软件测试网0AL7cu5j| oJ f-|

51Testing软件测试网,xD m,X5|#_

// Demonstrate an inner class.
#U] `OjZU R?!k0class Outer {
:L o_LQ[E0int outer_x = 100;
+T&Yc-x8c0

W6V*@"@E051Testing软件测试网pZ*Q"p,rc

void test() {
f[uh p0Inner inner = new Inner();
U)kH JP[0inner.display();
:H7B3L;Tk,m0H0
51Testing软件测试网#I6E/[W2W4UY

51Testing软件测试网.Ht6t1Jf

}51Testing软件测试网*wS5Qj3] VZ&]

51Testing软件测试网d t'm4J-cY/X3f

// this is an inner class class Inner { void display() {System.out.println("display: outer_x = " + outer_x); }}}

~(H B)LQ-J051Testing软件测试网t+LrLu[ }9g3k

class InnerClassDemo {51Testing软件测试网Gn-J8x?1X |

#DlA8RFr0public static void main(String args[]) {
u!k2Rza/W3M/uZ5`0Outer ōuter = new Outer();51Testing软件测试网rz{8k2S l K(h
outer.test();51Testing软件测试网N rpD;V!^
51Testing软件测试网;DL kA3g-fqA

|^,jS,aE0}
^!dnL`"`T2Y0}
'??G.K7~@$~!_0
51Testing软件测试网Z.|td7dK&v

51Testing软件测试网5@#q$sAg?.ZL

该程序的输出如下所示:

[j4^;{ {3C051Testing软件测试网(w-A/s6Qa|T&F a8?

display: outer_x = 10051Testing软件测试网~}+p Q3N"uu

51Testing软件测试网e"u Am0j]

在本程序中,内部类Inner 定义在Outer 类的范围之内。因此,在Inner 类之内的任何代码可以直接访问变量outer_x 。实例方法display() 定义在Inner 的内部,该方法以标准的输出流显示 outer_x 。InnerClassDemo 的main( ) 方法创建类Outer 的一个实例并调用它的test( )方法。创建类Inner 和display() 方法的一个实例的方法被调用。51Testing软件测试网 S!Q(~1oa#zh x [?W

KcBE%Eprs0认识到Inner 类只有在类Outer 的范围内才是可知的是很重要的。如果在类Outer 之外的任何代码试图实例化Inner 类,Java 编译器会产生一条错误消息。总体来说,一个嵌套类和其他任何另外的编程元素没有什么不同:它仅仅在它的包围范围内是可知的。

$O2u)DR W)Z$c#O%_0

Fv@4h w[U?*D1f0我们解释过,一个内部类可以访问它的包围类的成员,但是反过来就不成立了。内部类的成员只有在内部类的范围之内是可知的,而且不能被外部类使用。例如:

Ao[UV;`~^4B6A0

@d o4Tc!B IG8j0// This program will not compile.51Testing软件测试网jMa d!~%TWk
class Outer {
#m(EpxrQs]7t0int outer_x = 100;51Testing软件测试网U i4Vt X#T?Q
51Testing软件测试网k!uU;f}!B

51Testing软件测试网%IR}N1J*` Q

void test() {
,J8v\'uX0Inner inner = new Inner();51Testing软件测试网(R`:nB XB5E:W4zf
inner.display();
"zA&?-CA(s0

c-Zh q0{Q9Kt2f.pw051Testing软件测试网du!YT/zF f^ o

}

"[-RZn u{0

#B"g&kX-C~0// this is an inner class51Testing软件测试网7?!Px(Ay!N
class Inner {51Testing软件测试网k#V7k\ ]![ []
int y = 10; // y is local to Inner
u7] |TWDsO*G0void display() {
p1Y S`i0

k%_)R;W#t z0

rs3s^Rq0System.out.println("display: outer_x = " + outer_x);51Testing软件测试网E|ma;bOi^
}
7LEQ5iq*@0}
:~oc1h7v ^0

XHao.g8Be%O6F [9I0

&y;H-F7uf#c@ DFP0void showy() { System.out.println(y); // error,y not known here!}}

%\7wnNxW/SY0|!f+?kp.p051Testing软件测试网%hJ7w&U/_Nm&{~

class InnerClassDemo {51Testing软件测试网d\-{,G%F)QnU

W0d6FM8?7TFz6N/F0public static void main(String args[]) {51Testing软件测试网3SM0E e8V0z
Outer ōuter = new Outer();
4[jHuU S0outer.test();51Testing软件测试网:lSuhl [_

jLO0_n\m%}*B8r0

U3r&mPm6u{,y0}51Testing软件测试网(\ wjfH:b6as
}51Testing软件测试网%Ot6W1erZIf
51Testing软件测试网Fw0}\.q['AS

b%|V&{-HY0这里,y是作为Inner 的一个实例变量来声明的。这样对于该类的外部它就是不可知的,因此不能被showy() 使用。51Testing软件测试网Pjs:zO2{8V

k}-k x:N)y1U$S _U0尽管我们强调嵌套类在它的外部类的范围之内声明,但在几个程序块的范围之内定义内部类是可能的。例如,在由方法定义的块中,或甚至在for 循环体内部,你也可以定义嵌套类,如下面的程序所示:51Testing软件测试网];c)ir-t,|

Z${MM|X0// Define an inner class within a for loop.51Testing软件测试网iU6}4Q]N m
class Outer {51Testing软件测试网m(}3^q:@?qm
int outer_x = 100;
p,S5`SE.KJ ]F0

Ge)MRH a/{051Testing软件测试网5u5KEO6ZS3|6h

void test() { for(int i=0; i<10; i++) { class Inner { void display() {System.out.println("display: outer_x = " + outer_x);51Testing软件测试网8h.F W$SAuE

C7qbk8[#v(K5~0}
9X1o+F!z)LBIA#`x0}51Testing软件测试网#B4N!l!^(K2Z;Pg%R
Inner inner = new Inner();
CM)a/{6b9nK0inner.display();51Testing软件测试网 y%T(Z;{]'f]0R[R

OyU u ?&k;M0

` o1N ?:^7`Jq9vg0}
S~ d4o5s4^0}51Testing软件测试网)O,zTz^'Y%t
}
Q*{5j R!i5r.^`0

6@0^\n?5E051Testing软件测试网y sI6u o9R/h}?l

class InnerClassDemo {

#` Bny)h051Testing软件测试网v.GE|f1_d

public static void main(String args[]) {
-`{ouD#yF1n0Outer ōuter = new Outer();51Testing软件测试网.oc7j)Ox8Dg){S
outer.test();
s@9t9U-X"H0
51Testing软件测试网Sd`rCx:Y{

51Testing软件测试网0o/K"`M%fo!J

}51Testing软件测试网V0X%X/UO X/j?
}51Testing软件测试网G2sVI!qp&f$[

B H:t8{?2s0NTf0

5W*o|-d^AD h1B_x0该程序的这个版本的输出如下所示。

[{vq&jr0

rD&F*weK{0display: outer_x = 100
.k(~?*k~0Fo S5_0display: outer_x = 100
x.t n KU0display: outer_x = 10051Testing软件测试网Wl'QY@E

5U{;f0?@&@|4oR051Testing软件测试网KY#K'UTwIT"J(R

display: outer_x = 10051Testing软件测试网1\ X!I*S Z7@7P}
display: outer_x = 100
E}X6Lo0display: outer_x = 100
s&mo4@i#t%?.I#l0display: outer_x = 100
-QFp@x?Qp0display: outer_x = 10051Testing软件测试网9]#y7e+ZKI
display: outer_x = 100
HX |P D'cp4A~0display: outer_x = 100
N6S ^)U9lP:s0

-? Q uo],rX051Testing软件测试网%LKt*a0p,uH3n

尽管嵌套类在日常的大多数编程中不使用,但当处理applet (小应用程序)时是特别有帮助的。在第20章中我们将继续嵌套类的话题。在那里你将看到对于某些类型的事件内部类如何被用来简化代码。你也将了解匿名内部类(anonymous inner classes),它是一个没有名字的内部类。51Testing软件测试网6nbC |5{7\oS AL


TAG: JAVA 内部类 编程基础

 

评分:0

我来说两句

Open Toolbar