展望2011

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

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

Java内部类

V%cJ.f.e r/O6n:n0

fe&vdv0简单的内部类定义形如这样:51Testing软件测试网'w;kmD] sue*wMQ0dg

51Testing软件测试网x.j P4@ q

class A{

sRC#Lh to0

| Aj,hg]0class B{}

H SH*q{-q:J$r051Testing软件测试网$cV*L-S4T RT&p

}这样的类被称为内部类,又 被称为内隐类.

,fwM1yfFh0

8D/}H7xd V7_C+n0从简单到深入一步一步的分析内部类的特点.

u ~&YKHB0

oQ*_V8C.k7{5E ]0} |0 class OuterClass51Testing软件测试网s Sf;^ K }S

51Testing软件测试网 y?;So5`1]Ewr%U

{   static class A //静态内部类

K6W7nYNf2{'mn051Testing软件测试网Q6|2y'V8[Q^E'|%E!b3N

    {   public A( ) 51Testing软件测试网9m9]L:wt0U|

51Testing软件测试网{Kfr&h'X

        { System.out.println("Test$A !"); }    }

t9_Q0Em0

*p#O@?6OK,Y kp0    class B  //非静态内部类

O`)nVE9fY.y051Testing软件测试网J/@JFU1e

    {    public B( )   51Testing软件测试网z C%?Gb!s

51Testing软件测试网)n(z|x5A.y

         { System.out.println("Test$B !"); }    }

Y%O(wd)\uWH{ G0

eWp$yHQ3}0   public void disp( )

