展望2011

2007-01-05 | java的Package与Imort机制【转载】

上一篇 / 下一篇  2007-04-27 18:03:08 / 个人分类:编程基础

从一个简单的例子谈谈packageimport机制

"U~Lr"K EJ#?!l(X051Testing软件测试网&_UA5_"N&Z5}&a X

51Testing软件测试网's'B:A`a2OH p)Dx9W

#u mm)h5U @0

BxJ[&H5y0基本原则:为什么需要将Java文件和类文件切实安置到其所归属之Package所对应的相对路径下。

%F_"X}9Fs0

,iOZ\uJ0

!xeecJ,Z0Zb0

ZM$dj'u k!|#P1n0

1Ky`2@~t0

q P^ydE E2x0

#F0v_n Y3v0为什么要这样做呢?如果你在程序中,用到打包命令package,并且直接编译和执行该程序。例如:以下面程序为例:51Testing软件测试网0x T$Lb3Nxi i!u

2OB6o8En5o(\ B4|0package a.b.c;51Testing软件测试网mV8\e0\&V4Rq

51Testing软件测试网8g1G Fj!h'Ws

public class hello

)wwJ Y&r L_'z051Testing软件测试网 v$i \;Ep

{

kP K D f\ff0

hu#n1gL%c7[&l0  public static void main(String args[])51Testing软件测试网8S:_?)mIY{#z2[

I _1Jm}7V9I b0  {   51Testing软件测试网 Bhg!GXW

51Testing软件测试网0J;n2o7{?D&mQ

   System.out.println("Hello the world!");51Testing软件测试网+Coa'|(u K

51Testing软件测试网CCg*cIJt3F?N;R

  }

d%H+}*Fk051Testing软件测试网MV$M*Y&Mf'})S5t?

}

5EeHRQCC+|051Testing软件测试网!k ?5R3t.n*v*Y?

此程序可以编译通过,但是执行时,却提示以下错误!51Testing软件测试网L&Ot!W5x4p

1Rur,le0D:\my\xdj>javac hello.java

3i O,yIa!d#fF0

&K"L1BSLN051Testing软件测试网zBX,i:^&f

51Testing软件测试网)k!h)[cG Cb

 51Testing软件测试网 bWk EC

51Testing软件测试网/[$i-W*^/bT^a!og-S Y

51Testing软件测试网Fl+b3{$|*q:^H M

8Vw,s)?g4Q [0D:\my\xdj>java hello

:\1y"y:@L%y'h051Testing软件测试网a2m'wYrT0}G kh

Exception in thread "main" java.lang.NoClassDefFoundError: hello (wrong name: a/51Testing软件测试网P6s{5O;w O7Z$P

51Testing软件测试网)xgq-k*TKV

b/c/hello)

)b6k7K7_!].]051Testing软件测试网'DL T/U V2F+j]~ ux7{

        at java.lang.ClassLoader.defineClass0(Native Method)51Testing软件测试网&YmtN]

/w:\C3va-Z'v0        at java.lang.ClassLoader.defineClass(ClassLoader.java:537)

p? hbMeE2o5v+X0

