想来学习Java也有两个年头了,永远不敢说多么精通,但也想谈谈自己的感受,写给软件学院的同仁们,帮助大家在技术的道路上少一点弯路。说得伟大一点是希看大家为软件学院争气,实在最主要的还是大家自身的进步提升——
1. 关于动态加载机制——
学习Java比C++更轻易理解OOP的思想,究竟C++还混合了不少面向过程的成分。很多人都能背出来Java语言的特点,所谓的动态加载机制等等。当然概念往往是先记住而后消化的,可有多少人真正往体会过动态加载的机制,试图往寻找过其中的细节呢? 提供大家一个方法:
在命令行窗口运行Java程序的时候,加上这个很有用的参数:
java –verbose *.class
这样会清楚的打印出被加载的类文件,大部分是jdk自身运行需要的,最后几行会明显的看到自己用到的那几个类文件被加载进来的顺序。即使你声明了一个类对象,不实例化也不会加载,说明只有真正用到那个类的实例即对象的时候,才会执行加载。这样是不是大家稍微能明白一点动态加载了呢?^_^
2. 关于寻找class文件原理——
建议大家在进门的时候在命令行窗口编译和运行,不要借助JCreator或者Eclipse等IDE往帮助做那些事情。尝试自己这样做:
javac -classpath yourpath *.java
java -classpath yourpath *.class
也许很多人都能看懂,设置classpath的目的就是告诉编译器往哪里寻找你的class文件. 不过至少笔者本日才弄懂JVM往查询类的原理,编译器加载类要依靠classloader, 而classloader有3个级别,从高到低分别是BootClassLoader(名字可能不正确) , ExtClassLoader, AppClassLoader.
这3个加载器分别对应着编译器往寻找类文件的优先级别和不同的路径:BootClassLoader对应jre/classes路径,是编译器最优先寻找class的地方
ExtClassLoader对应jre/lib/ext路径,是编译器次优先寻找class的地方
AppClassLoader对应当前路径,所以也是编译器默认找class的地方
实在大家可以自己写个程序简单的测试,对任何class,例如A,
调用new A().getClass().getClassLoader().toString() 打印出来就可以看到,把class文件放在不同的路径下再次执行,就会看到区别。特别留意的是假如打印出来是null就表示到了最高级BootClassLoader, 由于它是C++编写的,不存在Java对应的类加载器的名字。
寻找的顺序是一种向上迂回的思想,即假如本级别找不到,就只能往本级别之上的找,不会向下寻找。不过似乎从Jdk1.4到Jdk1.6这一特点又有改变,没有找到具体资料。所以就不举例子了。告诉大家设计这种体系的是Sun公司曾经的技术核心宫力先生,一个纯种华人哦!^_^
这样希看大家不至于迷惑为什么总报错找不到类文件,不管是自己写的还是导进的第三方的jar文件(J2ee中经常需要导进的)。
3. 关于jdk和jre——
大家肯定在安装JDK的时候会有选择是否安装单独的jre,一般都会一起安装,我也建议大家这样做。由于这样更能帮助大家弄清楚它们的区别:
Jre 是java runtime environment, 是java程序的运行环境。既然是运行,当然要包含jvm,也就是大家熟悉的虚拟机啦, 还有所有java类库的class文件,都在lib目录下打包成了jar。大家可以自己验证。至于在windows上的虚拟机是哪个文件呢? 学过MFC的都知道什么是dll文件吧,那么大家看看jre/bin/client里面是不是有一个jvm.dll呢?那就是虚拟机。
Jdk 是java development kit,是java的开发工具包,里面包含了各种类库和工具。当然也包括了另外一个Jre. 那么为什么要包括另外一个Jre呢?而且jdk/jre/bin同时有client和server两个文件夹下都包含一个jvm.dll。 说明是有两个虚拟机的。这一点不知道大家是否留意到了呢?
相信大家都知道jdk的bin下有各种java程序需要用到的命令,与jre的bin目录最明显的区别就是jdk下才有javac,这一点很好理解,由于jre只是一个运行环境而已。与开发无关,正由于如此,具备开发功能的jdk自己的jre下才会同时有client性质的jvm和server性质的jvm, 而仅仅作为运行环境的jre下只需要client性质的jvm.dll就够了。
记得在环境变量path中设置jdk/bin路径麽?这应该是大家学习Java的第一步吧, 老师会告诉大家不设置的话javac和java是用不 9o.i)*9.k9cl,y+`(yg9$9j9mg8]ykfay."nm*`fb,9h"yl`f9/ 9g*]."oo9i).z/ #d$yiy.9ak:`d!,9..9m!.*yl,yi)/b9i&d)ay(zg :)yi.9i)+\]+hYyob.g 9g`9+n#9i)#-:aN]y`," N]Yyo 99ao9i& !ycb9kz!9a*am.9bcyg*9.+yf:(c9.&n9o+&n#9i)9a9a.#z)y9m!iab9. 9k)yyk9b,9nyioyg*9d9o9)b Y#aya+y/o/'.+]+iy+]+9. 9.*+9+ynm
y"9c k 9.*n9)b i/ez+Rd]9alykf9o9fb!)9.&byn9`.98g*]cI`&n.9`f+.+yb:/&bz`.% !yg*]9.+yi*y)k9c,9bcyc8]`U9od 9ac$9...&ak:+9n9!.+9n g..".g9./%]"f8cl"y9aayaiy.#y #9]!.g".. 9hy/chjI..+z`%9`a 9cc9df9c o:/n99/&]9$ymbH !y.b:`+]I.9a]/o(z,"9b,]n#k]z/+ !yab:,"9y]I."yab9ky. 9."]c.b*XNIN]m9/d]y.9o+j n :)yal9+j8bcyj9+ 9.*] g*[9.+zecy`9"T\]Y\`ncyj k#yke[] aiykd9 `9"y)9.&bz`.9`+./*X[] 9k 9.*.:`&`9"z/9/i/on/ d#(9k`&`d`9"Ik!),y+j $y.gf\]\kg*9.)\]9.!gy. 9.*b!cj b9."鹢*\]Y\[\kg*:!. 9.*]nm.#y+..9l,y+%az)9d9d#c.9c,y )d" d!:!#9iyk9$:!9mg8`"y.X[]9g*9.+ze'k9cbcy.*)﹫++c :)y`9"yl9kZ] /kl,y/&b,:/` d"9i!9k#jX[d#g*:ah/c9i!9i!9k9bk9c,9bcyc9d#9. 9.*% !y.#yd#9).+ze/cyc*y.g\]:ah9dY\X.)9yo#`9.,9bcy..h. 9b!+*9.]9Ty+ynm 9.*y/a #9m /g]#/)%9j8`%. 9.*)cg]yn)iy. 9.*!ol,y+[:acy.k9acy/k9ao9d*]9 +z/. y.+y.g+ 9*:-:)y.I$y.ny. yaza9+ #]iy'z-+c+*`.#ykek9d*\z/[:acy+I/*acy9oey`9"y(9l!9al. 9 :)y.yc .yc[9.yc z)z/n /*od.d#iya``:/*'z-[9`:-mg9.giz-i)i)"iz+]'y$y.)iy:l9'b9i&.am.9`9"y)+y/k9c9cjyley[:acyg`9.biyk9$9k9b8."!b!b*PX[dPX[:/)9.*+] 9.9o9.)9.*. Nd#jX[X[l,y+9d#j kn 9.*X[]y.o9i&X[/\]X[[U[Y][X[k"y. 9.*i!9.&bz`.9yXJ
I/(:/\]Y\\PX[dX[X\[*khI/[9khxb,:/X[.bb9/&/ 9.*\]Y\\iyb'yi%acy9(9l!9al/f:!XN*nm9mg9j9]yki.h9oHYH]KK[KNY]XY [\Y NNLL[\ZY N]KK[KNY]XY [\Y NNLL[\ZY N]