H)}7C(Rx051Testing软件测试网v |x}.[[@

    {      51Testing软件测试网7U:H5gM kCy

51Testing软件测试网N2[AD8`(r e

        final int a=10;    int b;

]Hd o0]r B)|N051Testing软件测试网\]X/~;EU0ioo.KO

         class C  //成员函数中的局部内部类51Testing软件测试网YT*[ ag)q

7}"YR&~){0         {  public C( )

v#X"_3K9{)|9t0

Q1FEt#f}/O0            {     System.out.println(“in class C a="+a);51Testing软件测试网q;B*Z)\N$Zt.f2]

51Testing软件测试网KmS LYJk

                  //System.out.println(b);      51Testing软件测试网MA8D&z{hmX'P

51Testing软件测试网ge}T]J

              }

'FA%C~i"Zf2\051Testing软件测试网Uf|,z|N

         }

'I!Gv#`ec/Y0

QZ pmTc0         C c=new C( );

0U;W2ZZu[ lRIy4N051Testing软件测试网7|{{;m0RYV3R3r

}  

Z:q-RQN8tbTRf f051Testing软件测试网:?Q9v"Q,`D p

public class Test extends OuterClass51Testing软件测试网.w8e(N#aO2~v

51Testing软件测试网7x;uC6@T

{51Testing软件测试网6O p5vLf_

#RM2t.o.PQl?0   public static void main(String args[])51Testing软件测试网4\k"FNjcO#\

5k4k6Z(R7l0  {     OuterClass.A a=new OuterClass.A( );51Testing软件测试网 RZ1o7_z t*z-Cj

Z%M l MA%v4@9Y0    //建立静态内部类对象

N%C{,@ m4]^ [.w0y;j0

nD7[5ZWt X@0        B b=new OuterClass( ).new B( );

"m5l1R ^7|*c#L1X(E051Testing软件测试网"T4SA A6`Pl3Pf

    //建立非静态内部类的对象

Z-s0X8VFj+U0

h#[U]/x1O0    //注意这个OuterClass().new B();相当于生成一个外部类的对象,然后在利用外部类对象生成内部类对象51Testing软件测试网aV*E `7Zpy(i

5_&[}u[+z0        OuterClass t=new OuterClass( );51Testing软件测试网6S ? U5EY8^8Q

0L:^ fZ!cR0         t.disp( );

$iJWv!l?9_Mc0

[EE.B ~TR@ h)QF0    //通过外部对象调用一个对象方法的形式,新建立了对象C.51Testing软件测试网u%N5W+W T:b

6a ~T \&s0  }51Testing软件测试网'aQIF6f0JVr

B!p0S9s(^'c#WQ0}

G]vnh'^9G051Testing软件测试网6XDK`#K6w

注意在上面的b在运行时会为0,因为是类属性.51Testing软件测试网x4Ld/ZCa

51Testing软件测试网oWS jc~ }n

class OuterClass

5P X Q'E{{h)I? gS051Testing软件测试网^D&P,R{ qi

       { 

q%EU@GwR0

d3UTc cW }t0          static class A  {   } //静态内部类51Testing软件测试网C"M!C_8HNw

$AR rQ%lz0               class B  {   } //非静态内部类

e.@/i*K5dE8Dpgog051Testing软件测试网&J!L3{b(m;n Qa k

                 public void disp( )

8L&z2Y'A+~H U0

l7LB2W]L \0                 {

}Ye8mH051Testing软件测试网.R o(F3j7S;}2P

                    class C{ } //局部内部类

'w/U2?_7Fe#I|v&d.g~051Testing软件测试网 u@W6J V{l

                 }51Testing软件测试网ia4U P P+A#X q

7? J T2c#th-S$g7t0        }51Testing软件测试网-MS j ~ei)R d r

(o6xy.b\9[{7B.Y0编译后的结果:51Testing软件测试网6i9S9Iq#]

/[4Uu1Ght j0OuterClass.class

e Tx/lG Q0

M%V3d#I,g S*n2mA0        OuterClass$A.class51Testing软件测试网au)kR&MRx#E@

7]|+iC] M0        OutClass$B.class

e]rs Pwh051Testing软件测试网'jv;dH)^(cy0uQ4I0J

       OuterClass$1$C.class51Testing软件测试网DqnJ-~F#G

51Testing软件测试网 WDL"G I

记住以下几句话:

I}1U0q;rX051Testing软件测试网TFISh#y^@

1,一个内部类的对象能够访问创建它的外部类对象的所有属性及方法(包括私有部分)。

vf.O6W,R7R w(aw/?051Testing软件测试网7zb Ntb L aor

//可以闭上眼镜,把这个内部类等同于一个类的一个方法,当然就可以访问这个外部类的51Testing软件测试网%yM"G^?3f%Y

51Testing软件测试网)qoZS7wf-b`

//所有方法和属性,私有方法和属性是属于外部类的,当然也就等同于内部类的.

o7x,K)M/o7eKW0

9J A;t`x6o'H&XT_02,对于同一个包中的其它类来说,内部类能够隐藏起来。(将内部类用private修饰即可)51Testing软件测试网|&XGsI2\&\$U

4s7n;p*]|3mB ?0T0//只有在内部类中,才能定义一个为private类型的class,因为这时编译器已经把这个类看作这个类的成员了,但是在一般使用时,就是所谓的”顶级类时”,不能使用private,只能是public 或者是friendly.

e']VAhku!sD$l1Z9j051Testing软件测试网(j1R&C5P3H4s5k

如果要是想保证一个类不产生任何的对象,请在构造函数中,把构造函数声明成private.

s#J'eUa\"^F5P'Fy051Testing软件测试网w9ql6Ta4`9FDe

3,内部类可定义在方法中,称为局部内部类,但它只能使用方法中的final常量。

)]:?? u oGB0

m%`&s0A |4F z0//定义在一个方法内的类,又被成为局部内部类,这个类只能使用在方法中的final常量,注意,这个常量是在一个方法中的,那么能否使用一个类中的常量呢?51Testing软件测试网?%x!s*A!c%ja \e

51Testing软件测试网9W4~+SC T"s.{

当然是可以的,因为类中的常量在在一个方法中是可见的.

C*Gx+dD051Testing软件测试网S5F:bR0fF

//51Testing软件测试网O2^4^^*@

u;_;zT?K%Rx0如果把一个类写在了一个if中,比如这样:

v TR ]a"}I/l051Testing软件测试网 L#^)k X`lFp

class A{

(\4_4g)Nc.u*m0A|]0

F{'e6M5D;|l8e8j0    int a = 10;51Testing软件测试网)I%rx%K@

Uks/LW;j7F1erhq0    if(a!=10){

SJjz o` {Q `[_051Testing软件测试网 K'u#\Vj_%Z

        class B{51Testing软件测试网%i4g)vp fa:m-L"I

51Testing软件测试网6?6E6I|5@;G:{9S

            B(){

*CE ?&]W ^gC#`-g&M'D0

a op'Wv0                System.out.println(a);

e5Cw)l3G#Y/~3T0

3}*E^VvbQ%E J0            }

:JB?$FQ051Testing软件测试网)}%v.|}J|!Y,M3c

        }

Z'GUEL F5U2X0

/nenR-n9`/Bs0    }

`+R,S$_ i9B ^*UE{G051Testing软件测试网)X u]qE.aC3_0JK`

}

t_D@&B*_F#I'H0

-w^0p&rn gq0在编译后会有几个错误呢?

1ssBp`va0

3e o ] KqH0首先那个a没有被定义为final,你有一次上了圈套.51Testing软件测试网PxR:?!j'Ls4i

:RSl-L ZNA"j F7t]0类B同样会被生成出来,只是离开了if域就失效了.

9W'kP\e'w0

:PH1h,D#S~Q?!d@04,内部类可以被定义为抽象类

%qo;j6vsR6y_h?051Testing软件测试网f:e V#XR9b8m

//abstract 类同样可以在内部类中

2fr!EJk;L7bX#u051Testing软件测试网3reJ-E"E[%t}'z

5,非静态内部类不能声明本类的static成员

$e0V ro!Sm051Testing软件测试网:qL.m%?E?"c"Sf

//只有一个静态的内部类,才可以声明一个static成员,51Testing软件测试网E o} ? YE

:a&Lf#rH u0class A{51Testing软件测试网x,W'{j9v O{L b

Mb p|+v4M^H0I0    static  class B{

:wB5`xc3D051Testing软件测试网e$cIaTizn)J

 51Testing软件测试网vJS_[

!_&v}W"F1D y0       //如果这里不是一个static类,是不可以被声明这个gg方法的.

0ig;J;VjZ QY0

&N W [}0i&[ q0       static void gg(){51Testing软件测试网@aQ2~N"aV

|Jgo6_] zl$d0       int a = 100;

r)VO%p'e'\t:A-@0

yLj/Al"Ru0       System.out.println(a);51Testing软件测试网K1{:\*p%X"JS8P

] Ad-iBRI/x0       }

.G:Gv9XG1bNi051Testing软件测试网?"Z6g:~ _+x&P'h9D

    }51Testing软件测试网I^-E:Q{BS

V*]6jc3xN0| @0}51Testing软件测试网@k:Nhh3n

ayW#U luD$t7Z+^ QL0class aa{51Testing软件测试网-ioG{g-S f;|

51Testing软件测试网:|Bfdxq~

    public static void main(String args[]){  

w$dA)J:C5DPv0

e\;@1U0y-e1Ed0    A.B hh = new A.B();

$h"n _)~ ST$Q051Testing软件测试网,T:u,B3PO~

    hh.gg();      51Testing软件测试网e b&fvphLA

FUV%@:v#seTo0    }51Testing软件测试网3Y-O S*qcPN@*H$i

(p#D)O0c e&o1q0}

T!C!wo'v+m.p] J0

7Q&@+h v u!V0使用内部类可以非常方便的编写事件驱动程序51Testing软件测试网zw+Z3r.B&S U

51Testing软件测试网,Rd-[ ahu(z9BA*y3p

这个在写事件驱动时,会有很好的解释.51Testing软件测试网ZK|4`)eO F

8x0|P R%C&J n0匿名内部类

k7bV.L4GShK5}0

$t[ZM!oH6F!c0在某些情况下,我们只需要内部类的一个对象,那么我们就没有必要给内部类命名,没有名字的内部类我们称为匿名内部类51Testing软件测试网5~/x KC'{wtY

cc g c!{Ze SG/Y0public class A extends Applet

I@(kZAqS051Testing软件测试网3_~"q3Sf7um%m'Q

{     public void init( )

*oQ3u0gU0

3^i/J-eX.\8IR q0      {  addMouseListener( new B( ) );51Testing软件测试网1p\)JMe6Q Q2Fu\a

51Testing软件测试网W/tYa.}1H

      }51Testing软件测试网9E^-d+T4N2sJS

51Testing软件测试网 y0Hc8P8n5^TZ

      class B extends MouseAdapter51Testing软件测试网 _3?Cn!YgY

51Testing软件测试网l3K(W&_4ct

      {      public void mousePressed(MouseEvent me)

3P+TL8n+| ?051Testing软件测试网A1Pw Z2D

             {       showStatus("Mouse Pressed.");         }

/S7@4b"t,BrC0

8k,BR NJ&|0       }

(b8B g@0X@051Testing软件测试网.dN s6JBU

}51Testing软件测试网 eZ0G] ^g2N

51Testing软件测试网^)Xn"b,Lx8G,^,K-NdE4Y

用匿名内隐类修改:

*H7_F}D051Testing软件测试网'v(N.XNX

import java.applet.*;

2U'n `3K b4D&N@(W BcW051Testing软件测试网 v8EFX$_'{%TT

import java.awt.event.*;

T.i:\t4t~0

`MKyV)JOtN'G0import java.awt.*;51Testing软件测试网C(C3vO/ypF8d-d7y%N

!a)V_{;[dt0public class AnonymousInnerClassDemo extends Applet

``wUCO]2q I*ke051Testing软件测试网,i d.U/z5nE

{   public void init( )51Testing软件测试网b/eTj6R(w0\ |A{

51Testing软件测试网 ?(p,R$Cd%t

     {   addMouseListener( new MouseAdapter( )

7j[3pR U^(a;S"_051Testing软件测试网On.{$Ct{$H0w

         {   public void mousePressed(MouseEvent me)51Testing软件测试网 O r9b^1|Mrw

.I9j N-o1t+T+C0       {  showStatus("Mouse Pressed");   }     }    );

"D Y]lG|r}051Testing软件测试网+Pr.m7fMwIG

    }

?1a S8E;[\P051Testing软件测试网lNP^c

}

*g;aDqs TO0

:KsREQ0下面是一个think in java里的例子51Testing软件测试网 iA @DJAZL

51Testing软件测试网VChevjY1]

public class Pr{

b6IHL)I$~051Testing软件测试网r._bF$d!f rau-rN

    public Concents cont(){51Testing软件测试网Z6F4uoRl

l{[ th)G@QS0        return new Concents() 

'\Y QJ2hd0

H R[C6UNm0            private int i= 11;51Testing软件测试网{5IR_$q

51Testing软件测试网#|-zp y `

            public int value (){return i;}51Testing软件测试网1Onp"C3N!{S

51Testing软件测试网*Qb1Gd&T'l7qQ%v,~3{

        };//这里是有一个逗号

Wk {@!UR0

I vY)C&D&bj"VQ9Ah0    }

i"Dt~0O(O S8PqK0

$rulz2emY0}

{ K{fy051Testing软件测试网&eGm8N|Sn

这个Contents是通过默认的构造函数产生的,匿名类的产生也就是一个新类向上转型到父类的过程.

I jqP2L-g@0

%FBn!H3R ^/zL|?0那么如果一个父类没有一个默认的构造函数,应该什么办呢?

e0R#X_.ITd]G*pu051Testing软件测试网]G,Q8Pz4|

那就只有调用一个super()了.

8^C4T*@3D0

"cAC |1E*E'\ f0class noname{

Yi` me051Testing软件测试网2t M+AR:xr#ru6Z]2_D

         Warpping wrap(int x){51Testing软件测试网rhLM?0Nzm

rGv T g1^0        return new Warpping(x){

NRU3Nfq5BD&n0

DsM#RQ t#Pt0            public int value(){

{|.|#xb3Y0

1A C KI:z+{-Q)}L0                return super.value()*47;

Bp {d@kF6K H051Testing软件测试网b1IDw4Hp!F

            }

0cK,BbP6x;AsF[X051Testing软件测试网d*S EX,T8V;v6`

        };51Testing软件测试网F*|-\;H,S T

/f)x jf@i U&vk:I0    }

LbR:~!jG!f0

[5jGi2suw;L0    public static void main(String s[]){ 

*@){PgK9B051Testing软件测试网K1Wc9~+g2m

        noname p = new noname();51Testing软件测试网,Xt:[%i:[.AOB*A

$L&@'To$z7WZFNA0        Warpping w = p.wrap(10);

%z.Dp c T$s G051Testing软件测试网P9M/J G.k&P5q

    }51Testing软件测试网:t?ub$`L S9]2f

*h6QRrH0}

|V[Ev J&y P051Testing软件测试网@1CP h `Gbo#{6T

如果在匿名内部类中用到了外部对象51Testing软件测试网!Oz$@9J'_4Rk:zh

n!l a N&bH~)H t0就必须保证这个外部对象是final的

-NW9xf;r:bsv;un051Testing软件测试网k2ZYQ%DA@

public class PP{51Testing软件测试网g u!i0CK2ta|7|y

51Testing软件测试网;Y2G&is,W.E

    public DD dest(final String dest, final float price){51Testing软件测试网f1e$x:C\2qo&gl

&{Ezh3o%m4\b0        return new DD(){

A?;e5XM1cxXY0

Ak5L1_2y+H/[,n0            private int cost;51Testing软件测试网ZD2BQ9U fK&s

&?b5J#wOm'B0            {51Testing软件测试网 N\'s c:y?

'h uay q:P7\%P/Y%T0                cost = Math.round(price);51Testing软件测试网"SNpN(Na JTB

51Testing软件测试网g._Nhk3~&Ks

                if(cost>100)51Testing软件测试网XD)|6Ra0k

51Testing软件测试网o(j&pcW!U2Z r

                    System.out.println("Over budget");

\Y%~A.se~'v0

k$B(wb_g0            }51Testing软件测试网;b9FU1z f9Mt8t

$N#`C5P`1`1I-i HQp9f0        };51Testing软件测试网$qH5e[)UZ,e(Ci#Dn ]

51Testing软件测试网8K d;h#jY@ Nx)N3}7s"t^

    }

F+_5\U4Z051Testing软件测试网E+WDO7[:i$N:W/T

    publc static void main(String []arg){   51Testing软件测试网2ay[0K!B pSxM

51Testing软件测试网 @"cD6^K;ZnW]

        PP h = new PP();51Testing软件测试网$QN3HV ?&fp

51Testing软件测试网)x4vvvD4QIx"s

        DD d = h.dest("haha",11.111);51Testing软件测试网/sv3~"N8? oN

51Testing软件测试网?#tC ~-s(CV4\B

    }51Testing软件测试网6K!jg^4ML k-R{

$\l}.~1s9d4y0}51Testing软件测试网%z8j+kf5yu~ m j;j


TAG: JAVA 内部类 编程基础

 

评分:0

我来说两句

Open Toolbar