*D y._ M:Ax_0        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:1251Testing软件测试网 L U[*Le-XA]Q,y{

{+T8zsFX7SrA03)51Testing软件测试网(?D1X~M9E nm/y`

51Testing软件测试网s9Q4Cg \hm?G q e

        at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)

8_Q _ CFV3I.{051Testing软件测试网2R Q8hVG,x

        at java.net.URLClassLoader.access$100(URLClassLoader.java:55)

N;A R6v/dE8dAD*U6|0

o[G8`OV XLW/y0        at java.net.URLClassLoader$1.run(URLClassLoader.java:194)

3v[)R s\2j;Rqn051Testing软件测试网:o5l2tT SP u Us

        at java.security.AccessController.doPrivileged(Native Method)

L KU#S8n0

&B6ZW['z-}:~7y0        at java.net.URLClassLoader.findClass(URLClassLoader.java:187)

`&mR7AYQ}051Testing软件测试网9V6BB WV.I} j He

        at java.lang.ClassLoader.loadClass(ClassLoader.java:289)51Testing软件测试网/duz nR)DFb

y [y p N(Q1hb0        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)51Testing软件测试网Y O'a~&A2W~t

51Testing软件测试网2UvzL t R

        at java.lang.ClassLoader.loadClass(ClassLoader.java:235)51Testing软件测试网'tk5KiZ$]$P4E;jl

^,k;F/y ft'r"Ot0        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)51Testing软件测试网!rat9_{5D!T~

51Testing软件测试网 {v u.nN N

51Testing软件测试网 Ad!glm

6bY!m1x ? g Y5]0 

9E*pN{ z051Testing软件测试网)|k*~)nz ~1~

7Q ce];hmg3I051Testing软件测试网3MQ/N)kG N

D:\my\xdj>51Testing软件测试网;w+TR7{H#V)w)q_ y:I

51Testing软件测试网t@,M~cwR m"S(O

51Testing软件测试网yF w1cT

51Testing软件测试网|/{.^1H]

xdj目录下建立一个\a\b\c子目录把hello.java放在它下面,用以下命令进行编译和执行时,可正常通过!

{+BkN'L ??Vm051Testing软件测试网t&x.g i,Y:]?4Pf

51Testing软件测试网:{2| K s\ Of cln

51Testing软件测试网(P-x'Q9Rj N}\ I

D:\my\xdj>javac d:\my\xdj\a\b\c\hello.java51Testing软件测试网rV F@uXL

51Testing软件测试网?%cta(n"C

51Testing软件测试网,Kh-pVO-d L

v iX WQH5I,R._0 

?-h[k G,aj&_0

"_7S_2L7~+y/j0

i(xuK zN y _0

6U,rV/bL ~f0D:\my\xdj>java a.b.c.hello

!W!b[,[-yV8z0

/^+[1Q3J)L;y0Hello the world!

;e'jr)r!o? p051Testing软件测试网4Jm%IQ,y?.V0P/@4E

{wY7q)w+^E3rf0

5^c|m.Ip_\_0 

_)P1t+] O&lx?H#e051Testing软件测试网({eL$mT

o;}9`N%s0V"m0

e J5F,e0o0D:\my\xdj>

i5G @,{ U y ql0

&T|/n-X%X"x051Testing软件测试网 ST FAS

,T'^8Jz+i#l(C0 51Testing软件测试网xF'@#[\)L7`8f

;_ F q$B`\0

E?:~3XV.i0v051Testing软件测试网0e\y:v Na(T1uvO

再看下面另外一种情况,先让我们在xdj目录下建立两个文件a.javab.java文件,其内容如下。

5sw"^9ks_051Testing软件测试网5_3bvzL

a.java文件内容:

\"lT|E C#HrLJ051Testing软件测试网5k`"C!VRK$b

import a.b.c.*;51Testing软件测试网6wq-\T"Ix9L.a s

51Testing软件测试网'b`*J1o/J C

public class a

j^6y4g`I*U0O051Testing软件测试网"\Z7V8C*^+t U*n

{

d,m,_jg:]R051Testing软件测试网:~5ZO%f `zD#f

   public static void main(String[] args)

/i'@"y&N5H,F V9v?#g051Testing软件测试网)OiJIW_2JF

     {51Testing软件测试网6|:nqB%k6p%Ip

4dY~|VbmF0       b b1=new b();

ar__7w['s6]0

C&| E(Q&f&uO0       b1.print();

$AA1X{V0

!P)vI#S_3\2Z5`0       }51Testing软件测试网A:D*_6Q%G0B)?(e

'aW7\2[Wysq!xU0

&^T.l9cF1z051Testing软件测试网x } LE&^#S UMP

 

,G n)o(Zo-F0

0u]$j0r|hy@0

_Z+d6gH5i B!p.aI0

cH*M:b2?+Q8n!?0}

&B(aY@}6v051Testing软件测试网4CKDAY-@V5Vd

51Testing软件测试网_%l%vT!o a B&HU

/el)|X b0 

6[s\ba n)QK0

1d)F B2da0

mT[ez(KR#K8f051Testing软件测试网4Q/W+Zx5@\^lz

a.java文件内容:51Testing软件测试网.@-P1N-\-P[H

c/? {^ZnP%F0package a.b.c;51Testing软件测试网6YL.V!Mf!b3X:Z

51Testing软件测试网_ U @ERm r(XV

public class b51Testing软件测试网T&cE!`7i

51Testing软件测试网PU r"p _'uG3w

{51Testing软件测试网$K!Q2NI!w}

51Testing软件测试网G-Mj4zd%u9{$X,U

   public  void print()51Testing软件测试网-@2E6tb9Z

51Testing软件测试网j:_!t:L Ed6A]"G{ A

     {

N Q'@ v_cUt,Dk0

PFg~s%[d~a.\6| kq0      System.out.println("我是被调用子类的程序输出呀!");

7M&r7w9f2N#vQ0

Y-i4[9Z)N [;b4j:@N0       }

8BawL0g051Testing软件测试网g4\W,\z*c0nH

}51Testing软件测试网 s'Qs d8Y

51Testing软件测试网2Oss KHK+d c sw

h)zHz&H{EVx051Testing软件测试网&}$L rfY}B*Wuk Q

 51Testing软件测试网"U v6Vb i;PI`

51Testing软件测试网w B]3kcBwGue

"DRT;LA a,?/J0

7sJ%uoM:Q W0直接编译a.java文件时,会提示以下错误!

7u e:]V&f]051Testing软件测试网 y UTnV-K

51Testing软件测试网F'?FPlXF

0Oc n,^~'y&P'Z,r5Z0 

e*Y%@w \#J9uJ;`0Q051Testing软件测试网,D(Q2d8E)c,rN:_

7j0]Aj6R{WvA051Testing软件测试网1BH+g u"?;P V Qk'U

D:\my\xdj>javac a.java51Testing软件测试网 M[WMtX

51Testing软件测试网'b^;GU*Zj)G

a.java:1: package a.b.c does not exist51Testing软件测试网+c'@0~K&zt}

%b\5py d9Sj e;F4I0import a.b.c.*;

RH/{,HPNy051Testing软件测试网\?7v E[(O1J7b$~

^51Testing软件测试网[-r:n%g f

51Testing软件测试网` c;E o8vmI_

a.java:6: cannot access b51Testing软件测试网'KUPn \ }(}4[Tl

51Testing软件测试网5Wdz!V+u6D

bad class file: .\b.java51Testing软件测试网'Bu u;M$O1T

51Testing软件测试网&i;a6C4pE&Qy

file does not contain class b

1@/H+fy {a$i0

:\1hFS,r$e0Please remove or make sure it appears in the correct subdirectory of the classpa51Testing软件测试网^ bl3lx!O

51Testing软件测试网&?*V,b.M5Q%n

th.

$G5yUTLzX051Testing软件测试网{pa9G k1k U

       b b1=new b();51Testing软件测试网9O1T8Mo!a9C-f_dvp

&k(Yn6c9e0       ^51Testing软件测试网b)GjTX R

{FI+OQUk02 errors

Z-?7xb+v Y6F,d#Cf0

H }/N5D w;Kp051Testing软件测试网a$a6O!dJ

Oc+`;h/L|0 51Testing软件测试网|~o` n2z't BUW

51Testing软件测试网 ` Cp#b/t]

51Testing软件测试网7]5] Ti4Jn!}Jt

@VW(n w?[6B0D:\my\xdj>

2_:ZU(bpT,{m:Zk0

5Hh b k%D0接下来,我们把b.java移到xdj\a\b\c\下,并把\xdj目录下的b.java删除掉呀!重新执行编译指令,这次肯定可以编译成功!你可以发现b.java也同时被编译过了,这就是所谓的make编译方式。51Testing软件测试网8{|;OrX4r.i

51Testing软件测试网,d2kO.A9@%o7U

.aQ1Lv~0

S:Z u+} f.u0 51Testing软件测试网1uf |!AI

51Testing软件测试网NI*y [yIO

6nb [.L8zr051Testing软件测试网t d/ya4p S

D:\my\xdj>javac a.java51Testing软件测试网6I0gN p@{!Q

%SF+^;?0`/]r#Es_0

r;qdO|#q&A051Testing软件测试网0Yl%H:Qy8b1a1P{

 51Testing软件测试网t7PY,z}_4R6J

51Testing软件测试网9r/S#}vZ%dr2@

51Testing软件测试网3M8^5c'`5m(R8Zc

51Testing软件测试网c%@ _'D9p9B R}8m'G

D:\my\xdj>

D9xBmc K@A0

d/kH(?E0

ht-D4R*f)b051Testing软件测试网[6OR ESL_c9o \

 51Testing软件测试网au#oz rA1|

51Testing软件测试网tH$`9mn8V

t5AN h(L0

4oe(Dr-@1w0提示1:如果你在\xdj目录下仍保留一个b.java文件的话,执行对主程序的编译命令时仍会报错!你自己可以试试呀!51Testing软件测试网 {3L*C1qC9VB

~;J$wlS8H`e#k`0提示2:如果你删除\xdj\a\b\c\b.java文件的话,保留b.class文件,执行对主程序的编译命令时是可以通过,此地可以不需要子程序的源代码。

?g/yt3RE051Testing软件测试网7Q,G.E3X0KT

51Testing软件测试网a @ ox&y

(H)qb$T9~ y8sa1u0 51Testing软件测试网#H |Gu9s,C:U&i'\f

;gD8e0`.Lm'k5\,O051Testing软件测试网 |.U.eM2Rt{\

w]l![!T-X0提出一个问题:如果把目录\a\b\c全部剪切到其它目录,如D盘根目录下,在\xdj目录如果执行编译和执行命令呢?

)Kd[HL'_B051Testing软件测试网E'gD]0s2XC ]

E#c BS ?goS0

DL:z(?-U'h`051Testing软件测试网_E.iN"]

Tft8b[1@S S0很明显,会报以下错误!当然了,前提条件是你没有设置classpath路径,其实只要没把类搜索路径设置到我这个位置就会出错的!你试试吧!

k{ c;FuAz;{3|`051Testing软件测试网XA4k*q"hd/w2s

51Testing软件测试网S-Vz k+C

51Testing软件测试网-mDst1XZ`x

 

A#oB2oY$O X051Testing软件测试网 } W$U0B4b0nG#J

i6ucPx4Cn0

)@ [ioi#C2J_8_I0D:\my\xdj>javac a.java

;q$EO s7UR(L(qC3R051Testing软件测试网2Wub!V'H2W

a.java:1: package a.b.c does not exist51Testing软件测试网Z+`+z*Q8X3ao f;i

(^u)~]!}A0import a.b.c.*;

!Q[]3de051Testing软件测试网{M(@T$ENy2]

^

9T&R&_`0Y!sf|K8g0

0H5y x5`:i0a.java:6: cannot resolve symbol

sqtP9s0

O*@"}3w!dDGT!E0symbol  : class b51Testing软件测试网4n4Uq d2P qk

51Testing软件测试网?-tkM%m"{].xab4c

location: class a51Testing软件测试网+F~!Ik6Y2u%Cr _/L

51Testing软件测试网3ukd cm~g2q,i

       b b1=new b();

k)y$j3ubrz)KF|D1u0

4G7B.HQ,F8[a0       ^51Testing软件测试网gL9?4Z9~uM

P CU,n c(z,B$A0a.java:6: cannot resolve symbol

E(wu3lcsT3X0

LBK Hs-S6r5~0symbol  : class b

A1R^8f[|r[0

W'HKc&B|0location: class a51Testing软件测试网DL@f^ Wg

51Testing软件测试网9LaZVv;uL+Zc

       b b1=new b();51Testing软件测试网|o@(}t Z3L4j/y*k5{

51Testing软件测试网5@7qik%vT @~p

                ^

VJ7F.aeJCj%d051Testing软件测试网(h M9g+q\o!J'Z

3 errors

i"tk)h~'ID8B&p0

}-e].p4g#r N g-Y!\}&O0

9D+J+w/TX(E051Testing软件测试网^4P_0\t-g4o

 

5Cd-X*N| _Tr051Testing软件测试网Cle5rD2@,VY^

51Testing软件测试网!v(nb'Y:[P(J

q1|H+O Op!y)N,c e"kK0D:\my\xdj>java a51Testing软件测试网2M z/\J UZFh

51Testing软件测试网7lNL,N2f[7O

Exception in thread "main" java.lang.NoClassDefFoundError: a/b/c/b51Testing软件测试网\wcGI(z(E!|8`

!]3PglR0        at a.main(a.java:6)51Testing软件测试网cB[6K;I,t

51Testing软件测试网Icn3Qf3\!t0[+g

N&M-^&a0g p0

+L*Dne4B}l W0 

(z.{+ad*s+rQPV }0

_ zV XP+]+X051Testing软件测试网4S)|'C7V.Hh.h

51Testing软件测试网y"`,x|L T3z_

D:\my\xdj>

o%HbB?D;T:A2v051Testing软件测试网 D)e/yt Bf2\)Xa0m

解决的办法可以用以下命令即可正常编译和执行:51Testing软件测试网:Lw4gI ?_Y

)u P,WL"d*t051Testing软件测试网xuWp5M V8u

51Testing软件测试网(P#}!L{,A`h

 51Testing软件测试网B!@M? kf~

} }$\p:tp:@@|} YWE~0

R ] [szkX:Sh/TS051Testing软件测试网%XK~9K7kk

D:\my\xdj>javac -classpath  d\   a.java

B5oww*zI051Testing软件测试网9sm\"`6t*{

51Testing软件测试网A#S S o}

rp6Z7X$c6a0 

o,`xl"W%gV0

u6l9D"M `o6L051Testing软件测试网*M \QQu}&]ls

N}|&^HzO:ki0N#v0D:\my\xdj>java -classpath  d\a

mMjMV|0

5sh7`X H4C0我是被调用子类的程序输出呀!51Testing软件测试网 w;p]r@.B6e?$F(~

51Testing软件测试网 iIM$ag%XM1F4}

51Testing软件测试网s {(a6|_F

#C.H]dHU~e _"^;`0 

:Rd3^9oA8iuv,A0

~1zCu:i4Ok0

0`&L r.le6a'z4WHL051Testing软件测试网 r}2VCgs_q,L

D:\my\xdj>51Testing软件测试网YW(Q'n~U

51Testing软件测试网eM$\x9y$pge

}&S'H3X7~j3p0

~)H[6J)V*@p5{1`0 

8@$O*vHe1x*wVbV]X0

3h#l+A*M,G051Testing软件测试网n5^x;B9zbx d0d i

51Testing软件测试网'H_6E-rO ^)p

提示3-classpath参数,缺省是以当前目录为根基目录的,即不带-classpath参数的情况下。51Testing软件测试网am!x$h9E;njo#J

51Testing软件测试网 d$|Zm e

提示4:使用java.exe还是javac.exe,最好明确指定-classpath选项,可设置环境变量CLASSPATH即可,同时设置了-classpath参数和环境变量classpath时,会以-classpath参数为主的。如果在它们所指定的路径或JAR文件中存有package名称和类名称相同的类,会引起混淆的!51Testing软件测试网Be$ib|lSu:ND

Qgz g_ }(eXx051Testing软件测试网{Y'@!{fex:}

Yj)z8K&PSi J%{0 51Testing软件测试网*bV3[,TA E

51Testing软件测试网;? bNR]&po[W

51Testing软件测试网 V)G!Kb7S J

51Testing软件测试网 C3XJ#h{O

如果你在D盘的根目录生成一个打包文件a.zip,其内容目录a\b\c\下的所有文件的话,你也可以用下面命令进行编译和执行。51Testing软件测试网3R:Y!_#c%Ph)DJi

s R}3@@4y6P0D:\my\xdj>javac -classpath d:\a.zip a.java

?*_*ei `q.ZY |051Testing软件测试网#nZ,H3fN:eG

^k3ll8Tp:Pj.L0

{Lz&Dq3t}*I8g0 

;C5O v4q5U#a8d9d$v051Testing软件测试网#U%^A7lG

8}O o#N-h S}0

(Yc A5R#F+C4A@0D:\my\xdj>java -classpath d:\a.zip;. a51Testing软件测试网6LQ:O@3wW$U

T%s)|v4d_0我是被调用子类的程序输出呀!51Testing软件测试网g @DDm.I*v

51Testing软件测试网8{6C5BZ i4U#d&t/BA0W

51Testing软件测试网soETn3mL)k

2{9Hm-w4U4I0 51Testing软件测试网 xR._u'^e

51Testing软件测试网u9g7fk zP~]c S

C-y%@J*lB/u,|0

EF V A.i8~0D:\my\xdj>51Testing软件测试网mEnF"i2iB

51Testing软件测试网^7j A,|a"_'E

.ViA YB$?a#Z KQ051Testing软件测试网,kqp-E7_ ~D Z3s2y6q G

 51Testing软件测试网6j8yHq`

\ B&j7|c4pI8U F051Testing软件测试网z9^.b nR~3M-\Z

4Xn;f#{/hKl%@0以上讨论就暂告一段落吧!如果你还想进一步了解packageimport机制话,哪你可以继续往下看下去的。51Testing软件测试网 Y2H [v}V

Wn$]4bzq051Testing软件测试网XID0rH

uO+|q^;p}(eg0 51Testing软件测试网 {vi1z"WY#[ ?

C9A.c7S,b.nE(s,Z#R0

#vP0F,\-n;J2xQ0

~$[&WH5U!? M;Y0\.r0深入分析packageimport机制部分

_xMs)nJ0

R!n5~4OBwj051Testing软件测试网)g6n.T.lz%h w

sE'|o:U9pf6cW2@!z051Testing软件测试网W"m b9~!Ey&A1F

51Testing软件测试网4qI:Z_/bf}

不管你有没有使用import指令,存在目前目录下的类都会被编译器优先采用,只要它不属于任何package。这是因为编译器总是先假设您所输入的类名就是该类的全名(不属于任何package),然后-classpath所指定的路径中搜索属于该类的.java文件或.class文件,在这里可以知道default package的角色非常特殊。51Testing软件测试网.d9x+@Hw] \

51Testing软件测试网6fF M0xl4W5]

必须明确告诉编译器我们用到哪个package下的类,导入时或在包名称.类名称中进行引用。导入某个包时,一定要进行-classpath路径指定某个包的位置。你如果指定了多个路径话,如果在一个路径下已经找到了该包话,就优先引用该包的类。51Testing软件测试网:O3R-C M JG

51Testing软件测试网6^"rNuL&n M%i9n

java编译器开始编译某个类的源代码时,首先它会做一件事情,这就是建立“类路径引用表”,它是根据参数-classpathclasspath环境变量来建立的。如果没有指定选项-classpath或环境变量CLASSPATH时,缺省情况下类路径引用表只有一笔记录,即当前的目录(“.”)。环境变量CLASSPATH的内容会被选项-classpath所覆盖,没有累加效果。51Testing软件测试网0\9~&z vW S)Yw"F

51Testing软件测试网8Wn9_E[ TRl#u|

  当编译器将类路径引用表建立好之后,接着编译器要确定它可以利用类引用表里的数据作为相对起始路径,找到所有用到的package51Testing软件测试网J_4?a2h1h

51Testing软件测试网*ZV"\,lCX

  编译器还要完成一张名为“类引用表”与“相对类引用表”的数据结构。

ZC.y\P051Testing软件测试网B#U0a[ ~F!J:`C

  整个编译程序中packageimport机制相关的部分流程如下:51Testing软件测试网*T5W.D ~ u|R2_%C

3wBtD-vl1M*]f oW0

*e3C"c5Qou051Testing软件测试网A!W4E:st

 51Testing软件测试网 h!L @-wM9fh.G vP

51Testing软件测试网lh$i} ~NI

51Testing软件测试网6I$r@"|u1}Dl~0A

51Testing软件测试网"x.z?1|`f

开始,51Testing软件测试网!p\I9d,\ jRX

51Testing软件测试网D%h*["l1u(~

51Testing软件测试网%u|Uz9vN

$[5s ~ [p S {0 

0k9g8J:tr*l l%L0

#lB*m9^G J O1lT051Testing软件测试网[ y}[1q

51Testing软件测试网pLH:Y1n*k

建立类路径引用表与类引用表;

(C?E g3j Ak,XQ051Testing软件测试网/dql|F)sR7M

如果建立成功:则类名称解析程序:

[-x^9b$TZ0

z!F3}m!h/|)a2k,C5`0如果已存在该类的类文件,继续其它的编译工作

Bs*O H&_3K,\0

+p"U6z`AE8Bb#@0如果该类的文件不存在,寻找该类的源代码文件:如果找到,则编译该类的源代码,继续其它的编译工作此时,也可返回到51Testing软件测试网ty5u;whB

yD r-u`-Ku0开始,make机制,递归式编译。如果找不到,编译结束,发出警告信息

|/B.bAI6Yr0

-v5R-~c(t#If0如果建立失败:编译结束,发出警告信息2)。 

-O"t[B^0uAN051Testing软件测试网4A-Ph+i3vV

51Testing软件测试网 I?rERKo/ii'X6Qn

qf*Y/b)s.vZ5p|/~0JAVA动态链接本质研究

/^Ec^}7A(iQ7o/F0

u;cF`oe2h8Z3?051Testing软件测试网 a0F?lo_&o_

51Testing软件测试网t.vc9V5L(|qW

5{2G@^7zF0

8m}F(LD jLd0不管你在同一个源代码(.java)中使用了几个类声明,它们都会一一编译成.class文件,即使是内部类、匿名类都是一样。在java中,对于每一个类所构成的类文件,都可将它视为动态链接库。51Testing软件测试网~CTH'ec

51Testing软件测试网K I0I4Af

在类文件中,所有对于特写类的操作都被转换成类的全名。Import除了用来指引编译器解析出正确的类名称之外,没有其它功能。

a&}+I0g|#Bzj `9i \051Testing软件测试网c|4r5~z;O

在运行时期,仍然用到一个与编译器相同的程序,就是类路径引用表的建立,而利用动态链接载入类文件的机制流程如下:51Testing软件测试网 yL$y @c'qd

51Testing软件测试网 J[;P/@d*S3\ O$B

开始,建立类路径引用表,根据类文件内部的信息,与类路径引用表的数据合成类文件的绝对路径。51Testing软件测试网2}9^_j5d1b

NVi"zq"hg0   如果找到类文件,检查该类的类文件内部信息,是否符合相对路径信息:如果符合,载入该类。如果不符合,执行错误,发出Exception信息。51Testing软件测试网zzl&G L

51Testing软件测试网 P;V6av~/nRi

   如果找不到类文件,则执行错误,发出Exception信息。

{|K~;^^7vqv0F o051Testing软件测试网:lt7D nMsQ+gO

nM f9jM8uH[)z S l051Testing软件测试网7w3NG$rP)b,EFR$~;X

最后,需要说明的是,在java中提供许多的类包,java语言中将完成与计算机底层相关的输入输出、常用的数据类型转换等功能的函数封装在包中。如果你的程序提示找不到这样基础包的话,你就可以用参数-classpath或环境变量classpath进行指定位置来解决此类问题!

C1rc?,D*vrj2wfC0

TAG: JAVA 编程基础

我测故我在 引用 删除 caicai1724   /   2007-04-27 18:04:37
遇到问题:
3。
如果你在\xdj目录下仍保留一个b.java文件的话,执行对主程序的编译命令时仍会报错!为什么??
答案:
不管你有没有使用import指令,存在目前目录下的类都会被编译器优先采用,只要它不属于任何package。这是因为编译器总是先假设您所输入的类名就是该类的全名(不属于任何package),然后-classpath所指定的路径中搜索属于该类的.java文件或.class文件。
所以编译器使用了旧的b.java文件了!
我测故我在 引用 删除 caicai1724   /   2007-04-27 18:04:16
遇到问题:
2。
E:\javaworkspace\a\b\c>java Useofpackage为什么会失败呢?而且报的错和没有目录a\b\c是一样的。(错误:Exception in thread "main" java.lang.NoClassDefFoundError: hello (wrong name: a/b/c/Useofpackage),可是我指定到a\b\c目录下来啊。。不明白。
E:\javaworkspace>java a.b.c.Useofpackage这个是成功的。
先往下面看,看有没有答案。
我测故我在 引用 删除 caicai1724   /   2007-04-27 18:03:53
哈哈,原来不用CD进入其他硬盘啊!
C:>D:回车
D:>
直接敲D:回车就可以了哦~,唉,糊涂了~!
另外有日志补充DOS下的常用命令。
我测故我在 引用 删除 caicai1724   /   2007-04-27 18:03:32
遇到问题:
1。javac时,提示cannot read.
答案:从命令行进入到你的源程序的路径,比如说你的 HelloWorld.java 程序放在了 D:\MyCode目录下,则进入到这个目录执行编译命令;如果非要在其它的路径下编译的话,就在 javac 后面加上源程序的绝对路径,比如你的文件放在 D:\MyCode 目录下,则在 E 盘根目录下可以这样编译: javac D:\MyCode\HelloWorld.java
不过我有cd 到MyCode目录哦,结果非要用全路径才行,再看看为什么cd不进E盘。
 

评分:0

我来说两句

Open Toolbar