Java入门及faq

J2EE相关 专栏收录该内容
10 篇文章 0 订阅

Java入门及faq

一、入门
1、下载和安装J2SDK <a href=http://java.sun.com/j2se/1.4.1/download.html>http://java.sun.com/j2se/1.4.1/download.html</a>
2 JAVA VM <a href=http://www.java.com/en/index.jsp>http://www.java.com/en/index.jsp</a>
3 API <a href=http://java.sun.com/api/index.html>http://java.sun.com/api/index.html</a>
1 首先下载J2SDK安装
a 更新PATH环境变量
为了能在任何目录下都能执行java命令(如javac、java、 等),需要将java的bin目录放入PATH环 境变量中。 对于Windows95/98, 打开“开始”菜单、选择“运行”、输入命令sysedit(调用系统配置编 辑程序),在C:/AUTOEXEC.BAT窗口中找到PATH设置并追加一项(c:/jdk1.3.1_01/bin)对于Windows NT and Windows 2000 ,进入“开始”菜单,选择“设置/控制面板/系统”。对于Windows NT,选择“环境” 页,对于Windows 2000,选择“高级”页,在环境变量设置中的用户变量栏中增加(如果原来没有PATH) 或修改PATH环境变量,使其包含c:/jdk1.3.1_01/bin路径。
b 更新CLASSPATH环境变量
为了使系统能找到用户定义的类,需要将用户类所在的目录(通常是当前目录即把 . 加入到 classpath中)放入CLASSPATH变量中。具体更改方法同PATH修改过程,只是要找到 CLASSPATH环境 变量进行修改。
jdk Win2000下的环境变量设置

在“我的电脑”的属性的高级选项当中有一个环境变量设置。
1)在系统环境变量PATH参数后面加上bin的访问路径。例如如果是直接安装在c盘下面的话就在PATH参数后面加入c:/jdk1.3.1/bin。加入后的结果一般为:%SystemRoot%/system32;%SystemRoot%;%SystemRoot%/System32/Wbem;c:/jdk1.3.1/bin。
2)新建一个系统环境变量CLASSPATH,将其值赋为:.;c:/jdk1.3.1/lib/tools.jar;c:/jdk1.3.1/lib/dt.jar;c:/jdk1.3.1/jre/lib/dt.jar;d:/JavaProgramming/
其中d:/JavaProgramming/是Java源程序的存放目录。
注意:在使用java命令的时候后面跟随的源程序的名字中的大小写应该完全与源程序名字中的相同,也就是说Java命令是不忽略大小写的。另外,在Java命令后面的程序名不要带上.class!

c 确认系统安装
在DOS提示符下,输入set命令可以查看PATH和CLASSPATH的设置是否成功 ( 如果是98者需运行 AUTOEXEC.BAT才能使修改的设置生效 如果是2000需把dos关闭重新运行 )
2 然后运行你的第一个java程序
写个类保存为.java文件 一定记得如果是用记事本编辑器的话 保存时要选择保存类型为所有类型然后文件名字和你的类名字要一模一样 或者也可以把类名.java加上引号就可以避免保存为.java.txt的类型了

3 常见错误处理
如果运行javac命令时出现can not read xxx.java 首先看看你的文件是否保存为.java.txt的类型了(右点文件看属性里的扩张名) 重新保存 记得此时要把文件名.java加上引号 保存 。 若运行java命令时提示exception in thread "main" java.lang.NoClassDefFoundErroe:的异常 说明你的classpath里没有加入 .

2 exception in thread "main" java.lang.NoClassDefFoundErroe:
说明你的classpath里没有加入 .

3 "=="和"equals()"的区别在哪里?

"=="是java中固定的操作符,用来判断是否相等,用法比较单一
由于在java中除了基础类型(int,char,boolean等)其它都是对象,而用"=="来比较对象实际上就是在比较对象的句柄(也可以说是地址的比较),因此即使对象的内容是一样的用"=="判断也是不一样的
(除非:Object a =new Object()
Ojbect b = a;
if(a==b)
System.out.println("true");
在上述这个程序的情况下执行结果是打印出“true”)。
而equals()方法在Java中所有的对象都具有的,由于Java中的所有类都extends Object,所以个各类都可能对equals()方法重写(面向对象多态性的体现),因此equals()方法虽说也是比较两个对象,但由于各个类中的实现方法不一样,从而其比较的内容也不一样,就像楼上说的String 对象的equals()是用来比较字符串对象所包含的字符串值是否相等。
结论:==的用法比较单一,是一个固有的操作符
equals()方法是一个可以根据需要来比较两个对象的某些特征是否相等,用途很广


4 StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
s1.equals(s2)//为什么是false
String s1 = new String("a");
String s2 = new String("a");
s1.equals(s2)//为什么是true

其实很简单,我来总结一下。
一、String的equals方法是覆盖Object的,所以String a=new String("ss");String b=new String("ss"); 生成了两个对象,但是a.equals(b)=true,比较的是值。
二、StringBuffer的equals方法没有覆盖Object的方法,所以StringBuffer a=new StringBuffer("ss");StringBuffer b=new StringBuffer("ss");,生成了两个对象,
a.equals(b)=false,比较的是地址。
三、等号比较的是地址,String a = "a";String b=a;只生成了一个对象a==b true。
StringBuffer a=new StringBuffer("a");StringBuffer b = a; 也是生成一个对象a==b true。
四、String a="ss";String b="ss"; a.equals(b)=true a==b true因为也是一个对象。这是因为编译时只产生了一个对象"ss"。String a=new String("ss");String b=new String("ss");a.equals(b)=true,没有疑问,a==b false。因为a,b是在运行时才产生的对象,产生了2个对象。
要点:编译对象和运行对象。


5. Java Web Start是什么?
看这里http://java.sun.com/products/javawe...adme_zh_CN.html

6 trim()函数的用法

使用一个对象。如:
String aa;
aa=" aaaa ";
aa=aa.trim();
aa return "aaaa".
是去掉字符串的前部和后部的空格。


7 怎么提取系统时间? 

Date myDate=new Date(System.currentTimeMillis());
//This time format is your local time format.
System.out.println(myDate.toString());
//Used the simple format to get the String you want .
//The valid string ,you can reference the JDK Doc
SimpleDateFormat sDateFormat=new SimpleDateFormat("yyyy/MM/DD HH:mm:ss");
System.out.println(sDateFormat.format(myDate));

使用Date和SimpleDateFormat 可以得到任何格式的时间,另外还有一个更强的类是Calendar,下面会有讨论。


9 日期的显示格式化

例子:
import java.util.*;
import java.text.*;
public class FormatDate {
public static void main(String[] args) {
Date now = new Date();

DateFormat defaultFormat = DateFormat.getDateInstance();
DateFormat shortFormat = DateFormat.getDateInstance(DateFormat.SHORT);
DateFormat mediumFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
DateFormat longFormat = DateFormat.getDateInstance(DateFormat.LONG);
DateFormat fullFormat = DateFormat.getDateInstance(DateFormat.FULL);
String defaultDate = defaultFormat.format(now);
String shortDate = shortFormat.format(now);
String mediumDate = mediumFormat.format(now);
String longDate = longFormat.format(now);
String fullDate = fullFormat.format(now);

System.out.println("(Default) Today :" + defaultDate);
System.out.println("(SHORT) Today : " + shortDate);
System.out.println("(MEDIUM) Today :" + mediumDate);
System.out.println("(LONG) Today : " + longDate);
System.out.println("(FULL) Today : " + fullDate);
}
}

运行结果为:
D:/javamail>java FormatDate
(Default) Today :2003-6-15
(SHORT) Today : 03-6-15
(MEDIUM) Today :2003-6-15
(LONG) Today : 2003年6月15日
(FULL) Today : 2003年6月15日 星期日


10 静态和非静态的嵌套类有什么区别?

static内部类意味:
1创建一个static内部类的对象,不需要一个外部类对象
2不能从一个static内部类的一个对象访问一个外部类对象


11 怎样判断输入的东东是字符还是数字啊?

用Float.parseFloat(String data)解析一下
有NumberFormatException抛出就不是数字了

如果你用StreamTokenizer的话,那里面有StreamTokenizer.ttype,可以判断是否是数字。
你也可以 Character.isDigit(char ch)来判断没一个字符是否是数字。
Character类的方法
static boolean isDigit(char ch)
Determines if the specified character is a digit.

static boolean isLetter(char ch)
Determines if the specified character is a letter.

static boolean isLetterOrDigit(char ch)
Determines if the specified character is a letter or digit.

static boolean isWhitespace(char ch)
Determines if the specified character is white space according to Java.


12 finalize()和System.gc()区别

finalize()是由JVM自动调用的,你可以用System.gc(),但JVM不一定会立刻执行,JVM感觉内存空间有限时,才会开始执行finalize(),至于新的对象创建个数和被收集个数不同是因为收集的对象只和JVM的垃圾收集策略有关,和你的chair()创建无关,finalize()只是chair()中的一个方法,不和chair()创建有关。


