标题:JAVA问题大集合
只看楼主
野蛮女人
Rank: 5Rank: 5
等 级:贵宾
威 望:19
帖 子:827
专家分:0
注 册:2007-4-7
结帖率:100%
 问题点数:0 回复次数:22 
JAVA问题大集合

. 问:怎样用 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.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 value reference 扩展名 
2007-06-24 15:38
小人物一个
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2006-12-11
得分:0 
谢谢版主,第一个问题就让我受教了!谢谢!

成功只能代表过去,能力只能适应今天,学习才能拥有将来!
2007-06-25 11:21
za46779276
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-6-25
得分:0 

还不错啊,有点特别

2007-06-25 12:30
弱智抓蛙男
Rank: 1
等 级:新手上路
帖 子:264
专家分:0
注 册:2006-11-24
得分:0 
好感动
我喜欢野蛮的女人
2007-06-25 15:01
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
得分:0 
你品味这么特殊?

可惜不是你,陪我到最后
2007-06-25 16:16
a276202460
Rank: 2
等 级:新手上路
威 望:4
帖 子:392
专家分:1
注 册:2007-4-10
得分:0 
哈哈

2007-06-25 17:49
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
得分:0 

来看一下精华贴哈哈

2007-06-25 17:51
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
得分:0 
完了。。。怎么一转眼又不是精华贴了。。
2007-06-25 17:52
Eastsun
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:32
帖 子:802
专家分:0
注 册:2006-12-14
得分:0 
以下是引用野蛮女人在2007-6-24 15:38:24的发言:

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。

可以负责的说,JAVA中没有传址一说.之所以会存在Object是"传址"的理解,是因为对JAVA中reference本身的含义理解不清楚.

以下是引用野蛮女人在2007-6-24 15:38:24的发言:

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());

不妨把下面的代码用编译一下(JDK1.5or higher):

public class FT{
public static void main(String[] args){
Float one =1.0f, two =2.0f;
Float three =one+two;
System.out.println(three);
}
}

so,这个猜想在JDK1.5及之后是正确的

[此贴子已经被作者于2007-6-25 18:20:51编辑过]


My BlogClick Me
2007-06-25 18:18
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
得分:0 
同意Eastsun,其实JAVA中都是传值,JAVA中的引用不过是一个指向句柄的指针,而这个句柄又是两个指针,一个指向类的方法表,另一个指向对象的数据表。所以其实传的都是值,C++中可以直接在堆栈上创建对象,而JAVA中只能在堆上创建对象,堆栈上保存对象的引用。所以C++中的引用和JAVA中的引用是不一样的。。

[此贴子已经被作者于2007-6-25 18:26:18编辑过]


2007-06-25 18:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-149919-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.217772 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved