1 Java的动态特性! }& {1 Q' d* p* z
Java的动态特性有两种,一是隐式的;另一种是显示的。隐式的(implicit)方法就是当程式设计师用到new 这个Java 关键字时,会让类别载入器依需求载入您所需要的类别,这种方式使用了隐式的(implicit)方法。显式的方法,又分成两种方式,一种是藉由java.lang.Class 里的forName()方法,另一种则: G* r: W0 M; ]: r! p- b2 ]
是藉由java.lang.ClassLoader 里的loadClass()方法。您可以任意选用其中一种方法。6 Y; _5 u$ E6 T4 ?4 d9 L+ W1 ]
2 隐式的动态特性
( ~7 u$ k* G1 V6 w3 K9 m 在执行java文件时,只有单独的变量声明是不会载入相应的类的,只有在用new生成实例时才载入 y4 |, X$ c9 E- U2 P
如示例所示:: ]# J. v" ~9 W6 p: @
public class Main% E4 g! @) N8 ]( g# S( |
public static void main(String args[])
8 I, C6 ~2 {# e% @) m {4 }! C% f5 D" |7 f* j
A a1 = new A() ;
" d6 [, `# k6 m& @) H B b1 ;4 ?/ Z! k" A# N t0 _: G5 N
}
) N1 l0 u" a1 ?9 Y, l4 k 类A和B相同,如下:4 o5 X6 h/ w, T6 a! M1 @3 {9 \$ q
public class A
) v5 a, G( M9 K/ s {) P1 @1 j* x+ J1 d# c9 s1 N9 p
public void print(“using A”);1 k8 q/ P( X, |9 _! ]
}4 f5 o/ y9 b+ o3 l( a
编译后,可用java –verbose:class Main运行,察看输出结果。可以看到JVM只载入了A,而没有载入B.
% V5 V: V. |3 a" h; x 另外,类的载入只在执行到new一个类时,才载入,如果没有执行到new语句,则不载入。
) U) L: w1 u$ P* F5 }% ? 如://类Office
+ v1 {6 W* O1 ?# I9 `) t- S public class Office! W2 f- b5 z8 q S6 j; S
{3 i& {% q+ o0 t: b& P
public static void main(String[] args)& b n: h. p, w, R c8 ?
{
4 }/ i M) f9 J* b1 ?' h' w Word myword=null;3 m$ ]2 C: V# e1 B- C% a
Excel myexcel=null;/ J* b7 E4 V3 Y/ F' t
if (args[0].equals("Word"))
* a: c: U4 }& _- ?7 I% ]& K {
9 W$ A3 T- a. ] myword = new Word();) x/ z) x" {: U3 F) V
myword.start();
# Y5 p# r6 ], b7 r }; u" G% l7 i1 o E! K9 M* z. ~
if (args[0].equals("Excel"))
) W. K. h4 `: v7 D" N# Y } {
. X" s- R& B7 F/ ? myexcel = new Excel();/ `* O9 Z" n( @8 ]6 Z5 s( ^+ E
myexcel.start();
' w, o3 o0 s" K7 P+ k8 L5 z }
) g/ _8 `. d, X! }) Y1 p }; W9 W y: z8 ?1 w, q7 ?* c- q8 N. p
}
7 f. j5 \ k: \$ O //类Word和Excel基本相同,如下7 s" p0 S+ w9 q+ X0 |# U* u8 B
public class Word( b4 @! f+ C! k9 ^, k
{% X: S: U* B, ~. k
public void start()
! R! e4 _9 h- O0 d8 o {% r# q$ v. E- @) v$ _! \1 Y6 h) D
System.out.println("using word");" y& U# F: ^ s" O; y! W6 O. l9 h- Z
}
. K) P* \9 i, |) w8 M# ? }/ l t8 k* J7 ~3 T
在dos命令提示符下,输入java –verbose Office Excel可以看到JVM只载入Excel类,而不载入Word类。$ |* i, B9 v# }$ e% E: e
3 显示的动态特性4 ` i- R. |6 t1 N3 N8 W* U
3.1 java.lang.Class里的forName()方法+ D# G4 y3 M. d' g! K
在上一个Office示例中,进行如下修改:. o8 d- l' s2 l( F8 G; q" \6 [
一 加入Assembly类
1 D; Y& D/ d0 q$ s" p* ~ public interface Assembly
( e0 m$ H$ W* u3 n/ `* ? {8 s8 z9 w6 s; R6 f' s
public void start();' d# r# V. F" E7 O/ {7 B
}
, s5 A1 @3 ^7 W" b0 v 二 让Word和Excel类实现该接口
: g- `! j# u" l9 ? public class Word implements Assembly
0 {+ n- ~0 y2 Y7 c- g) f- H4 p {& `( s) `! {, [* }9 n6 {$ x$ h
public void start() r5 G k# s3 i. a. @
{
% ?* z4 I; q/ M2 D. j2 {$ |& Z System.out.println("using word");
/ k0 R- ?% H( {/ T9 U n }8 \5 d: g( U5 P
}
# r( W5 l' A( b 三 Office 类如下所示1 h! I ~. m( b, c7 S) Q9 k
public class Office0 n4 N9 E5 u) @( {2 v" A6 e% @
{4 X W) s! G, @: ?+ v3 P1 y
public static void main(String[] args) throws Exception) P: [- T3 T( I; S% h
{5 _, Z2 H1 ?. F% i
java.lang.Class c = java.lang.Class.forName(args[0]);
: [: ^; S; f: O3 @ Object o = c.newInstance();
( `; h) }, S2 W& ` Assembly a = (Assembly)o;0 w2 z6 m$ v4 u: v& l/ g9 l
a.start();
+ X i r: `* C: g- B' F }
- N* a/ D3 y+ y( B' w0 ] } |