JAVA问题集合

发表于: 2003-08-27 08:58    发表主题: JAVA问题集合

作者:猫小                来源:http://bbs.chinaunix.net/forum/viewtopic.php?t=148099 

推荐此帖为精华,以便版主设置 举报此帖,以便版主处理 引用并回复

1. 问:怎样用 Win95 的记事本 (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.endsWith(s2) )

or if (s1.regionMatches(s1_offset, s2, s2_offset, length) )

or if (s1.compareTo(s2) <0)



11. 怎样将浮点数(float)相加 ? Float 好像没有办法?

答:我猜想您的程式大概写成这样:

Float One;

Float Two;

Float Hard = One + Two;

请注意 float 和 Float 是不同的,前者是 Java 基本类型之一, 而后者却是class。您应该将源代码改为:

float One;

float Two;

float Hard = One + Two;



Float One = new Float(1.0);

Float Two = new Float(2.0);

Float Hard = new Float(One.floatValue() + Two.floatValue());



12. 如何将字串String转换成整数int?

答:有两个方法:

1)int i = Integer.parseInt([String]); 或



i = Integer.parseInt([String],[int radix]);

2)int i = Integer.valueOf(my_str).intValue();

注: 字串转成Double, Float, Long的方法大同小异。



13. 如何将整数 int 转换成字串 String?

答:有三种方法:

1)String s = String.valueOf(i);

2)String s = Integer.toString(i);

3)String s = "" + i;

注:Double, Float, Long 转成字串的方法大同小异。



14. 如何从一个文件档案的尾端新增记录?

答:有两种方法:

1)RandomAccessFile fd = new RandomAccessFile(file,"rw");

fd.seek(fd.length());

然后使用 fd 的method写入

2)使用FileOutputStream(String name,boolean append) throws IOException这个 constructor



15. 如何设置Java 2(JDK1.2)的环境变量?

答:Java 2安装后,需要设置PATH和JAVA_HOME环境变量。与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径。Java 2环境变量的设置如下例所示:

Solaris平台: setenv JAVA_HOME Java2的安装路径
setenv PATH $JAVA_HOME/bin:${PATH}

Windows平台:set JAVA_HOME=Java2的安装路径
set PATH=$JAVA_HOME/bin;%PATH%



16. 哪些Java集成开发工具支持Java 2?

答:目前流行的Java集成开发环境,如Inprise的Jbuilder;Symantec的Visual Cafe,;Sybase的PowerJ都支持Java 2。



17. 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?

答:当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程序。



18. 在Java语言中,如何列出PC机文件系统中的所有驱动器名?

答:在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能。



19. 为什么Runtime.exec("ls")没有任何输出?

答:调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息。由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(),Process.getErrorStream()方法重定向给它的父进程了。用户需要用这些stream来向子进程输入数据或获取子进程的输出。所以正确执行Runtime.exec("ls")的例程如下:

try

{

process = Runtime.getRuntime().exec (command);

InputStreamReader ir=newInputStreamReader(process.getInputStream());

LineNumberReader input = new LineNumberReader (ir);

String line;

while ((line = input.readLine ()) != null)

System.out.println(line);

}

catch (java.io.IOException e){

System.err.println ("IOException " + e.getMessage());

}



20. 若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?

答:使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应。ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头。因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头。所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException。

一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法。被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object?若是,则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法。



21. 对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?

答: 目前,没有直接的方法可以将对象写入到随机存取文件中。但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象。需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误。例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中。相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象。



22. 在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?

答: Thread.suspend本身易于产生死锁。如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源。如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁。

因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态。一旦需要该线程继续运行,其它线程会调用notify()方法来通知它。

阅读更多
个人分类: java
想对作者说点什么? 我来说一句

java问题集合适用于Java学习者

2008年10月24日 281KB 下载

JAVA面试问题集合

2012年12月12日 42KB 下载

C语言常见问题集合.pdf

2009年07月29日 1.34MB 下载

ArcIMS开发问题集合.rar

2008年04月25日 4.38MB 下载

Android网络相关问题集合

2011年09月08日 5KB 下载

校园网客户端常见问题集合

2010年06月11日 4KB 下载

IT面试问题整合

2016年04月27日 21KB 下载

excel资料05

2008年05月16日 651KB 下载

远程控制解决问题集合.php

2008年12月15日 43KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