JAVA 问题集合
1. 问:怎样用 Windows 的记事本 (Notepad) 来编辑 Java 源程序? 答:记得存档时扩展名要加上".java",文件类型改成:“所有的文件(*.*)”。
2. 问:到底 Java 是如何传递参数的?是 by value 或 by reference? 答: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。
3. 问:String 这个类型的 class 为何定义成 final? 答: 主要是为了“效率” 和 “安全性” 的缘故。若 String 允许被继承, 由于它的高度被使用率, 可能会降低 程序的性能,所以 String 被定义成 final。
4. 问:finalizers 和 C++ 的 destructors 有何差异? 答:Java 内部具有“内存使用回收” 的机制, 虽然它也提供了类似 (C++ 的) destructors 的 finalize(),每 个对象都可以使用这个方法 method,但必须冒著破坏原先回收机制的危险。所以建议尽量避免使用 finalize(),不妨考虑多使用 null 及 dispose() 来释出资源会好一些。
5. 问:继承了一个 class 叫做 Frotz,编译器却给我“No constuctor Frotz() in the class”这样的错误提示, 为什么呢? 答:记住每当您定义了一个 class 的 constructor,除非您一开始就去 call 这个 constructor,否则 Java 会 自动引入 superclass 原先不含参数的 constructor, 如果 superclass 的 constructor 都是有参数的,那么 问题中的错误提示便出现了。 解决的方法很简单, 找一找 API 文件,加上正确的参数就得了。
6. 问:怎样让 char 类型的东西转换成 int 类型? 答: char c = 'A'; int i = c; //反过来只要作强制类型转换就行了 c = (char) I;
7. 问:我的 applet 原先好好的, 一放到 web server 就会有
问题,为什么? 答:一般来说,从以下方向试试:
确定 class 文件的格式没错——已经编译过,也没有损坏的情形; 确定所有用到的 class 文件放到 web server 上,少一个都不行; 确定所有的文件名和 class 名称一致,特别检查大小写有无差错; 如果
程序中用到 package,
web server 上的目录就要当心了。譬如您在 class 中宣告了一个叫 COM.foo.util 的 package,那么 web server 的 applet codebase 目录底下就非得有 COM/foo/util 这个子目录不可。(注意 目录名称也有大小写之分); web server 上的文件档案应该事先设定好。(尤其是 search,read 和 execute 权限)
8. 问:怎样在 Applet 中用某个图形涂满整个背景? 答:在背景建立 Panel 或 Canvas, 然後用图形
填满它。
9. 问:怎样在 Applet 中建立自己的菜单(MenuBar/Menu)? 答:首先在 Applet 的 init() 方法中建立 Frame instance, 然后将 Menus, Menubar 都加上去即可。 (setMenuBar() 是 Frame 下的方法)或者,找到 Applet 上层的 Frame 后依法炮制。 Container parent = getParent(); while (! (parent instanceof Frame) ) parent = parent.getParent(); Frame theFrame = (Frame) parent; 注意:第二个方法在 Mac 或某些 browsers 上并不可行。 如果您使用的是 JDK 1.1,也可以考虑使用 popup menu,这样就不必理会 Frame 的问题了。
10. 怎样比较两个类型为 String 的字符串? 答: 在两个对象之间使用 "==", 会将“两个对象是否有同一 reference”的结果传回。 也就是说, 这等同于“两 个对象是否拥有同一地址 (address)”,或者“两个对象物件是否为同一对象”。如果您的意思是判断两个字 符串的内容是否相同,那么应该使用以下的方法才对: if (s1.equals(s2) ) or if (s1.equalsIgnoreCase(s2) ) or if (s1.startsWith(s2) ) or if (s1.endsW