13 怎么键盘上输入2 ….竟印出50 ??? System.in.read()用法

import java.io.*;
public class test
{
public static void main(String[] args)throws IOException
{
int s[]=new int[10];
s[0]=System.in.read();//正确的应该改为s[0]=Integer.parseInt(args[0]);
System.out.println(s[0]);
}
}

打印出来的是键盘上字符对应的ASCII码值,比如你输入a,输出的就是97。另外:
Integer.parseInt(String) 是拿String来做参数,返回带符号的int型
而System.in.read() 则是返回0-255之间的整数,来表示ASCII 码,两者虽然都是int,但是意义不一样。


什么是面向对象的设计思想?

什么是面向对象的设计思想?也许有不少初学者对这个概念还有许多不明白的地方,
特别是这个处于新旧思想交替的时代,许多人刚刚学完现在看来是快要淘汰的只是面向过程的

语言。他们的脑子还没有脱离面向过程思想的束缚,抬头却发现,“面向对象”早已经流行

开来,这个陌生的词漫天飞舞。随便拿起一本流行计算机技术书籍,那里会没有“面向对象”

的字眼!于是心中便惶惑了:什么叫“面向对象”?不感兴趣者,一带而过;有志于在这方

面发展的,匆忙找到一本有关书籍来啃究竟什么是“面向对象”。然而,要突破思想的束缚,

说难也不难,说到要深刻认识却也不容易。笔者在做了一些轻量级的工作后,颇以为有点心

得,不怕贻笑大方,写出已供广大同行批评指正。

“对象(Object)”一词,早在十九世纪就有现象学大师胡塞尔提出并定义。对象是世

界中的物体在人脑中的映象,是人的意识之所以为意识的反映,是做为一种概念而存在的

先念的东西,它还包括了人的意愿。举例说明吧。当我们认识到一种新的物体,它叫树,于

是在我们的意识当中就形成了树的概念。这个概念会一直存在于我们的思维当中,并不会因

为这棵树被砍掉而消失。这个概念就是现实世界当中的物体在我们意识当中的映象。我们对

它还可以有我们自己的意愿,虽然我们并不需要付诸实现——只要在你的脑中想着把这棵树

砍掉做成桌子、凳子等——我们就把它叫做意向。于是,对象就是客观世界中物体在人脑中

的映象及人的意向。只要这个对象存在我们的思维意识当中,我们就可以籍此判断同类的东

西。譬如,当我们看到另外一棵树是,并不会因为所见的第一棵树不在了失去了供参照的模

板而不认识这棵树了。当我们接触某些新事物时,我们的意识就会为这些事物确立一个对象

。当然这个过程是怎么形成的,那就不是我们所能讨论的问题了。

上面所说的对象研究的是一般意义上的问题,因而它可以外推到一切事物。我们经常

所说的“对象”,一班指的是解决信息领域内所遇到问题的方法。特别是应用软件技术来解

决问题的方法。如我们经常碰到的面向对象的编程(Object-Oriented Programming)、面向对

象的分析(Object-Oriented Analysis)、面向对象的设计(Object-Oriented Design)等。应用

前面所介绍的关于对象的概念,可以对这些问题做进一步的分析。在面对较复杂的系统,我

们可以将它作为一个对象来进行分析。一个系统(解决某个问题的全套解决方案)作为一个

对象,可以由多个部分组成。同样,这个对象也可以由多个对象组成。对于同类的事物,可

以由一个对象来表示。这样做的益处是显而易见的,它灵活而高效,可以大大减轻设计人员

的工作量,简化实际的模型。举一个例子。在关系型数据库的设计当中,我们可以把一个元

组当作对象,给它定义一组操作方法。这些方法将适用于所有元组,从而我们不必在更大的

范围内去细致的考虑不同的元组(如判断一个元素是否合法):因为它们有一组公共的面向

本身的方法,它们“自己”可以“解决”自己的问题。更上一层的对象可以是一个表、视图

等。表对象在元组对象的基础上又有它们自己的方法,如增加、删除等。从这个层面上讲,

它也只需要做“自己”的事情,因为有元组对象的支持,它无须去考虑像元素是否合法这类

的事情。甚至,有时为了满足我们还可以将元素或表群当作时对象并定义它们自己的方法。

这样,更能显示面向对象的优势。

上面所讨论的可以说是面向对象的分析方法。在具体的设计过程当中,还应该采用适当

的方式。因为面向对象的思想固然很先进,如果做得不好的话,同样不能达到预期的效果。

这主要表现在处理对象与对象的关系上没有做好,对象与对象的层次不分明。如上面所举得

关系型数据库得例子,如果在元组层面上得对象过多得考虑一个表对象得因素,或一个表层

面上对象过多地考虑一个元组对象的因素,甚至去考虑元素层面上的因素,这些都不是好的

面向对象的设计方法。这一点,在语言实现方面,Java比C++更有优势,因为它不允许多

重继承,从而使对象之间的关系更明确。谁也不会否认C++的功能更强大,但是它也要由次

付出巨大代价——当现在代码库发展到一定程度、一定规模时,个对象之间的层次关系将

变得异常复杂,给后继使用者得学习、理解带来很大的困难,应用上很难把握。另外,虽然

C++具备面向对象的处理能力,但它还是保留了很多面向过程的东西。用C++完全可以不用

面向对象的思想来进行程序设计,当然人们不会这样去做——除了那些只是把C++看成是C

扩充的初学者,这就为以后的发展埋下了隐患。在者一方面,Java的限制更多一点。就者一

点还远远不够。搞开发的是人,开发方法是由人决定的。要应用面向对象的方法开发出优秀

的软件,必须要求开发人员具有良好的面向对象的思想。好的工程师可以利用适当的工具开

发出优秀的软件——而不在乎他所使用的语言工具——Java、C++、Object Pascal、Ada等。

要能应用面向对象的思想熟练得做好系统分析、设计、实现(编程),首先要求开发人

员知道什么是对象,什么是面向对象得概念,否则是谈不上应用面向对象得思想搞软件开发

了。希望读者能在看到我在前面的不太严密、详细的论述之后可以对“对象”这个概念由一

个初步的了解,同时也希望有不同看法的同行提出批评。其次,还要求开发人员有比较丰富的开

发经验。否则,光谈理论,那是不能真正体会“面向对象”的含义的。尽管如此,我们还是

可以定出一般的规则的。抛开生命周期的其它阶段,对一个确立的系统一般可以进行以下几

个过程:

一、首先应用面向对象的思想进行系统分析。仔细的划分系统的各个部分,明确它

们之间的层次关系,然后将各个部分作为一个对象进行功能上的分析。例如,要设计一个用

户界面,它可能由几个主要的窗体组成:主窗体MainFrame、功能性子窗体FunctionFrame

以及对话对话框Dialog。其中,MainFrame中可能还包括菜单、工具条、文本框、状态条等

Windows组件。对于要完成一些重要功能的组件,我们可以单独将它作为一个对象看待,在

具体的实现中,用单独一个类来表示。而一些并不是很重要的、只是在过程中需要用到的组

件,就可以将它们集成到其他对象中去。要明确每个对象自己的任务——不要让它有缺陷,

也不能越殂代庖。各个对象之间的关系通过过程、内容、功能等耦合来实现。

实际上,如果你是用Java进行开发,你会发现swing组件本身就非常好用,因为它们

之间的关系是很分明的——你无须去理解分清象C++中的组件那样复杂的关系。在开发你自

己的组件时,也需要力求达到这样的效果。

二、其次时应用面向对象的思想进行系统设计。其实在真正做好了系统分析的工作之后,

进行设计就比较轻松了。这段时间只要进一步确定各个对象的功能以及各个对象之间的关系

。为了能够更好地帮助实现人员明白各个对象之间的关系,可以利用一些工具将这些组件的

关系表示出来,统一建模语言(Uniformed Module Language,UML)就是这样的一种好东

西。它不仅可以现在帮助开发人员了解整个系统,也为以后的维护工作提供一个档案文件,

给以后的工作提供巨大的方便。

 

三、实现(编码)。这一点就不用多说了。在我的下一篇文章中,将会给出一个比较简

单的实例,希望会给读者一个启发。


在搞软件开发时,编码不是最重要的。分析、设计才是最重要的。也许当我们接受了一

些更先进的思想之后,会更加理解这一点了。希望我们中国的软件开发人员能应用面向对象

的思想开发出具有国际竞争力的优秀软件。

如何取得本机的IP

import java.net.*;
public class GetSelfIp{
public GetSelfIp(){
}
public static void main(String[] args){
InetAddress host = InetAddress.getByName(null); // get the local ip address
.........
}
}

InetAddress下面一共就三个方法:getAllByName(String)、getByName(String)、getLocalHost()

 

throw和throws有什么区别?
throw是用来抛出exception的,用在方法中,
而throws是用来声明可能产生的exception的,用在类或方法的声明中

 

