1. 问:怎样用 Windows 的记事本 (Notepad) 来编辑 Java源程序? HM,<-l ©达内科技论坛 -- 达内科技论坛 * 答:记得存档时扩展名要加上".java",文件类型改成:“所有的文件(*.*)”。 ]o*1US ©达内科技论坛 -- 达内科技论坛 4 ©达内科技论坛 -- 达内科技论坛 BwMrw7 ©达内科技论坛 -- 达内科技论坛 fz)Zp> 2. 问:到底 Java 是如何传递参数的?是by value或by reference? rNZ ©达内科技论坛 -- 达内科技论坛 LE 答:All parameters (values of primitive types, and values that are references to objects) are passed by value [JLS sect 8.4.1]。根据以上 Java规格文件的说法, 所有参数应该都是传值的(by value)。但实际上, 实际经验却告诉我们所有 Java 的对象都是传址的(by reference)。因此我们可以这样解释: 基本类型(如int, float, char等)是by value,而所谓“对象”(Object)则是by value of reference to object。 |Yy ©达内科技论坛 -- 达内科技论坛 xs* ©达内科技论坛 -- 达内科技论坛 >2 ©达内科技论坛 -- 达内科技论坛 y 3. 问:String这个类型的class为何定义成final? $-~\ ©达内科技论坛 -- 达内科技论坛 HFnLC 答: 主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。 RDx"| ©达内科技论坛 -- 达内科技论坛 ULx% ©达内科技论坛 -- 达内科技论坛 +~t ©达内科技论坛 -- 达内科技论坛 )%1{9 4. 问:finalizers和C++ 的 destructors有何差异? zKxR ©达内科技论坛 -- 达内科技论坛 / 答:Java内部具有“内存使用回收” 的机制, 虽然它也提供了类似 (C++ 的) destructors的 finalize(),每个对象都可以使用这个方法 method,但必须冒著破坏原先回收机制的危险。所以建议尽量避免使用finalize(),不妨考虑多使用 null 及 dispose() 来释出资源会好一些。 <e ©达内科技论坛 -- 达内科技论坛 Q\{"v ©达内科技论坛 -- 达内科技论坛 iTW`Sp ©达内科技论坛 -- 达内科技论坛 nsRXJ 5. 问:继承了一个class叫做 Frotz,编译器却给我“No constuctor Frotz() in the class”这样的错误提示,为什么呢? a1VK1p ©达内科技论坛 -- 达内科技论坛 tv'TSo 答:记住每当您定义了一个 class的constructor,除非您一开始就去call 这个constructor,否则 Java 会自动引入superclass原先不含参数的 constructor, 如果superclass的 constructor都是有参数的,那么问题中的错误提示便出现了。 解决的方法很简单, 找一找 API文件,加上正确的参数就得了。 `! ©达内科技论坛 -- 达内科技论坛 Jm?sR ©达内科技论坛 -- 达内科技论坛 cAB ©达内科技论坛 -- 达内科技论坛 J%]2H- 6. 问:怎样让char类型的东西转换成int类型? 6j ©达内科技论坛 -- 达内科技论坛 }(:Ei^ 答: ©达内科技论坛 -- 达内科技论坛 bl-A$N ©达内科技论坛 -- 达内科技论坛 D@. char c = 'A'; W+{~* ©达内科技论坛 -- 达内科技论坛 8 int i = c; >!X: ©达内科技论坛 -- 达内科技论坛 n //反过来只要作强制类型转换就行了 5J**c ©达内科技论坛 -- 达内科技论坛 fF"4BT c = (char) I; }# ©达内科技论坛 -- 达内科技论坛 7\% ©达内科技论坛 -- 达内科技论坛 R ©达内科技论坛 -- 达内科技论坛 OW 7. 问:我的applet原先好好的, 一放到web server就会有问题,为什么? Nj ©达内科技论坛 -- 达内科技论坛 L 答:一般来说,从以下方向试试: vg ©达内科技论坛 -- 达内科技论坛 "CKo7 确定class文件的格式没错——已经编译过,也没有损坏的情形; 4s4( ©达内科技论坛 -- 达内科技论坛 B*?PI 确定所有用到的class文件放到web server上,少一个都不行; pp52g ©达内科技论坛 -- 达内科技论坛 d9b5V. 确定所有的文件名和class名称一致,特别检查大小写有无差错; bt'7p ©达内科技论坛 -- 达内科技论坛 i? 如果程序中用到package,web server上的目录就要当心了。譬如您在class中宣告了一个叫COM.foo.util的package,那么web server的applet codebase目录底下就非得有 COM/foo/util这个子目录不可。(注意目录名称也有大小写之分); iFC# ©达内科技论坛 -- 达内科技论坛 Yqc web server上的文件档案应该事先设定好。(尤其是search,read和execute权限) ${2h/ ©达内科技论坛 -- 达内科技论坛 j_F ©达内科技论坛 -- 达内科技论坛 ,Fk-L ©达内科技论坛 -- 达内科技论坛 ' 8. 问:怎样在 Applet中用某个图形涂满整个背景? {!.' ©达内科技论坛 -- 达内科技论坛 =3 答:在背景建立 Panel 或 Canvas, 然後用图形填满它。 g ©达内科技论坛 -- 达内科技论坛 8U ©达内科技论坛 -- 达内科技论坛 !A[ ©达内科技论坛 -- 达内科技论坛 n:;h 9. 问:怎样在 Applet 中建立自己的菜单(MenuBar/Menu)? "sZl ©达内科技论坛 -- 达内科技论坛 .*Mt# 答:首先在Applet的init() 方法中建立Frame instance, 然后将Menus, Menubar都加上去即可。 (setMenuBar() 是 Frame下的方法)或者,找到Applet上层的Frame后依法炮制。 L ©达内科技论坛 -- 达内科技论坛 Bg[M,% Container parent = getParent(); f^M^ ©达内科技论坛 -- 达内科技论坛 t91UY while (! (parent instanceof Frame) ) .bT- ©达内科技论坛 -- 达内科技论坛 q,mh parent = parent.getParent(); ~Go] ©达内科技论坛 -- 达内科技论坛 DMkhP^ Frame theFrame = (Frame) parent; JWPS ©达内科技论坛 -- 达内科技论坛 W|jE!C 注意:第二个方法在Mac或某些browsers上并不可行。 mm ©达内科技论坛 -- 达内科技论坛 cz+ 如果您使用的是JDK 1.1,也可以考虑使用popup menu,这样就不必理会Frame的问题了。 _EG ©达内科技论坛 -- 达内科技论坛 &yjq ©达内科技论坛 -- 达内科技论坛 <qM ©达内科技论坛 -- 达内科技论坛 =6 10. 怎样比较两个类型为String的字符串? 07o?Q ©达内科技论坛 -- 达内科技论坛 & 答:在两个对象之间使用 "==",会将“两个对象是否有同一reference”的结果传回。也就是说, 这等同于“两个对象是否拥有同一地址 (address)”,或者“两个对象物件是否为同一对象”。如果您的意思是判断两个字符串的内容是否相同,那么应该使用以下的方法才对: |H9 ©达内科技论坛 -- 达内科技论坛 k if (s1.equals(s2) ) 9 ©达内科技论坛 -- 达内科技论坛 $ or if (s1.equalsIgnoreCase(s2) ) O7w ©达内科技论坛 -- 达内科技论坛 Sa!iXY or if (s1.startsWith(s2) ) 1[^/ ©达内科技论坛 -- 达内科技论坛 iF or if (s1.endsWith(s2) ) |kXnD ©达内科技论坛 -- 达内科技论坛 |W`Kvt or if (s1.regionMatches(s1_offset, s2, s2_offset, length) ) J]2 ©达内科技论坛 -- 达内科技论坛 x or if (s1.compareTo(s2) <0) Lxa ©达内科技论坛 -- 达内科技论坛 r;8 ©达内科技论坛 -- 达内科技论坛 _[9o}L ©达内科技论坛 -- 达内科技论坛 (K 11. 怎样将浮点数(float)相加 ? Float 好像没有办法? uQUhL ©达内科技论坛 -- 达内科技论坛 d 答:我猜想您的程式大概写成这样: \ ©达内科技论坛 -- 达内科技论坛 mve B2 Float One; x ©达内科技论坛 -- 达内科技论坛 "0gY~3 Float Two; U, ©达内科技论坛 -- 达内科技论坛 LEB*pN Float Hard = One + Two; [m ©达内科技论坛 -- 达内科技论坛 [N1}39 请注意 float 和 Float 是不同的,前者是 Java 基本类型之一, 而后者却是class。您应该将源代码改为: ([%K ©达内科技论坛 -- 达内科技论坛 |zS float One; EP|Da ©达内科技论坛 -- 达内科技论坛 fvQ\ D float Two; ho ©达内科技论坛 -- 达内科技论坛 !I9 float Hard = One + Two; aE ©达内科技论坛 -- 达内科技论坛 o 或 ©达内科技论坛 -- 达内科技论坛 Iy_od9 ©达内科技论坛 -- 达内科技论坛 Y.P Float One = new Float(1.0); !z;& ©达内科技论坛 -- 达内科技论坛 X~ Float Two = new Float(2.0); +89C ©达内科技论坛 -- 达内科技论坛 z!1=OD Float Hard = new Float(One.floatvalue() + Two.floatvalue()); TH?, ©达内科技论坛 -- 达内科技论坛 *6* ©达内科技论坛 -- 达内科技论坛 + ©达内科技论坛 -- 达内科技论坛 W 12. 如何将字串String转换成整数int? & ©达内科技论坛 -- 达内科技论坛 cH(a_6 答:有两个方法: \ ©达内科技论坛 -- 达内科技论坛 @T 1)int i = Integer.parseInt([String]); 或 "1 ©达内科技论坛 -- 达内科技论坛 &}M ©达内科技论坛 -- 达内科技论坛 K ©达内科技论坛 -- 达内科技论坛 v;0h i = Integer.parseInt([String],[int radix]); Hx$:} ©达内科技论坛 -- 达内科技论坛 N7;rS 2)int i = Integer.valueOf(my_str).intvalue(); Ms ©达内科技论坛 -- 达内科技论坛 HiE$ 注: 字串转成Double, Float, Long的方法大同小异。 m$\E ©达内科技论坛 -- 达内科技论坛 %q@|6 ©达内科技论坛 -- 达内科技论坛 S+ ©达内科技论坛 -- 达内科技论坛 z 13. 如何将整数 int 转换成字串 String? u[jlB ©达内科技论坛 -- 达内科技论坛 Br 答:有三种方法: ?T^/ ©达内科技论坛 -- 达内科技论坛 ox 1)String s = String.valueOf(i); [m` ©达内科技论坛 -- 达内科技论坛 jK)D 2)String s = Integer.toString(i); /e<YS$ ©达内科技论坛 -- 达内科技论坛 BlgR 3)String s = "" + i; V%y ©达内科技论坛 -- 达内科技论坛 27@&< 注:Double, Float, Long 转成字串的方法大同小异。 wSY?\ ©达内科技论坛 -- 达内科技论坛 t_ ©达内科技论坛 -- 达内科技论坛 9w ©达内科技论坛 -- 达内科技论坛 &AA 14. 如何从一个文件档案的尾端新增记录? :IQJ#q ©达内科技论坛 -- 达内科技论坛 rL7='w 答:有两种方法: Xx6 ©达内科技论坛 -- 达内科技论坛 r ?g#d 1)RandomAclearcase/" target="_blank" >ccessFile fd = new RandomAccessFile(file,"rw"); U ©达内科技论坛 -- 达内科技论坛 4V.2{ fd.seek(fd.length()); a`r0# ©达内科技论坛 -- 达内科技论坛 SiI 然后使用 fd 的method写入 `W; ©达内科技论坛 -- 达内科技论坛 4 2)使用FileOutputStream(String name,boolean append) throws IOException这个 constructor 7! ©达内科技论坛 -- 达内科技论坛 l$$BUO ©达内科技论坛 -- 达内科技论坛 ~e/C ©达内科技论坛 -- 达内科技论坛 Am^7 15. 如何设置Java 2(JDK1.2)的环境变量? 2J ©达内科技论坛 -- 达内科技论坛 7 5 'm 答:Java 2安装后,需要设置PATH和JAVA_HOME环境变量。与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径。Java 2环境变量的设置如下例所示: <Y/Af ©达内科技论坛 -- 达内科技论坛 ?ZbL Solaris平台: setenv JAVA_HOME Java2的安装路径 K setenv PATH $JAVA_HOME/bin:${PATH} b[27 ©达内科技论坛 -- 达内科技论坛 7 Windows平台:set JAVA_HOME=Java2的安装路径 W set PATH=$JAVA_HOME\bin;%PATH% #-Y&& ©达内科技论坛 -- 达内科技论坛 vlLY ©达内科技论坛 -- 达内科技论坛 3n\-K ©达内科技论坛 -- 达内科技论坛 Swok 16. 哪些Java集成开发工具支持Java 2? IY7b ©达内科技论坛 -- 达内科技论坛 w'6 答:目前流行的Java集成开发环境,如Inprise的Jbuilder;Symantec的Visual Cafe,;Sybase的PowerJ都支持Java 2。 Ub=v ©达内科技论坛 -- 达内科技论坛 W3&JL ©达内科技论坛 -- 达内科技论坛 Up ©达内科技论坛 -- 达内科技论坛 /P 17. 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围? s) ©达内科技论坛 -- 达内科技论坛 ^.3 答:当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM。而不同浏览器对JDK的支持程度也不尽相同。因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关。如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览器不完全兼容JDK而引起的。此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin。如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误提示检查applet程序。 tzA{@0 ©达内科技论坛 -- 达内科技论坛 Zp?m ©达内科技论坛 -- 达内科技论坛 66;7 ©达内科技论坛 -- 达内科技论坛 D7F`+r 18. 在Java语言中,如何列出PC机文件系统中的所有驱动器名? 4G ©达内科技论坛 -- 达内科技论坛 4=0BJ 答:在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能。 |e@12N ©达内科技论坛 -- 达内科技论坛 Q ©达内科技论坛 -- 达内科技论坛 ^jB ©达内科技论坛 -- 达内科技论坛 [:w& 19. 为什么Runtime.exec("ls")没有任何输出? O; ©达内科技论坛 -- 达内科技论坛 A 答:调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息。由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(),Process.getErrorStream()方法重定向给它的父进程了。用户需要用这些stream来向子进程输入数据或获取子进程的输出。所以正确执行Runtime.exec("ls")的例程如下: %g"fXd ©达内科技论坛 -- 达内科技论坛 2nkXR try ©达内科技论坛 -- 达内科技论坛 XnYGF ©达内科技论坛 -- 达内科技论坛 = { ©达内科技论坛 -- 达内科技论坛 ` ©达内科技论坛 -- 达内科技论坛 !8_tZ process = Runtime.getRuntime().exec (command); Gsh\ ©达内科技论坛 -- 达内科技论坛 c"cJK InputStreamReader ir=newInputStreamReader(process.getInputStream()); u4q' ©达内科技论坛 -- 达内科技论坛 W3Q< LineNumberReader input = new LineNumberReader (ir); 3H`i ©达内科技论坛 -- 达内科技论坛 =QYD String line; ( ©达内科技论坛 -- 达内科技论坛 AP while ((line = input.readLine ()) != null) Ob[7k ©达内科技论坛 -- 达内科技论坛 {.:V System.out.println(line); # ©达内科技论坛 -- 达内科技论坛 pG } ©达内科技论坛 -- 达内科技论坛 zbz&Z, ©达内科技论坛 -- 达内科技论坛 2 catch (java.io.IOException e){ mYKL ©达内科技论坛 -- 达内科技论坛 [kG System.err.println ("IOException " + e.getMessage()); Y ©达内科技论坛 -- 达内科技论坛 {n } ©达内科技论坛 -- 达内科技论坛 T@{|C ©达内科技论坛 -- 达内科技论坛 ` ©达内科技论坛 -- 达内科技论坛 Y5-6Jm ©达内科技论坛 -- 达内科技论坛 ?eUK] 20. 若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException? g'bP0| ©达内科技论坛 -- 达内科技论坛 ({;X 答:使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应。ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头。因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头。所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException。 !G"T%5 ©达内科技论坛 -- 达内科技论坛 &.= 一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法。被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object?若是,则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法。 G ©达内科技论坛 -- 达内科技论坛 M{Jpi ©达内科技论坛 -- 达内科技论坛 ' ©达内科技论坛 -- 达内科技论坛 I@7f 21. 对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中? c\Vzi ©达内科技论坛 -- 达内科技论坛 4J 答: 目前,没有直接的方法可以将对象写入到随机存取文件中。但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象。需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误。例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中。相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象。 s8dcYp ©达内科技论坛 -- 达内科技论坛 '! ©达内科技论坛 -- 达内科技论坛 -~Vz ©达内科技论坛 -- 达内科技论坛 7y, 22. 在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之? /A@.]( ©达内科技论坛 -- 达内科技论坛 Er 答: Thread.suspend本身易于产生死锁。如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源。如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁。 +hW%t ©达内科技论坛 -- 达内科技论坛 Q`n 因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态。一旦需要该线程继续运行,其它线程会调用notify()方法来通知它。 a ©达内科技论坛 -- 达内科技论坛 )M ©达内科技论坛 -- 达内科技论坛 d% |
|
} |