怎样生成 .jar文件?

用法:jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
选项:
-c 创建新的存档
-t 列出存档内容的列表
-x 展开存档中的命名的(或所有的〕文件
-u 更新已存在的存档
-v 生成详细输出到标准输出上
-f 指定存档文件名
-m 包含来自标明文件的标明信息
-0 只存储方式;未用ZIP压缩格式
-M 不产生所有项的清单(manifest〕文件
-i 为指定的jar文件产生索引信息
-C 改变到指定的目录,并且包含下列文件:
如果一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。
示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvf classes.jar Foo.class Bar.class
示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有
文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvfm classes.jar mymanifest -C foo/ .
示例3:jar -cvf zhz.jar Hello.class


优秀文章网站推荐:
1 如何迅速成为Java高手[Tomjava原创]
http://www.java.com.cn/showtopic.as...719&Forum_ID=31

2. 一个老工程师的话 (给年轻电子工程师的十大忠告)
http://www.pconline.com.cn/pcjob/it...312/261734.html

3. 大量 Java 程序例子, Examples for almost all Java classes
http://javaalmanac.com/egs/

4. The Java Tutorial on Sun
http://java.sun.com/docs/books/tutorial/

5. 谈谈java的学习方向(转载)
http://www.430000.net/printpage.asp?ArticleID=46

6. Java 学习之道
http://www.csdn.net/develop/author/cxy/way_to_java.shtm

7. Java 程序编码规范 from SUN
Code Conventions for the JavaTM Programming Language
http://java.sun.com/docs/codeconv/h...onvTOC.doc.html

8. Java 程序编码规范 from IBM
http://www-900.ibm.com/developerWor...ard/index.shtml

9. 给C++初学者的50个忠告 good for Java too
http://post.baidu.com/f?kz=647098

10. 对初学者很有用的文章
http://www.mifun.net/pengjie/myweb/...?id=95&sort=jsp

11. 提问的智慧
How To Ask Questions The Smart Way
英文版: http://www.catb.org/~esr/faqs/smart-questions.html
中文版: http://alfredy.myetang.com/

12. 从Coding Fan到真正的技术专家
http://www.chinajavaworld.net/forum...ic=12814&show=0

java新手必读,一些入门知识

1、jdk就是j2se,jdk1.1.8版本以后改成为j2se,
下载地址:http://java.sun.com/j2se/downloads.html
2、jre是java运行时环境(jdk1.3版本以后都包含jre)不用单独下载
3、设置环境变量
安装了jdk以后,要配置环境变量
我的电脑->属性->高级->环境变量
添加以下环境变量(假定你的java安装在c:/jdk1.3)
java_home=c:/jdk1.3
classpath=.;c:/jdk1.3/lib/dt.jar;c:/jdk1.3/lib/tools.jar;(.;已经不能少,因为它代表当前路径)
path = c:/jdk1.3/bin
新开一个dos窗口,键入java和javac测试一下
4、简单测试程序


代码:--------------------------------------------------------------------------------
public class Test{
public static void main(String args[]){
System.out.println("Hello world!");
}
}
--------------------------------------------------------------------------------

javac Test.java
java Test

5、java、j2ee、xml 开发常用工具介绍

j2sdk安装程序及Java API Doc
j2sdk-1_4_0 for win
j2sdk-1_4_0 for linux
j2sdk-1_4_0-doc
j2sdkee-1.3-doc

可去 http://java.sun.com/j2ee/download.html 下载


6、build工具
ant: Ant是一个基于java的跨平台的build工具。之所以Ant能跨平台,是因为Ant不再需要你编写shell命令,Ant的配置文件是基于XML的任务树,
能让你运行各种各样的任务,任务的运行是由实现了特定任务接口的对象来完成的。

http://jakarta.apache.org/ant


7、开发工具(IDE,集成开发环境)
1、开发工具首选两种
1、jbuilder——不用我多说了
2、netBeans(下载地址www.netbeans.org,免费),forte也就是Sun EE和netbeans类似
(估计是使用netbeans的原码改写而成), 但是netbeans(3.4版本)我觉得比较好用,
可以和tomcat和cvs等集成,但是唯一不足的就是不能开发EJB,forte倒是可以,
但是不能给出我们自己写的API(也就是.后出现的方法都是系统的,而我们自己写
的方法出不来,faint)
其它开发工具
Eclipse: 号称未来能进行任何语言开发的IDE集大成者。
Eclipse 是替代IBM Visual Age for Java(以下简称IVJ)的 下一代IDE开发环境,
但它未来的目标不仅仅是成为专门开发Java程序的IDE环境,根据Eclipse的体系结构,
通过开发插件,它能扩展到任何语言的开发,甚至能成为图片绘制的工具。
目前,Eclipse已经开始提供C语言开发的功能插 件。更难能可贵的是,
Eclipse是一个开放源代码的项目,任何人都可以下载Eclipse的源代码,
并且在此基础上开发自己的功能插件。也就是说未来只要有人需要,
就会有建立在Eclipse之上的COBOL,Perl,Python等语言的开发插件出现。
同时可以通过开发新的插件扩展现有插件的功能,比如在现有的Java开发环境中加入Tomcat服务器插件。
可以无限扩展,而且有着统一的外观,操作和系统资源管理,这也正是Eclipse的潜力所在。
http://www.eclipse.org


8、专业XML编辑工具
XMLSPY:支持SOAP;支持Oracle XML Schema扩展;支持 MSXML4等等;提供三种XML文档视图:结构显示和编辑,
原码视图和支持CSS,XSL的预览。支持最新schema标准,可以根据schema校验XML文档可以将不同schema版本schema
文档转换成符合最新schema规范的文档可以将DTDs, XML-Data, 或者 BizTalk schemas 转换成 W3C XML
Schema从数据库连接(ADO,ODBC)中自动产生XML Schema可以直接访问数据库,
提供数据库和XML之间的转换提供类似Office XP compatible的用户界面提供了更方便的用户界面定制方式.
该编辑器支持所见即所得的文本编辑,基于form地数据输入,图形元素等,包括了一个图形化的XSLT产生器,
可以针对schema或者DTD产生样式文档,最后应用于相应的XML文档。

可去 http://www.xmlspy.com/download.html 下载
9、Framework

cocoon:XML Framework
Cocoon是采用100%纯Java编写的一个内容发布框架。
Cocoon让你能采用W3C的最新技术(DOM、XML、XSL)来提供Web内容。
新的Cocoon模式能将文档内容、样式、处理逻辑进行完全的分离,允许这三层能独立地设计、创建和管理,
从而减少了管理开销,加强了工作的重用性,减少了开发时间。

来源:http://xml.apache.org/cocoon


9、struts:JSP Framework
Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。
采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。
Struts有如下的主要功能:
   · 包含一个controller servlet,能将用户的请求发送到相应的Action对象。
   · JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。
   · 提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。

来源:http://jakarta.apache.org/struts

10、turbine:Servlet Framework
Turbine是基于servlet的framework,使有经验的Java开发员能快速地构建web应用。
使用Turbine,可以通过创建使用特定服务来处理模板的Screen,
来集成现有的模板技术(例如Velocity、Webmacro、Java Server Pages(JSP)、FreeMarker、cocoon)。

来源: http://jakarta.apache.org/turbine
11、Demo

Java Pet Store: j2ee应用样例
Java Pet Store是Java software蓝图规划的j2ee企业应用样例。
它示范了怎样应用j2ee 平台的威力去构建一个灵 活的、可伸展的跨平台企业应用。
你可从java.sun.com/blueprints/enterprise/上获取最新的信息及学习资料,目前最新的版本是基于j2ee1.3的1.3_01。

来源: http://java.sun.com/blueprints/enterprise/

12、database

pointbase:进军企业级数据库市场的一只新军。
PointBase 是第一个经过认证的100%纯Java数据库,可用于任何使用的 Java 2 标准版虚拟机 (JVM)的平台。

来源: http://www.pointbase.com/
13、j2ee server
1、j2sdkee1.3.1 referrence implement(j2ee参考实现),sun的一个很好的学习j2ee的工具,记着,这是一个学习的工具
不是一个企业开发的工具,因为它的效率,安全等诸多问题,所以不能用它做项目或者产品。
http://java.sun.com/j2ee/download.html
2、weblogic和websphere 不用我多说了吧!
3、sun one Application Server(前身是iplanet)---强烈推荐
里面是一个比较完成j2ee开发平台
1、sun one studio 4 (前身 forte)
2、tomcat 4
3、sun one application server 一个较棒的j2ee server
4、和j2ee ri集成
5、pointbase 是第一个经过认证的100%纯Java数据库
这些工具可以够你开发任何java产品,最重要的是,它是一个免费的j2ee服务器,并且是免费的哦
比起jboss来说,不知道好到哪里去了 哈哈,这下活该我发了!!!
http://wwws.sun.com/software/download/app_servers.html

14、UML工具

1、Rational Rose 大哥大级别的UML设计工具,功能很强大。
2、Together 可以认为是最好的java UML设计工具,可以根据类图同步生成java代码,设计完成后,系统的
框架也出来了,爽啊!

15、指导书籍
1、入门书籍就不多介绍了
看一些<<从入门到精通>>之类的书籍,<<java编程思想>>初学者不推荐
2、java programmer推荐看<<java编程思想>
3、java designer推荐看<<java与模式>>(新书,中国人写的,不是翻译的,中国人能写出这样有深意的IT书,很难得)

 

 


1.什么是java的path和classpath?

Java 中的 ClassPath 和 Package

前言:

由于这两个问题新手问得较多, 且回答比较零散, 很难统一整理, 所
以就直接写了一篇, 还请大家见谅.


正文:

一, 类路径 (class path)

当你满怀着希望安装好了 java, 然后兴冲冲地写了个 hello world,然后编译,
运行, 就等着那两个美好的单词出现在眼前, 可是不幸的是, 只看到了 Can't find
class HelloWorld 或者 Exception in thread "main" java.lang.NoSuchMethodError: ma
in.
为什么呢? 编译好的 class 明明在呀.
我们一起来看一看 java 程序的运行过程. 我们已经知道 java 是通过 java


发信人: SuperMMX (笑天子), 信区: Java
标 题: [整理] Java 的 Class Path 和 Package
发信站: BBS 水木清华站 (Mon Apr 9 08:15:01 2001)

Java 中的 ClassPath 和 Package

前言:

由于这两个问题新手问得较多, 且回答比较零散, 很难统一整理, 所
以就直接写了一篇, 还请大家见谅.


正文:

一, 类路径 (class path)

当你满怀着希望安装好了 java, 然后兴冲冲地写了个 hello world,然后编译,
运行, 就等着那两个美好的单词出现在眼前, 可是不幸的是, 只看到了 Can't find
class HelloWorld 或者 Exception in thread "main" java.lang.NoSuchMethodError: ma
in.
为什么呢? 编译好的 class 明明在呀.
我们一起来看一看 java 程序的运行过程. 我们已经知道 java 是通过 java


虚拟机来解释运行的, 也就是通过 java 命令, javac 编译生成的 .class
文件就是虚拟机要执行的代码, 称之为字节码(bytecode), 虚拟机通过 classloader
来装载这些字节码, 也就是通常意义上的类. 这里就有一个问题, classloader 从
哪里知道 java 本身的类库及用户自己的类在什么地方呢? 或者有着缺省值(当前路径).
或者要有一个用户指定的变量来表明, 这个变量就是类路径(classpath), 或者在运行
的时候传参数给虚拟机. 这也就是指明 classpath 的三个方法. 编译的过程和运行
的过程大同小异, 只是一个是找出来编译, 另一个是找出来装载.
实际上 java 虚拟机是由 java luncher 初始化的, 也就是 java (或 java.exe)
这个程序来做的. 虚拟机按以下顺序搜索并装载所有需要的类:
1, 引导类: 组成 java 平台的类, 包含 rt.jar 和 i18n.jar 中的类.
2, 扩展类: 使用 java 扩展机制的类, 都是位于扩展目录($JAVA_HOME/jre/lib/ext)
中的 .jar 档案包.
3, 用户类: 开发者定义的类或者没有使用 java 扩展机制的第三方产品. 你必须在
命令行中使用 -classpath 选项或者使用 CLASSPATH 环境变量来确定这些类的位置. 我
们在上面所说的用户自己的类就是特指这些类.
这样, 一般来说, 用户只需指定用户类的位置, 引导类和扩展类是"自动"寻找的.
那么到底该怎么做呢? 用户类路径就是一些包含类文件的目录, .jar, .zip 文件的
列表, 至于类具体怎么找, 因为牵扯到 package 的问题, 下面将会说到, 暂时可认为
只要包含了这个类就算找到了这个类. 根据平台的不同分隔符略有不同, 类 unix 的系
统基本上都是 ":", windows 多是 ";". 其可能的来源是:

* ".", 即当前目录, 这个是缺省值.


* CLASSPATH 环境变量, 一旦设置, 将缺省值覆盖.
* 命令行参数 -cp 或者 -classpath, 一旦指定, 将上两者覆盖.
* 由 -jar 参数指定的 .jar 档案包, 就把所有其他的值覆盖, 所有的类都来自这个指
定的档案包中. 由于生成可执行的 .jar 文件, 还需要其他一些知识, 比如 package, 还有
特定的配置文件, 本文的最后会提到. 可先看看 jdk 自带的一些例子.

我们举个 HelloWorld 的例子来说明. 先做以下假设:
* 当前目录是 /HelloWorld (或 c:/HelloWorld, 以后都使用前一个)
* jdk 版本为 1.2.2 (linux 下的)
* PATH 环境变量设置正确. (这样可以在任何目录下都可以使用工具)
* 文件是 HelloWorld.java, 内容是:

public class HelloWorld
{
public static void main(String[] args)
{
System.out.println("Hello World!/n");
System.exit(0);
}
}

首先这个文件一定要写对, 如果对 c 熟悉的话, 很有可能写成这样:

 

public static void main(int argc, String[] argv)
{
....
}

这样是不对的, 不信可以试一试. 由于手头没有 java 的规范, 所以
作如下猜想: java 的 application 程序, 必须以 public static void main(String[])
开始, 其他不一样的都不行.

到现在为止, 我们设置方面只设置了 PATH.

1, 当前路径就是指你的 .class 文件在当前目录下,

[HelloWorld]$ javac HelloWorld.java //这一步不会有多大问题,
[HelloWorld]$ java HelloWorld // 这一步可能就会有问题.

如果出了象开头那样的问题, 首先确定不是由于敲错命令而出错. 如果没有敲错命令,
那么接着做:

[HelloWorld]$ echo $CLASSPATH
或者


c:/HelloWorld>echo %CLASSPATH%

看看 CLASSPATH 环境变量是否设置了, 如果设置了, 那么用以下命令:

[HelloWorld]$ CLASSPATH=
或者
c:/HelloWorld> set CLASSPATH=

来使它为空, 然后重新运行. 这次用户类路径缺省的是 ".", 所以应该不会有相
同的问题了. 还有一个方法就是把 "." 加入到 CLASSPATH 中.

[/]$ CLASSPATH=$CLASSPATH:.
或者
c:/HelloWorld> set CLASSPATH=%CLASSPATH%;.

同样也可以成功. Good Luck.

2, 当你的程序需要第三方的类库支持, 而且比较常用, 就可以采用此种方法.比如常
用的数据库驱动程序, 写 servlet 需要的 servlet 包等等. 设置方法就是在环境变量中
加入 CLASSPATH. 然后就可以直接编译运行了. 还是以 HelloWorld 为例, 比如你想在根
目录中运行它, 那么你直接在根目录下执行

 

$ java HelloWorld
或者
c:/>java HelloWorld

这样肯定会出错, 如果你的 CLASSPATH 没有改动的话. 我想大家应该知道为什么错了
吧, 那么怎么改呢? 前面说过, 用户类路径就是一些包含你所需要的类的目录, .jar 档案
包, .zip 包. 现在没有生成包, 所以只好把 HelloWorld.class 所在的目录加到 CLASSPAT
H
了, 根据前面的做法, 再运行一次, 看看, 呵呵, 成功了, 换个路径, 又成功了!! 不仅仅

以直接运行其中的类, 当你要 import 其中的某些类时, 同样处理.
不知道你想到没有, 随着你的系统的不断的扩充, (当然了, 都是一些需要 java 的东
西)
如果都加到这个环境变量里, 那这个变量会越来越臃肿, 虽然环境变量空间可以开很大, 总
觉得有些不舒服. 看看下面一个方法.

3, 在命令行参数中指明 classpath.

还是和上面相同的目标, 在任何目录下执行 HelloWorld, 用这个方法怎么实现呢?

[/]$ java -cp /HelloWorld HelloWorld
或者


c:/>java -cp c:/HelloWorld HelloWorld

就可以了. 这是这种方法的最简单的应用了. 当你使用了另外的包的时候, 还可以采用

种方法. 例如:

$ javac -classpath aPath/aPackage.jar:. myJava.java
$ java -cp aPath/aPackage.jar:. myJava
或者
c:/> javac -classpath aPath/aPackage.jar;. myJava.java
c:/> java -cp aPath/aPackage.jar;. myJava

这种方法也有一个不方便的的地方就是当第三方包所在的路径较长或者需要两个以上包

时候, 每次编译运行都要写很长, 非常不方便, 这时候可以写脚本来解决. 比如一个例子:

compile (文件, 权限改为可执行, 当前目录)

$ cat compile
---------------------------
#!/bin/bash

 

javac -classpath aPath/aPackage.jar:anotherPath/anotherPackage.jar:. myJav
a.java
---------------------------

run (文件, 权限改为可执行, 当前目录)

$cat run
---------------------------
#!/bin/bash

java -cp aPath/aPackage.jar:anotherPath/anotherPackage.jar:. myJava
---------------------------

或者:

compile.bat

c:/HelloWorld> type compile.bat
-------------------------
javac -classpath aPath/aPackage.jar:anotherPath/anotherPackage.jar:. myJav
a.java
-------------------------

 

run.bat

c:/HelloWorld> type run.bat
------------------------
java -cp aPath/aPackage.jar:anotherPath/anotherPackage.jar:. myJava
------------------------
就可以了. 试试看.
前面提到了扩展类, 扩展类是什么呢? java 的扩展类就是应用程序开发者用来
扩展核心平台功能的 java 类的包(或者是 native code). 虚拟机能像使用系统类一
样使用这些扩展类. 有人建议可以把包放入扩展目录里, 这样, CLASSPATH 也不用设了,
也不用指定了, 岂不是很方便? 确实可以正确运行, 但是个人认为这样不好, 不能什么
东西都往里搁, 一些标准的扩展包可以, 比如, JavaServlet, Java3D 等等. 可以提个
建议, 加一个环境变量, 比如叫 JARPATH, 指定一个目录, 专门存放用户的 jar zip
等包, 这个要等 SUN 公司来做了.


windows98 下, 我原来安装的时候, 一直装不上, 总是死机, 好不容易装上了, 缺
省的是不能运行正确的, 然后把 tool.jar 放入 CLASSPATH 后工作正常. 现在作测试,
去掉仍然是正确的. 经过多次测试, 发现如果原来曾装过 jdk 的都很好, 没有装过的
装的时候会死机, 多装几次就可以了. 如果你发现正确安装后, 不能正常工作, 就把
tools.jar 加入 CLASSPATH, 试一下.

 


二, 包 (package)

Java 中的 "包" 是一个比较重要的概念, package 是这样定义的:

Definition: A package is a collection of related classes and interfaces
that provides access protection and namespace management.

也就是: 一个包就是一些提供访问保护和命名空间管理的相关类与接口的集合.
使用包的目的就是使类容易查找使用, 防止命名冲突, 以及控制访问.
这里我们不讨论关于包的过多的东西, 只讨论和编译, 运行, 类路径相关的东西.
至于包的其他内容, 请自己查阅相关文档.

简单一点来说, 包就是一个目录, 下面的子包就是子目录, 这个包里的类就是
这个目录下的文件. 我们用一个例子来说明.
首先建目录结构如下: PackageTest/source/, 以后根目录指的是 PackageTest
目录, 我们的源程序放在 source 目录下. 源程序如下:

PackageTest.java

package pktest;

 

import pktest.subpk.*;

public class PackageTest
{
private String value;

public PackageTest(String s)
{
value = s;
}

public void printvalue()
{
System.out.println("value of PackageTest is " + value);
}

public static void main(String[] args)
{
PackageTest test = new PackageTest("This is a Test Package");
test.printvalue();
PackageSecond second = new PackageSecond("I am in PackageTest");


second.printvalue();
PackageSub sub = new PackageSub("I am in PackageTest");
sub.printvalue();
System.exit(0);
}
}

PackageSecond.java

package pktest;

public class PackageSecond
{
private String value;

public PackageSecond(String s)
{
value = s;
}

public void printvalue()
{


System.out.println("value of PackageSecond is " + value);
}
}

PackageSub.java

package pktest.subpk;

import pktest.*;

public class PackageSub
{
private String value;

public PackageSub(String s)
{
value = s;
}

public void printvalue()
{
PackageSecond second = new PackageSecond("I am in subpackage.");


second.printvalue();
System.out.println("value of PackageSub is " + value);
}

}

Main.java

import pktest.*;
import pktest.subpk.*;

public class Main()
{
public static void main()
{
PackageSecond second = new PackageSecond("I am in Main");
second.printvalue();
PackageSub sub = new PackageSub("I am in Main");
sub.printvalue();
System.exit(0);
}
}

 

其中, Main.java 是包之外的一个程序, 用来测试包外的程序访问包内的类,
PackageTest.java 属于 pktest 这个包, 也是主程序. PackageSecond.java 也
属于 pktest, PackageSub 属于 pktest 下的 subpk 包, 也就是 pktest.subpk.
详细使用情况, 请参看源程序.
好了, 先把源程序都放在 source 目录下, 使 source 成为当前目录, 然后编
译一下, 呵呵, 出错了,

Main.java:1: Package pktest not found in import.
import pktest.*;

这里涉及到类路径中包是怎么查找的, 前面我们做了一点假设: "只要包含了
这个类就算找到了这个类", 现在就有问题了. 其实 jdk 的 工具 javac java
javadoc 都需要查找类, 看见目录, 就认为是包的名字, 对于 import 语句来说,
一个包对应一个目录. 这个例子中, import pktest.*, 我们知道类路径可以包
含一个目录, 那么就以那个目录为根, 比如有个目录 /myclass, 那么就会在查找
/myclass/pktest 目录及其下的类. 所有的都找遍, 如果没有就会报错. 由于现在
的类路径只有当前目录, 而当前目录下没有 pktest 目录, 所以就会出错. 类路径
还可以包含 .jar .zip 文件, 这些就是可以带目录的压缩包, 可以把 .jar .zip
文件看做一个虚拟的目录, 然后就和目录一样对待了.
好了, 应该知道怎么做了吧, 修改后的目录结构如下:

 

PackageTest
|
|__source Main.java
|
|__pktest PackageTest.java PackageSecond.java
|
|__subpk PackageSub.java

然后重新编译, 运行, 哈哈, 通过了. 我们再来运行一下 PackageTest.

[source]$ java pktest/PackageTest

怎么又出错了?

Exception in thread "main" java.lang.NoClassDefFoundError: pktest/PackageTest

是这样的, java 所要运行的是一个类的名字, 它可不管你的类在什么地方, 就象
我们前面所讨论的一样来查找这个类, 所以它把 pktest/PackageTest 看成是一个类的
名字了, 当然会出错了, 应该这么做,

[source]$ java pktest.PackageTest

 

大家应该明白道理吧, 我就不多说了. 注意 javac 不一样, 是可以指明源文件路径
的, javac 只编译, 不运行, 查找类也只有在源文件中碰到 import 时才会做, 与源文件
所在的包没有关系.
似乎还又些不好的地方, 怎么生成的 .class 文件这么分散呀, 看着真别扭. 别急,
javac 有一个 -d 命令行参数, 可以指定一个目录, 把生成的 .class 文件按照包给你
好好地搁在这个目录里面.

[source]$ mkdir classes
[source]$ javac -d classes pktest/PackageTest.java
[source]$ javac -d classes Main.java

那么运行怎么运行呢?

[source]$ cd classes
[classes]$ java pktest.PackageTest
[classes]$ java Main

就可以了. 其实 jdk 的这一套工具小巧简单, 功能强大, 不会用或者用错其
实不关工具的事, 关键是明白工具背后的一些原理和必要的知识. 集成环境是很好,
但是它屏蔽了很多底层的知识, 不出错还好, 一旦出错, 如果没有这些必要的知识
就很难办, 只好上 bbs 问, 别人只告诉了你解决的具体方法, 下一次遇到稍微变化
一点的问题又不懂了. 所以不要拘泥于工具, java 的这一套工具组合起来使用, 中


小型工程(五六十个类), 还是应付得下来的.


三, jar 文件

以下把 .jar .zip 都看做是 .jar 文件.


1, 从前面我们可以看出来 jar 文件在 java 中非常重要, 极大地方便了用户的
使用. 我们也可以做自己的 .jar 包.
还是使用前面那个例子, Main.java 是包之外的东西, 用了 pktest 包中的类,
我们现在就是要把 pktest 做成一个 .jar 包, 很简单, 刚才我们已经把 pktest
中的 .class 都集中起来了,

[classes]$ jar -cvf mypackage.jar pktest

就会生成 mypackage.jar 文件, 测试一下, 刚才我们生成的 Main.class 就在
classes 目录下, 所以, 从前面可以知道:

[classes]$ java -cp mypackage.jar:. Main

就可以运行了.

 

2, 如果你看过 jdk 所带的例子, 你就会知道, .jar 还可以直接运行,

[/demo]$ java -jar aJar.jar

那好, 就那我们的试一试,

[classes]$ java -jar mypackage.jar
Failed to load Main-Class manifest attribute from
mypackage.jar

看来我们的 jar 和它的 jar 还不一样, 有什么不一样呢? 拿它一个例子出来,
重新编译, 生成 .jar 文件, 比较后发现, 是 .jar 压缩包中 META-INF/MANIFEST.MF
文件不一样, 多了一行, Main-Class: xxxxx, 再看看出错信息, 原来是没有指定
Main-Class, 看看 jar 命令, 发现有一个参数 -m,

-m include manifest information from specified manifest file

和出错信息有点关系, 看来它要读一个配制文件. 只好照猫画虎写一个了.

[classes]$ cat myManifest
Manifest-Version: 1.0


Main-Class: pktest.PackageTest
Created-By: 1.2.2 (Sun Microsystems Inc.)

[classes]$ jar cvfm mypackage.jar myManifest pktest
added manifest
adding: pktest/(in = 0) (out= 0)(stored 0%)
adding: pktest/PackageSecond.class(in = 659) (out= 395)(deflated 40%)
adding: pktest/subpk/(in = 0) (out= 0)(stored 0%)
adding: pktest/subpk/PackageSub.class(in = 744) (out= 454)(deflated 38%)
adding: pktest/PackageTest.class(in = 1041) (out= 602)(deflated 42%)

[classes]$ java -jar mypackage.jar
value of PackageTest is This is a Test Package
value of PackageSecond is I am in PackageTest
value of PackageSecond is I am in subpackage.
value of PackageSub is I am in PackageTest

好了, 成功了, 这样就做好了一个可以直接执行的 .jar 文件. 大家可以自己试一试
做一个以 Main 为主程序的可执行的 jar.


小结:

 

这篇文章中, 我们讨论了 java 中的 class path, package, jar 等基本但比较
重要的东西, 主要是 class path. 并不是简单的一份 CLASSPATH 的完全功略, 而是
试图让读者明白其原理, 自己思考, 自己动手. 其实大多数东西都在 sun 的 java doc
中都有, 我只不过结合例子稍微谈了一下, 希望能有所帮助. 由于条件所限, 只测试了
jdk1.2.2 在 98 及 linux 的情况, 其他版本的 jdk 和平台请大家自己测试, 错误在
所难免, 还请指正.

下面是一些需要注意的问题:

1, 如果类路径中需要用到 .jar 文件, 必须把 jar 文件的文件名放入类路径, 而不是
其所在的目录.
2, 在任何时候, 类名必须带有完全的包名,
3, "." 当前目录最好在你的类路径中.

下面是一些常见的编译和运行的模式.

4. To compile HelloWorld.java app in the default package in C:/MyDir, use
CD /MyDir
C:/jdk1.3/bin/Javac.exe -classpath . HelloWorld.java
5. To run a HelloWorld.class app, in the default package in C:/MyDir, use
CD /MyDir


C:/jdk1.3/bin/Java.exe -classpath . HelloWorld
6. To run a HelloWorld.class app, in the default package in a jar in C:/MyDir, u
se
CD /MyDir
C:/jdk1.3/bin/Java.exe -classpath HelloWorld.jar HelloWorld
7. To compile a HelloWorld.java app in C:/MyPackage, in package MyPackage, use
CD /
C:/jdk1.3/bin/Javac.exe -classpath . MyPackage/HelloWorld.java
8. To run a HelloWorld.class app in C:/MyPackage, in package MyPackage, use
CD /
C:/jdk1.3/bin/Java.exe -classpath . MyPackage.HelloWorld
9. To run a HelloWorld.class app in C:/MyPackage, in a jar in package MyPackage,
use
CD /MyDir
C:/jdk1.3/bin/Java.exe -classpath HelloWorld.jar MyPackage.HelloWorl
d

(注: default package 指的是在程序中不指定任何包).

最后一个小小的建议, 把 sun 的 jdk tools document.tion 好好地看一看,
把 jdk 的那些工具 java javac javadoc jar javap jdb......好好用一用, 会
有好处的. The Simplest Is The Best.


2.如何一次把一个目录下的所有.jar加入到classpath?

tomcat的做法
//tomcat.bat
...
set _LIBJARS=
for %%i in (%TOMCAT_HOME%/lib/*.jar) do call
%TOMCAT_HOME%/bin/cpappend.bat %%i
...

//cpappend.bat
set _LIBJARS=%_LIBJARS%;%1

3.classspath 的默认值是什么?

在 JDK 1.2 中,有三个搜索路径用于查找类:
1) java 搜索类的第一个位置是自举类路径。
可通过调用 System.getProperty("sun.boot.class.path") 检查该路径的值。
注意,其中前缀“sun.”显示至少到现在为止,该属性是特定于 Sun 公司的实现。
2) java 查找类的第二个位置是扩展目录。
可通过调用 System.getProperty("java.ext.dirs") 检查目录列表。
3) java 查找类的第三个位置是应用程序类路径。
可通过调用 System.getProperty("java.class.path") 检查该路径的值。

you can get:

1) java_base/jre/lib/rt.jar
java_base/jre/lib/i18n.jar
java_base/jre/classes
2) java_base/jre/lib/ext


4.怎样找到程序运行需要的类?

编译的时候用选项 javac -verbose ********
可以看你的程序都用到了类库中的哪些类 .

java -verbose
javac -verbose
是jdk很好的调试功能


5. Linux下Path和ClassPath是怎么设的?
修改文件 /etc/profile
CLASSPATH = pathAathBathC
export CLASSPATH

JAVA_HOME类似
和windows下设置的主要区别应该在分隔符上


6.如何修改path和classpath?

方法一:用cmd进入控制台,输入set命令,你会看到你机子上的所有环境变量的名称和值!
然后你再输入set classpath=你要设的目录。就可以了!!!
方法二:
2000,控制面板-》系统-》高级-》环境变量-》系统变量,如果没有CLASSPATH变量就自己新建
一个
xp:
开始-> 我的电脑->属性->高级->环境变量->新建
JAVA_HOME
CLASSPATH
PATH

java的帮助和api文档
1.什么是java的api参考?
api是html格式的从sun的网站上可以找到一个包
包括api的参考和user guide,本站有做成.chm格式的便于查找。
api参考是用jdk的工具javadoc 生成的是开发者必备的文档。
2.哪里有JAVA基本类库的源代码?
jdk的安装目录下有源码src.zip

开发环境
1.jre下的lib和jdk下的lib到底有什么区别?
jre是JDK的一个子集。提供一个运行环境。JDK的lib目录是给JDK用的,例如JDK下有一些工具,可能要用该目录中的文件。例如,编译器等。JRE的lib目录是为JVM,运行时候用的。包括所有的标准类苦,和扩展类

2.我的jbuilder光标对不齐?

大家常常说JBuilder在中文系统中存在光标错位的问题,都认为这是JBuilder
的一个Bug,其实这实在是冤枉JBuilder了!大家讨论出来的解决方法无外乎
两种:
1、将编辑器的字体改为宋体,用这种方法带来的问题是,在宋体下的英文字
体实在难看,阅读起来不太顺眼;
2、就是将编辑器字体的粗体属性去掉,这样也影响代码的可读性。
其实,造成JBuilder光标错位的问题并不是Borland的错误,而是Java的宗
师——Sun的罪过!大家一定知道i18n吧?在不同的区域设置中,JDK自动调
用与之相对应的properties文件,而在JDK中,Sun所推出的与中文系统相对
应的properties文件存在问题,在它之中没有区分英文字体的正


常、粗体和斜体,从而导致了以上所说的问题,解决的方法很简单,只要将这
个properties文件修改正确就可以了,修改方法如下:
在jre/lib目录中找到font.properties.zh文件,编辑这个文件并修改成如下内容:
# @(#)font.properties.zh1.16 00/10/06
#
# AWT Font default Properties for Chinese Windows
#


dialog.plain.0=Arial,ANSI_CHARSET
dialog.plain.1=/u5b8b/u4f53,??????_CHARSET
dialog.plain.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
dialog.plain.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

dialog.bold.0=Arial Bold,ANSI_CHARSET
dialog.bold.1=/u5b8b/u4f53,??????_CHARSET
dialog.bold.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
dialog.bold.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

dialog.italic.0=Arial Italic,ANSI_CHARSET
dialog.italic.1=/u5b8b/u4f53,??????_CHARSET
dialog.italic.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED


dialog.italic.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

dialog.bolditalic.0=Arial Bold Italic,ANSI_CHARSET
dialog.bolditalic.1=/u5b8b/u4f53,??????_CHARSET
dialog.bolditalic.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
dialog.bolditalic.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

dialoginput.plain.0=Courier New,ANSI_CHARSET
dialoginput.plain.1=/u5b8b/u4f53,??????_CHARSET
dialoginput.plain.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
dialoginput.plain.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

dialoginput.bold.0=Courier New Bold,ANSI_CHARSET
dialoginput.bold.1=/u5b8b/u4f53,??????_CHARSET
dialoginput.bold.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
dialoginput.bold.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

dialoginput.italic.0=Courier New Italic,ANSI_CHARSET
dialoginput.italic.1=/u5b8b/u4f53,??????_CHARSET
dialoginput.italic.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
dialoginput.italic.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

 

dialoginput.bolditalic.0=Courier New Bold Italic,ANSI_CHARSET
dialoginput.bolditalic.1=/u5b8b/u4f53,??????_CHARSET
dialoginput.bolditalic.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
dialoginput.bolditalic.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

serif.plain.0=Times New Roman,ANSI_CHARSET
serif.plain.1=/u5b8b/u4f53,??????_CHARSET
serif.plain.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
serif.plain.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED


serif.bold.0=Times New Roman Bold,ANSI_CHARSET
serif.bold.1=/u5b8b/u4f53,??????_CHARSET
serif.bold.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
serif.bold.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

serif.italic.0=Times New Roman Italic,ANSI_CHARSET
serif.italic.1=/u5b8b/u4f53,??????_CHARSET
serif.italic.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
serif.italic.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

serif.bolditalic.0=Times New Roman Bold Italic,ANSI_CHARSET


serif.bolditalic.1=/u5b8b/u4f53,??????_CHARSET
serif.bolditalic.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
serif.bolditalic.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

sansserif.plain.0=Arial,ANSI_CHARSET
sansserif.plain.1=/u5b8b/u4f53,??????_CHARSET
sansserif.plain.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
sansserif.plain.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

sansserif.bold.0=Arial Bold,ANSI_CHARSET
sansserif.bold.1=/u5b8b/u4f53,??????_CHARSET
sansserif.bold.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
sansserif.bold.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

sansserif.italic.0=Arial Italic,ANSI_CHARSET
sansserif.italic.1=/u5b8b/u4f53,??????_CHARSET
sansserif.italic.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
sansserif.italic.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

sansserif.bolditalic.0=Arial Bold Italic,ANSI_CHARSET
sansserif.bolditalic.1=/u5b8b/u4f53,??????_CHARSET
sansserif.bolditalic.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED


sansserif.bolditalic.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

monospaced.plain.0=Courier New,??????_CHARSET
monospaced.plain.1=/u5b8b/u4f53,??????_CHARSET
monospaced.plain.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
monospaced.plain.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

monospaced.bold.0=Courier New Bold,??????_CHARSET
monospaced.bold.1=/u5b8b/u4f53,??????_CHARSET
monospaced.bold.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
monospaced.bold.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

monospaced.italic.0=Courier New Italic,??????_CHARSET
monospaced.italic.1=/u5b8b/u4f53,??????_CHARSET
monospaced.italic.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
monospaced.italic.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

monospaced.bolditalic.0=Courier New Bold Italic,??????_CHARSET
monospaced.bolditalic.1=/u5b8b/u4f53,??????_CHARSET
monospaced.bolditalic.2=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
monospaced.bolditalic.3=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

 

# name aliases
#
#alias.timesroman=serif
#alias.helvetica=sansserif
#alias.courier=monospaced

# for backward compatibility
#timesroman.0=Times New Roman,ANSI_CHARSET
#helvetica.0=Arial,ANSI_CHARSET
#courier.0=Courier New,ANSI_CHARSET
zapfdingbats.0=WingDings,SYMBOL_CHARSET

# font filenames for reduced initialization time
#
filename./u5b8b/u4f53=SIMSUN.TTF

filename.Arial=ARIAL.TTF
filename.Arial_Bold=ARIALBD.TTF
filename.Arial_Italic=ARIALI.TTF
filename.Arial_Bold_Italic=ARIALBI.TTF

filename.Courier_New=COUR.TTF

 

filename.Courier_New_Bold=COURBD.TTF
filename.Courier_New_Italic=COURI.TTF
filename.Courier_New_Bold_Italic=COURBI.TTF

filename.Times_New_Roman=TIMES.TTF
filename.Times_New_Roman_Bold=TIMESBD.TTF
filename.Times_New_Roman_Italic=TIMESI.TTF
filename.Times_New_Roman_Bold_Italic=TIMESBI.TTF

filename.WingDings=WINGDING.TTF
filename.Symbol=SYMBOL.TTF

# Default font definition
#
default.char=2751

# Static FontCharset info.
#
#fontcharset.dialog.0=sun.io.CharToByteCp1252
fontcharset.dialog.1=sun.io.CharToByteGBK
fontcharset.dialog.2=sun.awt.windows.CharToByteWingDings


fontcharset.dialog.3=sun.awt.CharToByteSymbol

#fontcharset.dialoginput.0=sun.io.CharToByteCp1252
fontcharset.dialoginput.1=sun.io.CharToByteGBK
fontcharset.dialoginput.2=sun.awt.windows.CharToByteWingDings
fontcharset.dialoginput.3=sun.awt.CharToByteSymbol

#fontcharset.serif.0=sun.io.CharToByteCp1252
fontcharset.serif.1=sun.io.CharToByteGBK
fontcharset.serif.2=sun.awt.windows.CharToByteWingDings
fontcharset.serif.3=sun.awt.CharToByteSymbol

#fontcharset.sansserif.0=sun.io.CharToByteCp1252
fontcharset.sansserif.1=sun.io.CharToByteGBK
fontcharset.sansserif.2=sun.awt.windows.CharToByteWingDings
fontcharset.sansserif.3=sun.awt.CharToByteSymbol

#fontcharset.monospaced.0=sun.io.CharToByteCp1252
fontcharset.monospaced.1=sun.io.CharToByteGBK
fontcharset.monospaced.2=sun.awt.windows.CharToByteWingDings
fontcharset.monospaced.3=sun.awt.CharToByteSymbol

 

# Exclusion Range info.
#
exclusion.dialog.plain.0=00a0-f8ff
exclusion.dialog.italic.0=00a0-f8ff
exclusion.dialog.bold.0=00a0-f8ff
exclusion.dialog.bolditalic.0=00a0-f8ff

exclusion.dialoginput.plain.0=00a0-f8ff
exclusion.dialoginput.italic.0=00a0-f8ff
exclusion.dialoginput.bold.0=00a0-f8ff
exclusion.dialoginput.bolditalic.0=00a0-f8ff

exclusion.serif.plain.0=00a0-f8ff
exclusion.serif.italic.0=00a0-f8ff
exclusion.serif.bold.0=00a0-f8ff
exclusion.serif.bolditalic.0=00a0-f8ff

exclusion.sansserif.plain.0=00a0-f8ff
exclusion.sansserif.italic.0=00a0-f8ff
exclusion.sansserif.bold.0=00a0-f8ff
exclusion.sansserif.bolditalic.0=00a0-f8ff

 

exclusion.monospaced.italic.0=00a0-f8ff
exclusion.monospaced.bold.0=00a0-f8ff
exclusion.monospaced.bolditalic.0=00a0-f8ff

# charset for text input
#
inputtextcharset=??????_CHARSET

保存后,一切问题就解决了!
这种方法也适用于任何相同的问题。

[题外话]这种错误SUN真的应该好好反省一下了,希望以后他们做的东西能够
测试更好一些,不然……

3.JDK版本冲突怎么办?

要决定windows使用哪一个JDK(win2000),改注册表:
HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Development Kit/CurrentVersion
的值,要决定JBuilder使用哪个JDK在project properties中可以设置。
4.editplus能够编译java嘛? 如何设置?
先要将JAVA的运行环境安装并且调试好。
首先,从菜单“工具(Tools)”->“配置用户工具...”进入用户工具设置。
在类别里展开“工具”树形菜单->“用户工具”,选择“组和工具项目”中的“Group 1”,点击面板右边的“组名称...”按钮,将文本“Group1”修改成“编译JAVA程序”。
然后选择修改的组“编译JAVA程序”,点击“添加新工具”按钮,选择程序,建立“新建程序”,选中它。
然后就是最重要的步骤(修改属性):
1.1 添加编译功能
“菜单文字”里的内容修改为“JAVAC”;
“命令”选择安装JDK后的BIN目录中的编译程序JAVAC.EXE,如果JDK 安装路径为“c:/jdk”,那么此路径为“c:/jdk/bin/javac.exe”;
“参数”选择“文件名称”,即显示为“$(FileName)”;
“初始目录”选择“文件目录”,显示为“$(FileDir)”;
选择“捕获输出”复选框。
1.2 添加执行功能
“菜单文字”里的内容修改为“JAVA”;
“命令”选择安装JDK后的BIN目录中的编译程序JAVA.EXE,路径为“c:/jdk/bin/java.exe”;
“参数”选择“文件名(不含扩展名)”,即显示为“$(FileNameNoExt)”;
“初始目录”选择“文件目录”,显示为“$(FileDir)”;
选择“捕获输出”复选框。
这样就完成了基本的配置工作


upcasting是什么意思
upcasting就是上溯.也就是说把一个子类当作它的父类看待,比如:对方法void do(Object obj){...},你可以把任何对象作为参数来调用.


编译运行
1.怎么把多个.java源文件编译成一个.class?
java -d . a.java b.java
2. depreciated API 是什么意思?
java发展太快,所以你应该尽可能用最新的api,但是老的api还是兼容的,所以回waning 你deprecated api
3.怎么样编译一个目录下的所有java文件?
ant或者jbuilder,或者自己写脚本.
4.如何让执行程序时不会出现dos窗口?
javaw
5.如何运行jar文件?
java -jar ***.jar
6.如何去掉JAVA的内存限制
加 -Xmx参数来设置maximum Java heap size,如: java -Xms10M MyClass


数据类型与转换
1.int、char、double与byte如何相互转换?
int、char、double与byte相互转换的程序
//整数到字节数组的转换
public static byte[] intToByte(int number) {
int temp = number;
byte[] b=new byte[4];
for (int i=b.length-1;i>-1;i--){
b[i] = new Integer(temp&0xff).bytevalue(); //将最高位保存在最低位
temp = temp >> 8; //向右移8位
}
return b;
}

//字节数组到整数的转换
public static int byteToInt(byte[] b) {
int s = 0;
for (int i = 0; i < 3; i++) {
if (b[i] >= 0)
s = s + b[i];
else


s = s + 256 + b[i];
s = s * 256;
}
if (b[3] >= 0) //最后一个之所以不乘,是因为可能会溢出
s = s + b[3];
else
s = s + 256 + b[3];
return s;
}

//字符到字节转换
public static byte[] charToByte(char ch){
int temp=(int)ch;
byte[] b=new byte[2];
for (int i=b.length-1;i>-1;i--){
b[i] = new Integer(temp&0xff).bytevalue(); //将最高位保存在最低位
temp = temp >> 8; //向右移8位
}
return b;
}

//字节到字符转换


public static char byteToChar(byte[] b){
int s=0;
if(b[0]>0)
s+=b[0];
else
s+=256+b[0];
s*=256;
if(b[1]>0)
s+=b[1];
else
s+=256+b[1];
char ch=(char)s;
return ch;
}

//浮点到字节转换
public static byte[] doubleToByte(double d){
byte[] b=new byte[8];
long l=Double.doubleToLongBits(d);
for(int i=0;i<b.length;i++){
b[i]=new Long(l).bytevalue();
l=l>>8;


}
return b;
}

//字节到浮点转换
public static double byteToDouble(byte[] b){
long l;

l=b[0];
l&=0xff;
l|=((long)b[1]<<8);
l&=0xffff;
l|=((long)b[2]<<16);
l&=0xffffff;
l|=((long)b[3]<<24);
l&=0xffffffffl;
l|=((long)b[4]<<32);
l&=0xffffffffffl;

l|=((long)b[5]<<40);
l&=0xffffffffffffl;
l|=((long)b[6]<<48);


l|=((long)b[7]<<56);
return Double.longBitsToDouble(l);
}


2.int与byte array之间的转换程序?

在通讯中经常需要将数值转换成字节流,或者是将字节流转换成数值。下面
提供的程序可以进行int和byte array之间的转换。

在以后一段时间内还将编制浮点数和双精度浮点数与字节流之间的转换程序
并与大家分享。欢迎测试和提出意见。

/**
*
* IntConverter
*
* This class provides methods to convert int into byte array and
* byte array back into int.
*
*/


public class IntConverter
{


/**
*
* Method converting int into byte array.
*
* @param number The int value to be converted.
*
*/

public static byte[] toByteArray(int number)
{
int temp = number;
byte[] b=new byte[4];
for (int i = b.length - 1; i > -1; i--)
{
b[i] = new Integer(temp & 0xff).bytevalue();
temp = temp >> 8;
}
return b;
}

/**
*


* Method converting byte array into int.
*
* @param The byte array to be converted.
*
*/

public static int toInteger(byte[] b)
{
int s = 0;

for (int i = 0; i < 3; i++)
{
if (b[i] > 0)
s = s + b[i];
else
s = s + 256 + b[i];
s = s * 256;
}

if (b[3] > 0)
s = s + b[3];
else


s = s + 256 + b[3];

return s;
}

// Testing program.

public static void main(String[] args)
{
IntConverter abc = new IntConverter();
int s = -1121115678;
byte[] b = abc.toByteArray(s);
for (int i = 0; i <= 3; i++)
System.out.println(b[i]);

s = abc.toInteger(b);
System.out.println(s);
}
}


3.string和int之间的转换?
a1=Integer.parseInt(s1);
s1=Integer.toString(a1);
4.java如何获得随机整数?
首先利用random()获得一个随机浮点数,然后乘以你希望得到的整数
的最大值,最后对得到的结果取整。
5.怎么把String类型转换成16进制的整数?
public static void main(String args[]){
String x = "0x300C8";
int y = Integer.decode(x).intvalue();
System.out.println(y);
}
6.int和java.lang.Integer有和区别?
int是数据类型,Integer是类Integer的功能更强,可以将整数转换为浮点数运算,在java这种强类型语言中是很有用的。可以利用Integer的构造函数Integer(int)来对一个整数建立对象。类似的类还有Float,Short,Long等等

 

数据结构
1.如何实现二维向量?
Vector vector1=new Vector();
Vector vector2=new Vector();
...
..
HashTable numbers=new HashTable();
numbers.put("vector1",vector1);
numbers.put("vector2",vector2);
2. JAVA中怎么得到现在的系统时间?
比如,当前date,Date today=new Date(System.currentTimeMillis());
3.如何将java.util.Date转化为java.sql.Date?
转化:

java.sql.Date sd;
java.util.Date ud;
//initialize the ud such as ud = new java.util.Date();

sd = new java.sql.Date(ud.getTime());

如果要插入到数据库并且相应的字段为Date类型
那么可以用PreparedStatement.setDate(int ,java.sql.Date)方法
其中的java.sql.Date可以用上面的方法得到

也可以用数据库提供TO_DATE函数
比如 现有 ud
TO_DATE(new SimpleDateFormat().format(ud,"yyyy-MM-dd HH:mm:ss"),
"YYYY-MM-DD HH24:MI:SS")
注意java中表示格式和数据库提供的格式的不同

系统相关
1.在JAVA中如何启动一个程序?
String strCommand;
String cmd = "cmd";
if (! System.getProperty("os.name").equals("Windows NT")) cmd = "command";
cmd = cmd + " /c " + strCommand;
try {
Runtime.getRuntime().exec(cmd);
}
catch (IOException ex) {
}

strCommand 为命令串,DOS 底下怎么用,这儿就可以怎么用
2.如何得到应用程序的路径
Properties System.getProperties()里面有
3.如何得到当前系统时间?
1.SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd");
String time=formatter.format(new Date());
2.Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
month=..类推


输入输出
1.是否可以用纯JAVA 编写程序来访问串口?
Sun提供了一个叫javax.comm的package,专门用来对serial port进行操作.
2.writeutf和write的区别
writeUTF 是将字符串以UTF8编码方式输出 数据可以通过readUTF读回来
writeChars(String) 则是将字符串的每个字符的高8位和低8位分别转成字节
就是说一个字符变成两个自己的方式
writeBytes 是一种只能处理单字节字符的输出方式 已经不推荐使用

3.如何利用FileWriter在文本中换行?
/r/n

网络相关
1.如何让我的程序通过proxy访问外部网络?
System.setProperty("java.proxyHost","your proxy here");

本地相关
1.如何调用本地的dll?
jni
2.如何用java编写扫描仪程序?

例子:
javatwain may be a powerful solution,you can go to www.gnome.sk to download the newest package.
JavaTwain version 5.1 is a part of the Morena 6.0 Framework ?????

below is an simple example:
/*
* $Id: ExampleShow.java,v 1.5 2002/07/15 13:48:55 mmotovsk Exp $
*
* Copyright (c) 1999-2002 Gnome spol. s r.o. All Rights Reserved.
*
* This software is the confidential and proprietary information of
* Gnome spol. s r.o. You shall not disclose such Confidential
* Information and shall use it only in accordance with the terms
* of the license agreement you entered into with Gnome.
*/

// JavaTwain package version 5.1

/**
ExampleShow demonstrates how to scan an image using defaults
from the Twain source. <BR>
*/

import java.awt.*;
import java.awt.event.*;
import SK.gnome.twain.*;

public class ExampleShow extends Frame
{ Image image;
public void paint(Graphics g)
{ if (null!=image)
g.drawImage(image, 0, 0, this);
}

WindowListener windowAdapter=new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);
}
};

public ExampleShow()
{ try
{ addWindowListener(windowAdapter);
setTitle("ExampleShow Frame Application");
// Open TWAIN select source dialog box
// and initialize the source selected by the user.
TwainSource source=TwainManager.selectSource(null);
image=Toolkit.getDefaultToolkit().createImage(source);
// wait for the image to be completed
MediaTracker tracker=new MediaTracker(this);
tracker.addImage(image, 0);
// this is the moment the scanner user interface pops up
System.err.println("Start loading image ...");
try
{ tracker.waitForAll();
}
catch (InterruptedException e)
{ System.err.println("Image loading was interrupted!");
e.printStackTrace();
}
tracker.removeImage(image);
System.err.println("Image loaded ...");
setSize(image.getWidth(this), image.getHeight(this));
setVisible(true);
TwainManager.close();
}
catch (TwainException e)
{ e.printStackTrace();
}
}

public static void main(String[] args)
{ new ExampleShow();
}
}


 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值