??xml version="1.0" encoding="utf-8" standalone="yes"?> 1. 异常机制 2 异常的分c?BR>2.1 异常的分c?BR>2.1.1 异常的承结构:基类为ThrowableQError和Exceptionl承ThrowableQRuntimeException和IOException{承ExceptionQ具体的RuntimeExceptionl承RuntimeException?BR>2.1.2 Error和RuntimeException及其子类成ؓ未检查异常(uncheckedQ,其它异常成ؓ已检查异常(checkedQ?BR>2.2 每个cd的异常的特点 3 异常的用方?BR>3.1 声明Ҏ抛出异常 4 关于异常的其他问?BR>4.1 q度使用异常 讄jvm内存的方法,对于单独?classQ可以用下面的方法对Testq行时的jvm内存q行讄?BR>java -Xms64m -Xmx256m Test 默认的java虚拟机的大小比较,在对大数据进行处理时java׃报错Qjava.lang.OutOfMemoryError?/P>
讄jvm内存的方法,对于单独?classQ可以用下面的方法对Testq行时的jvm内存q行讄?BR>java -Xms64m -Xmx256m Test 在weblogic中,可以在startweblogic.cmd中对每个domain虚拟内存的大进行设|,默认的设|是在commEnv.cmd里面?/P> 目录 前言 Java 的语法与 C++ 及ؓ怼Q那么,你知?Java 的注释有几种吗?是两U?
// 注释一?BR> /* ...... */ 注释若干?/P>
不完全对Q除了以上两U之外,q有W三U,文档注释Q?/P>
/** ...... */ 注释若干行,q写?javadoc 文档 通常q种注释的多行写法如下: /** 暂停Q暂停!q第三种注释有什么用Qjavadoc 又是什么东西? 好,那就让我告诉你—? Java E序员都应该知道使用 JDK 开发,最好的帮助信息来?SUN 发布?Java 文档。它分包、分c详l的提供了各Ҏ、属性的帮助信息Q具有详l的cL信息、烦引信息等Qƈ提供了许多相关类之间的关p,如ѝ实现接口、引用等?/P>
Java 文档全是׃?html 文gl织h的,?SUM 的站点上可以下蝲它们的压~包。但是你肯定想不刎ͼq些文档我们可以自己生成。——就此打住,再吊一ơ胃口?/P>
安装?JDK 之后Q安装目录下有一?src.jar 文g或?src.zip 文gQ它们都是以 ZIP 格式压羃的,可以使用 WinZip 解压。解压之后,我们可以看到分目录攄全是 .java 文g。是了,q些是 Java q行cȝ源码了,非常完整Q连注释都写得一清二楚……不q,怎么看这些注释都有点似曾相识的感觉? q就不奇怪了Q我们的q底也快要揭开了。如果你仔细Ҏ一?.java 源文件中的文档注?(/** ... */) ?Java 文档的内容,你会发现它们是一L。Java 文档只是q在格式和排版上下了些功夫。再仔细一点,你会发现 .java 源文件中的注释还带有 HTML 标识Q如 <B>?lt;BR>?lt;Code> {,?Java 文档中,该出现这些标识的地方Q已l按标识的的定义q行了排版?/P>
l于真像大白了,原来 Java 文档是来自这些注释。难怪这些注释叫做文档注释呢Q不q,是什么工hq些注释变成文档的呢Q?/P>
是该请出 javadoc 的时候了。在 JDK ?bin 目录下你可以扑ֈ javadocQ如果是 Windows 下的 JDKQ它的文件名?javadoc.exe。?javdoc ~译 .java 源文件时Q它会读?.java 源文件中的文档注释,q按照一定的规则?Java 源程序一赯行编译,生成文档?/P>
介绍 javadoc 的编译命令之前,q是先了解一下文档注释的格式吧。不qؓ了能够编译下面提到的若干例子Q这里先介绍一?javadoc 命oQ?/P>
javadoc -d 文档存放目录 -author -version 源文件名.java q条命o~译一个名?“源文g?java”的 java 源文Ӟq将生成的文档存攑֜“文档存攄录”指定的目录下,生成的文档中 index.html 是文档的首c?author ?-version 两个选项可以省略?/P>
文档注释可以用于对类、属性、方法等q行说明。写文档注释旉了需要?/** .... */ 限定之外Q还需要注意注释内部的一些细节问题?/P>
生成的文档是 HTML 格式Q而这?HTML 格式的标识符q不?javadoc 加的Q而是我们在写注释的时候写上去的。比如,需要换行时Q不是敲入一个回车符Q而是写入 <br>Q如果要分段Q就应该在段前写?<p>?/P>
因此Q格式化文档Q就是在文档注释中添加相应的 HTML 标识?/P>
文档注释的正文ƈ不是直接复制到输出文?(文档?HTML 文g)Q而是d每一行后Q删掉前导的 * 号及 * 号以前的I格Q再输入到文档的。如 ~译输出后的 HTML 源码则是 前导?* 号允许连l用多个,其效果和使用一?* 号一P但多?* 号前不能有其它字W分隔,否则分隔W及后面?* 号都作为文档的内容? 号在q里是作为左边界使用Q如上例的第一行和W二行;如果没有前导?* P则边界从W一个有效字W开始,而不包括前面的空|如上例第三行?/P>
q有一炚w要说明,文档注释只说明紧接其后的cR属性或者方法。如下例Q?/P>
上例中的三处注释是分别对类、属性和Ҏ的文档注释。它们生成的文档分别是说明紧接其后的cR属性、方法的。“紧接”二字尤光要,如果忽略了这一点,很可能造成生成的文档错误。如 q个文档注释生成正的文档。但只需要改变其中两行的位置Q变成下例,׃出错Q?/P>
q个例子只把上例?import 语句和文档注释部分交换了位置Q结果却大不相同——生成的文档中根本就找不Cq注释的内容了。原因何在? ?FONT color=#008000>/** commnet for class */”是?class Test 的说明,把它攑֜“public class Test { ...... }”之前时Q其后紧接着 class TestQ符合规则,所以生成的文档正确。但是把它和“import java.lang.*;”调换了位置后,其后紧接的就是不 class Test 了,而是一?import 语句。由于文档注释只能说明类、属性和ҎQimport 语句不在此列Q所以这个文档注释就被当作错误说明省略掉了?/P>
Ҏ在文档中昄的效果,文档注释分ؓ三部分。先举例如下Q以便说明?/P>
W一部分是简q。文档中Q对于属性和Ҏ都是先有一个列表,然后才在后面一个一个的详细的说明。列表中属性名或者方法名后面那段说明是q。如下图中被U框框选的部分Q?/P>
q部分写在一D|档注释的最前面Q第一个点?(.) 之前 (包括点号)。换句话_是用第一个点号分隔文档注释,之前是简qͼ之后是第二部分和W三部分。如上例中的 ? show Ҏ的简q?”?/P>
有时Q即使正地以一个点号作为分隔,javadoc 仍然会出错,把点号后面的部分也做ZW一部分。ؓ了解册个问题,我们可以使用一?<p> 标志第二分部分开Z一D,如上例的? <p>show Ҏ的详l说明第一?....”。除此之外,我们也可以?<br> 来分隔?/P>
W二部分是详l说明部分。该部分对属性或者方法进行详l的说明Q在格式上没有什么特D的要求Q可以包含若q个点号。它在文档中的位|如下图所C: q部分文档在上例中相应的代码是: * show Ҏ的简q? 发现什么了Q对了,qC在其中。这一点要C了,不要画蛇添——在详细说明部分中再写一ơ简q哦Q?/P>
W三部分是特D说明部分。这部分包括版本说明、参数说明、返回D明等。它在文档中的位|: W三部分在上例中相应的代码是 * @param b true 表示昄Qfalse 表示隐藏 除了 @param ?@return 之外Q还有其它的一些特D标讎ͼ分别用于对类、属性和Ҏ的说明……不要推我,我马上就说?/P>
javadoc 标记是插入文档注释中的特D标讎ͼ它们用于标识代码中的Ҏ引用。javadoc 标记由“@”及其后所跟的标记cd和专用注释引用组成。记住了Q三个部分——@、标记类型、专用注释引用。不q我宁愿把它分成两部分:@ 和标记类型、专用注释引用。虽?@ ?标记cd之间有时可以用空格符分隔Q但是我宁愿始终它们紧挨着写,以减出错机会?/P>
javadoc 标记有如下一些: 下面详细说明各标记?/P>
@see 的句法有三种Q? @see cd cdQ可以根据需要只写出cd (?String) 或者写出类全名 (?java.lang.String)。那么什么时候只需要写出类名,什么时候需要写出类全名呢? 如果 java 源文件中?import 语句包含了的c,可以只写出类名,如果没有包含Q则需要写出类全名。java.lang 也已l默认被包含了。这?javac ~译 java 源文件时的规定一P所以可以简单的?javac ~译来判断,源程序中 javac 能找到的c,javadoc 也一定能扑ֈQjavac 找不到的c,javadoc 也找不到Q这需要用类全名了?/P>
Ҏ名或者属性名Q如果是属性名Q则只需要写出属性名卛_Q如果是Ҏ名,则需要写出方法名以及参数cdQ没有参数的ҎQ需要写ZҎ受如 有时也可以偷懒:假如上例中,没有 count q一属性,那么参考方?count() 可以简写成 @see count。不q,Z安全赯Q还是写?@see count() 比较好?/P>
@see 的第二个句法和第三个句法都是转向Ҏ或者属性的参考,它们有什么区别呢Q?/P>
W二个句法中没有指出cdQ则默认为当前类。所以它定义的参考,都{向本cM的属性或者方法。而第三个句法中指ZcdQ则q可以{向其它类的属性或者方法?/P>
关于 @see 标记Q我们D个例说明。由?@see 在对c说明、对属性说明、对Ҏ说明时用法都一P所以这里只以对c说明ؓ例?/P>
生成的文档的相关部分如下图: String ?StringBuffer 都是?java.lang 包中Q由于这个包是默认导入了的,所以这两个cd以直接写cdQ也可以写类全名。str、str() 为同名属性和ҎQ所以方法名需要用 () 区分。main 是带参数的方法,所以在 () 中指明了参数cd。toString() 虽然在本cM也有 (?Object l承?Q但我们是想参?Object cȝ toString() ҎQ所以用了 Object#toString()?/P>
奇怪的是,Z么其中只?str、str() ?main(String[]) 变成了链接呢Q那是因为编译时没有?java.lang 包或?Stirng、StringBuffer、Object 三个cȝ源文件一起加入编译,所以,生成的文档没有关于那三个cȝ信息Q也׃可以建立链接了。后面讲?javadoc ~译命o的时候还会详l说明?/P>
上例中如果去把类中的 str 属性去掉,那么生成的文档又会有什么变化呢Q你会发玎ͼ原来?str, str()Q而现在变成了 str(), str()Q因?str 属性已l没有了Q所?str 也表C方?str()?/P>
2. 使用 @author、@version 说明c?/P>
q两个标记分别用于指明类的作者和版本。缺省情况下 javadoc 其忽略Q但命o行开?-author ?-version 可以修改q个功能Q其包含的信息被输出。这两个标记的句法如下: @author 作者名 其中Q@author 可以多次使用Q以指明多个作者,生成的文档中每个作者之间用逗号 (,) 隔开。@version 也可以用多ơ,只有W一ơ有效,生成的文档中只会昄W一ơ?@version 指明的版本号。如下例 生成文档的相关部分如图: 从生成文档的囄中可以看出,两个 @author 语句都被~译Q在文档中生成了作者列表。而两?@version 语句中只有第一句被~译了,只生成了一个版本号?/P>
从图上看Q作者列表是以逗号分隔的,如果我想分行昄怎么办?另外Q如果我xCZ个以上的版本号又该怎么办? ——我们可以将上述两条 @author 语句合ؓ一句,把两?@version 语句也合Z句: @author Fancy<br>Bird l果如图Q?/P>
我们q样做即辑ֈ了目的,又没有破坏规则。@author 之后的作者名?@version 之后的版本号都可以是用户自己定义的Q?HTML 格式Q所以我们可以?<br> 标记其分行昄。同Ӟ在一?@version 中指明两个用 <br> 分隔的版本号Q也没有破坏只显C第一?@version 内容的规则?/P>
3. 使用 @param、@return ?@exception 说明Ҏ q三个标记都是只用于Ҏ的。@param 描述Ҏ的参敎ͼ@return 描述Ҏ的返回|@exception 描述Ҏ可能抛出的异常。它们的句法如下Q?/P>
@param 参数?参数说明 每一?@param 只能描述Ҏ的一个参敎ͼ所以,如果Ҏ需要多个参敎ͼ需要多ơ?@param 来描q?/P>
一个方法中只能用一?@returnQ如果文档说明中列了多个 @returnQ则 javadoc ~译时会发出警告Q且只有W一?@return 在生成的文档中有效?/P>
Ҏ可能抛出的异常应当用 @exception 描述。由于一个方法可能抛出多个异常,所以可以有多个 @exception。每?@exception 后面应有q的异常cdQ说明中应指出抛出异常的原因。需要注意的是,异常cd应该Ҏ源文件的 import 语句定是写出类名还是类全名? CZ如下Q?/P>
使用 javadoc ~译生成的文档相关部分如下图Q?/P>
可以看到Q上例中 @param b excrescent parameter 一句是多余的,因ؓ参数只是一?nQƈ没有一?b?Q??javadoc ~译时ƈ没有查。因此,写文档注释时一定要正确匚w参数表与Ҏ中正式参数表的项目。如果方法参数表中的参数?aQ文档中却给出对参数 x 的解释,或者再多出一个参?iQ就会让人摸不着头脑了。@exceptin 也是一栗?/P>
上例E序中ƈ没有抛出一?NullPointerExceptionQ但是文档注释中Z么要写上q么一句呢Q难道又是ؓ了演C?q不是ؓ了演C描q多余的异常也能通过~译Q而是Z说明写异常说明时应考运行时 (RunTime) 异常的可能性。上例程序中Q如果参?n 是给的一个空?(null)Q那么程序会在运行的时候抛Z?NullPointerExceptionQ因此,在文档注释中d了对 NullPointerException 的说明?/P>
上例中的 @return 语句有两个,但是Ҏ规则Q同一个方法中Q只有第一?@return 有效Q其余的会被 javadoc 忽略。所以生成的文档中没有出现第二个 @return 的描q?/P>
讲到q里Q该怎么写文档注释你应该已经清楚了,下面开始讲?javadoc 的常用命令?/P>
q行 javadoc -help 可以看到 javadoc 的用法,q里列D常用参数如下Q?/P>
用法Q?BR> javadoc [options] [packagenames] [sourcefiles] 选项Q?/P>
javadoc ~译文档时可以给定包列表Q也可以l出源程序文件列表。例如在 CLASSPATH 下有两个包若q类如下Q?/P>
fancy.Editor q里有两个包 (fancy ?fancy.editor) ?5 个类。那么编译时 (Windows 环境) 可以使用如下 javadoc 命oQ?/P>
javadoc fancy\Test.java fancy\Editor.java fancy\editor\ECommand.java fancy\editor\EDocument.java fancy\editor\EView.java q是l出 java 源文件作为编译参数的ҎQ注意命令中指出的是文g路径Q应该根据实际情冉|变。也可以是给出包名作为编译参敎ͼ如: javadoc fancy fancy.editor 用浏览器打开生成文档?index.html 文g卛_发现两种方式~译l果的不同,如下图: 用第二条命o生成的文档被框架分成了三部分Q包列表、类列表和类说明。在包列表中选择了某个包之后Q类列表中就会列包中的所有类Q在cd表中选择了某个类之后Q类说明部分׃昄cȝ详细文档。而用W一条命令生成的文档只有两部分,cd表和c说明,没有包列表。这是两种方式生成文档的最大区别了?/P>
下面再来l说选项?/P>
-public?protected?package?private 四个选项Q只需要Q选其一卛_。它们指定的昄cL员的E度。它们显C的成员多少是一个包含的关系Q如下表Q?/P>
-d 选项允许你定义输出目录。如果不?-d 定义输出目录Q生成的文档文g会放在当前目录下?d 选项的用法是 -d 目录?/FONT> 目录名ؓ必填,也就是说Q如果你使用?-d 参数Q就一定要为它指定一个目录。这个目录必dl存在了Q如果还不存在,请在q行 javadoc 之前创徏该目录?/P>
-version ?-author 用于控制生成文档时是否生?@version ?@author 指定的内宏V不加这两个参数的情况下Q生成的文档中不包含版本和作者信息?/P>
-splitindex 选项烦引分为每个字母对应一个文件。默认情况下Q烦引文件只有一个,且该文g中包含所有烦引内宏V当然生成文档内容不多的时候,q样做非常合适,但是Q如果文档内定w常多的时候,q个索引文g包含非常多的内容,昑־q于庞大。?-splitindex 会把索引文g按各索引的W一个字母进行分c,每个字母对应一个文件。这P减M一个烦引文件的负担?/P>
-windowtitle 选项为文档指定一个标题,该标题会昄在窗口的标题栏上。如果不指定该标题,而默认的文档标题为“生成的文档Q无标题Q”。该选项的用法是Q?/P>
-windowtitle 标题 标题是一串没有包含空格的文本Q因为空格符是用于分隔各参数的,所以不能包含空根{同 -d cMQ如果指定了 -windowtitle 选项Q则必须指定标题文本?/P>
到此为止QJava 文档?javadoc ׃l完了。javadoc 真的能让我们?Java 注释上做文章——生成开发文档?/P>
1.1 异常机制是指当程序出现错误后Q程序如何处理。具体来_异常机制提供了程序退出的安全通道。当出现错误后,E序执行的流E发生改变,E序的控制权转移到异常处理器?BR>1.2 传统的处理异常的办法是,函数q回一个特D的l果来表C出现异常(通常q个Ҏl果是大家约定俗U的Q,调用该函数的E序负责查ƈ分析函数q回的结果。这样做有如下的弊端Q例如函数返?1代表出现异常Q但是如果函数确实要q回-1q个正确的值时׃出现hQ可L降低,程序代码与处理异常的代码爹在一Pp用函数的E序来分析错误,q就要求客户E序员对库函数有很深的了解?BR>1.3 异常处理的流E?BR>1.3.1 遇到错误Q方法立即结束,q不q回一个|同时Q抛Z个异常对?BR>1.3.2 调用该方法的E序也不会l执行下去,而是搜烦一个可以处理该异常的异常处理器Qƈ执行其中的代?/P>
2.2.1 Error体系
ErrorcMpLqCJavaq行pȝ中的内部错误以及资源耗尽的情形。应用程序不应该抛出q种cd的对象(一般是p拟机抛出Q。如果出现这U错误,除了力使程序安全退出外Q在其他斚w是无能ؓ力的。所以,在进行程序设计时Q应该更xException体系?BR>2.2.2 Exception体系
Exception体系包括RuntimeException体系和其他非RuntimeException的体p?BR>2.2.2.1 RuntimeException
RuntimeException体系包括错误的类型{换、数l越界访问和试图讉KI指针等{。处理RuntimeException的原则是Q如果出现RuntimeExceptionQ那么一定是E序员的错误。例如,可以通过查数l下标和数组边界来避免数l越界访问异常?BR>2.2.2.2 其他QIOException{等Q?BR>q类异常一般是外部错误Q例如试图从文gd数据{,qƈ不是E序本n的错误,而是在应用环境中出现的外部错误?BR>2.3 与C++异常分类的不?BR>2.3.1 其实QJava中RuntimeExceptionq个cdLq不恰当Q因ZQ何异帔R是运行时出现的。(在编译时出现的错误ƈ不是异常Q换句话_异常是Z解决E序q行时出现的的错误)?BR>2.3.2 C++中logic_error与Java中的RuntimeException是等LQ而runtime_error与Java中非RuntimeExceptioncd的异常是{h的?/P>
3.1.1 语法QthrowsQ略Q?BR>3.1.2 Z么要声明Ҏ抛出异常Q?BR>Ҏ是否抛出异常与方法返回值的cd一样重要。假设方法抛出异常确没有声明该方法将抛出异常Q那么客L序员可以调用q个Ҏ而且不用~写处理异常的代码。那么,一旦出现异常,那么q个异常没有合适的异常控制器来解决?BR>3.1.3 Z么抛出的异常一定是已检查异常?
RuntimeException与Error可以在Q何代码中产生Q它们不需要由E序员显C的抛出Q一旦出现错误,那么相应的异怼被自动抛出。而已查异常是q序员抛出的,q分ZU情况:客户E序员调用会抛出异常的库函数Q库函数的异常由库程序员抛出Q;客户E序员自׃用throw语句抛出异常。遇到ErrorQ程序员一般是无能为力的;遇到RuntimeExceptionQ那么一定是E序存在逻辑错误Q要对程序进行修改(相当于调试的一U方法)Q只有已查异常才是程序员所兛_的,E序应该且仅应该抛出或处理已查异常?BR>3.1.4 注意Q覆盖父cLҎ的子cL法不能抛出比父类Ҏ更多的异常,所以,有时设计父类的方法时会声明抛出异常,但实际的实现Ҏ的代码却q不抛出异常Q这样做的目的就是ؓ了方便子cL法覆盖父cL法时可以抛出异常?BR>3.2 如何抛出异常
3.2.1 语法QthrowQ略Q?BR>3.2.2 抛出什么异常?
对于一个异常对象,真正有用的信息时异常的对象类型,而异常对象本w毫无意义。比如一个异常对象的cd是ClassCastExceptionQ那么这个类名就是唯一有用的信息。所以,在选择抛出什么异常时Q最关键的就是选择异常的类名能够明说明异常情늚cR?BR>3.2.3 异常对象通常有两U构造函敎ͼ一U是无参数的构造函敎ͼ另一U是带一个字W串的构造函敎ͼq个字符串将作ؓq个异常对象除了cd名以外的额外说明?BR>3.2.4 创徏自己的异常:当Java内置的异帔R不能明确的说明异常情늚时候,需要创q异常。需要注意的是,唯一有用的就是类型名q个信息Q所以不要在异常cȝ设计上花费精力?BR>3.3 捕获异常
如果一个异常没有被处理Q那么,对于一个非囑Ş界面的程序而言Q该E序会被中止q输出异怿息;对于一个图形界面程序,也会输出异常的信息,但是E序q不中止Q而是q回用户界面处理循环中?BR>3.3.1 语法Qtry、catch和finallyQ略Q?BR>控制器模块必ȝ接在try块后面。若掷出一个异常,异常控制机制会搜dC异常cd相符的第一个控制器随后它会q入那个catch 从句Qƈ认ؓ异常已得到控制。一旦catch 从句l束Ҏ制器的搜索也会停止?BR>3.3.1.1 捕获多个异常Q注意语法与捕获的顺序)Q略Q?BR>3.3.1.2 finally的用法与异常处理程Q略Q?BR>3.3.2 异常处理做什么?
对于Java来说Q由于有了垃圾收集,所以异常处理ƈ不需要回收内存。但是依然有一些资源需要程序员来收集,比如文g、网l连接和囄{资源?BR>3.3.3 应该声明Ҏ抛出异常q是在方法中捕获异常Q?BR>原则Q捕捉ƈ处理哪些知道如何处理的异常,而传递哪些不知道如何处理的异?BR>3.3.4 再次抛出异常
3.3.4.1 Z么要再次抛出异常Q?BR>在本U中Q只能处理一部分内容Q有些处理需要在更高一U的环境中完成,所以应该再ơ抛出异常。这样可以每的异常处理器处理它能够处理的异常?BR>3.3.4.2 异常处理程
对应与同一try块的catch块将被忽略,抛出的异常将q入更高的一U?/P>
首先Q用异常很方便Q所以程序员一般不再愿意编写处理错误的代码Q而仅仅是单单的抛Z个异常。这样做是不对的Q对于完全已知的错误Q应该编写处理这U错误的代码Q增加程序的鲁棒性。另外,异常机制的效率很差?BR>4.2 异怸普通错误区分开
对于普通的完全一致的错误Q应该编写处理这U错误的代码Q增加程序的鲁棒性。只有外部的不能定和预知的q行旉误才需要用异常?BR>4.3 异常对象中包含的信息
一般情况下Q异常对象唯一有用的信息就是类型信息。但使用异常带字W串的构造函数时Q这个字W串q可以作为额外的信息。调用异常对象的getMessage()、toString()或者printStackTrace()Ҏ可以分别得到异常对象的额外信息、类名和调用堆栈的信息。ƈ且后一U包含的信息是前一U的集?/P>
String url="jdbc:oracle:thin:@服务器ip:1521:数据库名U?;
Connection conn=DriverManager.getConnection(url,"用户?,"密码");
?q接mssql数据?BR>
q接驱动文gjtds-0.6.jar
String url="jdbc:jtds:sqlserver://localhost:1433/‘数据库名?Q?
自带驱动:
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
?q接DB2数据?BR> Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/数据库名U?;
四、jspq接Informix数据?BR>
Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url = "jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword";
//testDBZ的数据库?
Connection conn= DriverManager.getConnection(url);
Statement stmt=conn.createStatement
五、jspq接Sybase数据?
Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/tsdata";
//tsdataZ的数据库?
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);
六、jspq接MySQL数据?nbsp;
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/softforum?
user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//testDBZ的数据库?
Connection conn= DriverManager.getConnection(url);
未完待箋....
]]>
例子下蝲
默认的java虚拟机的大小比较,在对大数据进行处理时java׃报错Qjava.lang.OutOfMemoryError?/P>
-Xms是设|内存初始化的大?BR>-Xmx是设|最大能够用内存的大小Q最好不要超q物理内存大)
一. Java 文档?javadoc
? 文档注释的格?BR> 1. 文档注释的格式化
2. 文档注释的三部分
? 使用 javadoc 标记
http://outinn.diy.myrice.com/book/javadoc/#t31
http://outinn.diy.myrice.com/book/javadoc/#t32
http://outinn.diy.myrice.com/book/javadoc/#t33
? javadoc 命o
* .........
* .........
*/
/**
* This is first line. <br>
***** This is second line. <br>
This is third line.
*/
This is first line. <br>
This is second line. <br>
This is third line.
/** comment for class */
public class Test {
/** comment for a attribute */
int number;
/** comment for a method */
public void myMethod() { ...... }
......
}
import java.lang.*;
/** commnet for class */
public class Test { ...... }
// 此例为正的例子
/** commnet for class */
import java.lang.*;
public class Test { ...... }
// 此例为错误的例子
/**
* show Ҏ的简q?
* <p>show Ҏ的详l说明第一?lt;br>
* show Ҏ的详l说明第二行
* @param b true 表示昄Qfalse 表示隐藏
* @return 没有q回?
*/
public void show(boolean b) {
frame.show(b);
}
* <p>show Ҏ的详l说明第一?lt;br>
* show Ҏ的详l说明第二行
* @return 没有q回?/FONT>
标记
用于
作用
@author
对类的说?/TD>
标明开发该cL块的作?/TD>
@version
对类的说?/TD>
标明该类模块的版?/TD>
@see
对类、属性、方法的说明
参考{向,也就是相关主?/TD>
@param
Ҏ法的说明
Ҏ法中某参数的说明
@return
Ҏ法的说明
Ҏ法返回值的说明
@exception
Ҏ法的说明
Ҏ法可能抛出的异常q行说明
@see #Ҏ名或属性名
@see cd#Ҏ名或属性名
成员cd
成员名称及参?/B>
@see 句法
属?/TD>
number
@see number
属?/TD>
count
@see count
Ҏ
count()
@see count()
Ҏ
show(boolean b)
@see show(boolean)
Ҏ
main(String[] args)
@see main(String[])
/**
* @see String
* @see java.lang.StringBuffer
* @see #str
* @see #str()
* @see #main(String[])
* @see Object#toString()
*/
public class TestJavaDoc {
}
@version 版本?/FONT>
/**
* @author Fancy
* @author Bird
* @version Version 1.00
* @version Version 2.00
*/
public class TestJavaDoc {
}
@version Version 1.00<br>Version 2.00
@return q回D?BR> @exception 异常cd 说明
public class TestJavaDoc {
/**
* @param n a switch
* @param b excrescent parameter
* @return true or false
* @return excrescent return
* @exception java.lang.Exception throw when switch is 1
* @exception NullPointerException throw when parameter n is null
*/
public boolean fun(Integer n) throws Exception {
switch (n.intValue()) {
case 0:
break;
case 1:
throw new Exception("Test Only");
default:
return false;
}
return true;
}
}
-public
仅显C?public cd成员
-protected
昄 protected/public cd成员 (~省)
-package
昄 package/protected/public cd成员
-private
昄所有类和成?/TD>
-d <directory>
输出文g的目标目?/TD>
-version
包含 @version D?/TD>
-author
包含 @author D?/TD>
-splitindex
烦引分为每个字母对应一个文?/TD>
-windowtitle <text>
文档的浏览器H口标题
fancy.Test
fancy.editor.ECommand
fancy.editor.EDocument
fancy.editor.EView
-private (昄所有类和成?
-package (昄 package/protected/public cd成员)
-protected (昄 protected/public cd成员)
-public (仅显C?public cd成员)
]]>
class Parent{
public void nonStaticMethod() {
System.out.println("Parent's Non-Static Method is Called");
}
public static void staticMethod() {
System.out.println("parent's static method is called");
}
}
class Child extends Parent{
public void nonStaticMethod() {
System.out.println("child's non-static method is called");
}
public static void staticMethod() {
System.out.println("child's static method is called");
}
}
?/FONT>TestcM我们分别使用Parent p1 = new Parent(),Parent p2 = new Child(),Child c = new Child() 得到三个实例Qƈ分别调用静态方法和非静态方法,我们来看E序的运行结?
?/FONT>TestcM我们分别使用Parent p1 = new Parent(),Parent p2 = new Child(),Child c = new Child()得到三个实例Qƈ分别调用静态方法和非静态方法,我们来看E序的运行结?public class Test{
public static void main(String args[]) {
Parent p1 = new Parent();
Parent p2 = new Child();
Child c = new Child();
System.out.print("Parent.static: ");
Parent.staticMethod();
System.out.print("p1.static: ");
p1.staticMethod();
System.out.print("p2.static: ");
p2.staticMethod();
System.out.print("p1.nonStatic: ");
p1.nonStaticMethod();
System.out.print("p2.nonStatic: ");
p2.nonStaticMethod();
System.out.print("Child.static: ");
Child.staticMethod();
System.out.print("c.static: ");
c.staticMethod();
System.out.print("c.nonStatic: ");
c.nonStaticMethod();
}
}
E序的运行结果ؓQ?
Parent.static: parent's static method is called
p1.static: parent's static method is called
p2.static: parent's static method is called
p1.nonStatic: Parent's Non-Static Method is Calle
p2.nonStatic: child's non-static method is called
Child.static: child's static method is called
c.static: child's static method is called
c.nonStatic: child's non-static method is called
值得注意的是p2实际上是一个Child的类型的引用Q然而在调用静态方法的时候,它执行的却是父类的静态方法,而不是Child的静态方法,而调?p2的非静态方法的时候执行的是Child 的非静态方法,Z么呢Q?FONT color=#ff0000>原因是静态方法是在编译的时候把静态方法和cȝ引用cdq行匚wQ而不是在q行的时候和cd用进行匹配。因此我们得出结论:当我们在子类中创建的静态方法,它ƈ不会覆盖父类中相同名字的静态方法?
要学习Java,你必ȝ解构造器。因为构造器可以提供许多Ҏ的方法,q个对于初学者经常淆。但是,构造器和方法又有很多重要的区别?BR>
我们说构造器是一U方法,p讲澳大利亚的鸭嘴兽是一U哺育动物。(按:老外喜欢打比喻,我也q着译Q。要理解鸭嘴兽,那么先必ȝ解它和其他哺育动物的区别。同样地Q要理解构造器Q那么就要了解构造器和方法的区别。所有学习java的hQ尤其是寚w些要认证考试的,理解构造器是非帔R要的。下面将单介l一?Q最后用一个表作了些简单的ȝ?
一?FONT color=#0000ff>功能和作用的不同
构造器是ؓ了创Z个类的实例。这个过E也可以在创Z个对象的时候用刎ͼPlatypus p1 = new Platypus();
相反Q方法的作用是ؓ了执行java代码?
二、修饰符Q返回值和命名的不?/SPAN>
构造器和方法在下面三个斚w的区别:修饰W,q回|命名。和Ҏ一P构造器可以有Q何访问的修饰Q?public, protected, private或者没有修饎ͼ通常被package ?friendly调用Q? 不同于方法的是,构造器不能有以下非讉K性质的修饎ͼ abstract, final, native, static, 或?synchronized?
q回cd也是非常重要的。方法能q回Mcd的值或者无q回|voidQ,构造器没有q回|也不需要void?
最后,谈谈两者的命名。构造器使用和类相同的名字,而方法则不同。按照习惯,Ҏ通常用小写字母开始,而构造器通常用大写字母开始。构造器通常是一个名词,因ؓ它和cd相同Q而方法通常更接q动词,因ؓ它说明一个操作?
三?this"的用?/SPAN>
构造器和方法用关键字this有很大的区别。方法引用this指向正在执行Ҏ的类的实例。静态方法不能用this关键字,因ؓ静态方法不属于cȝ实例Q所以this也就没有什么东西去指向。构造器的this指向同一个类中,不同参数列表的另外一个构造器Q我们看看下面的代码Q?
public class Platypus {
String name;
Platypus(String input) {
name = input;
}
Platypus() {
this("John/Mary Doe");
}
public static void main(String args[]) {
Platypus p1 = new Platypus("digger");
Platypus p2 = new Platypus();
}
}
在上面的代码中,?个不同参数列表的构造器。第一个构造器Q给cȝ成员name赋|W二个构造器Q调用第一个构造器Q给成员变量name一个初始?"John/Mary Doe".
在构造器中,如果要用关键字this,那么Q必L在第一行,如果不这P导致一个编译错误?
四?super"的用?
构造器和方法,都用关键字super指向类Q但是用的方法不一栗方法用q个关键字去执行被重载的类中的Ҏ。看下面的例子:
class Mammal {
void getBirthInfo() {
System.out.println("born alive.");
}
}
class Platypus extends Mammal {
void getBirthInfo() {
System.out.println("hatch from eggs");
System.out.print("a mammal normally is ");
super.getBirthInfo();
}
}
在上面的例子中,使用super.getBirthInfo()去调用超cMammal中被重蝲的方法?
构造器使用super去调用超cM的构造器。而且q行代码必须攑֜W一行,否则~译出错。看下面的例子:
public class SuperClassDemo {
SuperClassDemo() {}
}
class Child extends SuperClassDemo {
Child() {
super();
}
}
在上面这个没有什么实际意义的例子中,构造器 Child()包含?super,它的作用是超cM的构造器SuperClassDemo实例化,q加?ChildcM?
五、编译器自动加入代码
~译器自动加入代码到构造器Q对于这个,javaE序员新手可能比较淆。当我们写一个没有构造器的类Q编译的时候,~译器会自动加上一个不带参数的构造器Q例如:public class Example {}
~译后将如下代码Q?
public class Example {
Example() {}
}
在构造器的第一行,没有使用superQ那么编译器也会自动加上Q例如:
public class TestConstructors {
TestConstructors() {}
}
~译器会加上代码Q如下:
public class TestConstructors {
TestConstructors() {
super();
}
}
仔细想一下,q道下面的代码
public class Example {}
l过会被~译器加代码形如Q?
public class Example {
Example() {
super();
}
}
六、?/SPAN>
构造器是不能被l承的。子cd以承超cȝMҎ。看看下面的代码Q?
public class Example {
public void sayHi {
system.out.println("Hi");
}
Example() {}
}
public class SubClass extends Example {
}
c?SubClass 自动l承了父cM的sayHiҎQ但是,父类中的构造器 Example()却不能被l承?
ȝ
主题 | 构造器 | Ҏ |
功能 | 建立一个类的实? | java功能语句 |
修饰 | 不能用bstract, final, native, static, or synchronized | ?/TD> |
q回cd | 没有q回|没有void | 有返回|或者void |
命名 | 和类名相同;通常为名词,大写开?/TD> | 通常代表一个动词的意思,写开?/TD> |
this | 指向同一个类中另外一个构造器Q在W一? |
指向当前cȝ一个实例,不能用于静态方?/TD> |
super | 调用父类的构造器Q在W一?/TD> | 调用父类中一个重载的Ҏ |
l承 | 构造器不能被? | Ҏ可以被? |
~译器自动加入一个缺省的构造器 |
自动加入Q如果没有) | 不支? |
~译器自动加入一个缺省的调用到超cȝ构造器 | 自动加入Q指super(),如果没有Q?/TD> | 不支? |
C:\java>
ȝQ?BR>1、类只有在用New调用创徏的时候才会被JAVAc装载器装入
2、JAVAc首ơ装入时Q会寚w态成员变量或Ҏq行一ơ初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块别相同,非静态成员变量和非静态初始化块别相同?BR>先初始化父类的静态代?-->初始化子cȝ静态代?->
初始化父cȝ非静态代?-->初始化父cL造函?-->
初始化子c非静态代?-->初始化子cL造函?BR>3、创建类实例Ӟ首先按照父子l承关系q行初始?BR>4、类实例创徏时候,首先初始化块部分先执行,然后是构造方法;然后?BR>本类l承的子cȝ初始化块执行Q最后是子类的构造方?BR>5、类消除时候,首先消除子类部分Q再消除父类部分
试:
package com.javabase;
/**
* <p>Title: qx例子练?lt;/p>
*
* <p>Description: qx例子练?lt;/p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: 北京开元东方科技有限公司</p>
*
* @author 樊徏?BR> * @version 1.0
* 试javacd载初始化序
*/
abstract class base
{
public int age=getNumber(100);
static
{
System.out.println("base static block");
}
{
System.out.println("base nonstatic block");
}
static int sage=getNumber(50);
base()
{
System.out.println(age);
System.out.println("base start");
draw();//会调用子c覆盖后的方法,哪批怕写在游d中也会执行子c覆盖后的方?BR> System.out.println("base end");
}
static int getNumber(int base)
{
System.out.println("base.getNumber int"+base);
return base;
}
public void draw()
{
System.out.println("base.draw");
}
}
public class JavaBase extends base{
public int age=getNumber(1001);
private int _radius=getNumber(10);
static int sage=getNumber(250);
static
{
System.out.println("subclass static block");
}
{
System.out.println("subclass nonstatic block");
}
JavaBase(int radius)
{
_radius=radius;
System.out.println(age);
System.out.println("initializeOrder initialized");
}
public void draw()
{
System.out.println("initializeOrder.draw "+_radius);
}
/** *//**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("-------------cd始化开?------------");
new JavaBase(1000);
System.out.println("-------------cd始化l束-------------");
}
}
执行l果:
base static block
base.getNumber int50
base.getNumber int250
subclass static block
-------------cd始化开?------------
base.getNumber int100
base nonstatic block
initializeOrder.draw 0
100
base start
base end
base.getNumber int1001
base.getNumber int10
subclass nonstatic block
1001
initializeOrder initialized
-------------cd始化l束-------------
更正:static静态成员变量和静态初始化是在new对象之前q行?
后待d更正***************************************************************
Static详解:
一、static
请先看下面这D늨序: public class Hello{ 看过q段E序Q对于大多数学过Java 的从来说Q都不陌生。即使没有学qJavaQ而学q其它的高语言Q例如CQ那你也应该能看懂这D代码的意思。它只是单的输出“Hello,world”,一点别的用处都没有Q然而,它却展示了static关键字的主要用法?/P> | |
|
?处,我们定义了一个静态的Ҏ名ؓmainQ这意味着告诉Java~译器,我这个方法不需要创Z个此cȝ对象卛_使用。你q记得你是怎么q行q个E序吗?一般,我们都是在命令行下,打入如下的命令:
javac Hello.java
java Hello
Hello,world!
q就是你q行的过E,W一行用来编译Hello.javaq个文gQ执行完后,如果你查看当前,会发现多了一个Hello.class文gQ那是W一行生的Java二进制字节码。第二行是执行一个JavaE序的最普遍做法。执行结果如你所料。在2中,你可能会惻IZ么要q样才能输出。好Q我们来分解一下这条语句。(如果没有安装Java文档Q请到Sun的官方网站浏览J2SE APIQ首先,System是位于java.lang包中的一个核心类Q如果你查看它的定义Q你会发现有q样一行:public static final PrintStream out;接着再进一步,点击PrintStreamq个链接,在METHOD面Q你会看到大量定义的ҎQ查找printlnQ会有这样一行:
public void println(String x)?/P>
好了Q现在你应该明白Z么我们要那样调用了,out是System的一个静态变量,所以可以直接用,而out所属的cL一个printlnҎ?/P>
静态方?/STRONG>
通常Q在一个类中定义一个方法ؓstaticQ那是_用类名而无需本类的对象即可调用此Ҏ。如下所C:
class Simple{
static void go(){
System.out.println("Go...");
}
}
public class Cal{
public static void main(String[] args){
Simple.go();
}
}
调用一个静态方法就是“类?Ҏ名?静态方法的使用很简单如上所C。一般来_静态方法常ؓ应用E序中的其它cL供一些实用工h用,在Java的类库中大量的静态方法正是出于此目的而定义的?/P>
静态变?/STRONG>
静态变量与静态方法类伹{所有此cd例共享此静态变量,也就是说在类装蝲Ӟ只分配一块存储空_所有此cȝ对象都可以操控此块存储空_当然对于final则另当别Z。看下面q段代码Q?/P>
class Value{
static int c=0;
static void inc(){
c++;
}
}
class Count{
public static void prt(String s){
System.out.println(s);
}
public static void main(String[] args){
Value v1,v2;
v1=new Value();
v2=new Value();
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+" v2.c="+v2.c);
}
}
l果如下Q?/P>
v1.c=0 v2.c=0
v1.c=1 v2.c=1
由此可以证明它们׃n一块存储区。static变量有点cM于C中的全局变量的概c值得探讨的是静态变量的初始化问题。我们修改上面的E序Q?/P>
class Value{
static int c=0;
Value(){
c=15;
}
Value(int i){
c=i;
}
static void inc(){
c++;
}
}
class Count{
public static void prt(String s){
System.out.println(s);
}
Value v=new Value(10);
static Value v1,v2;
static{
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1=new Value(27);
prt("v1.c="+v1.c+" v2.c="+v2.c);
v2=new Value(15);
prt("v1.c="+v1.c+" v2.c="+v2.c);
}
public static void main(String[] args){
Count ct=new Count();
prt("ct.c="+ct.v.c);
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+" v2.c="+v2.c);
prt("ct.c="+ct.v.c);
}
}
q行l果如下Q?/P>
v1.c=0 v2.c=0
v1.c=27 v2.c=27
v1.c=15 v2.c=15
ct.c=10
v1.c=10 v2.c=10
v1.c=11 v2.c=11
ct.c=11
q个E序展示了静态初始化的各U特性。如果你初次接触JavaQ结果可能o你吃惊。可能会对static后加大括h到困惑。首先要告诉你的是,static定义的变量会优先于Q何其它非static变量Q不论其出现的顺序如何。正如在E序中所表现的,虽然v出现在v1和v2的前面,但是l果却是v1和v2的初始化在v的前面。在static{后面跟着一D代码,q是用来q行昑ּ的静态变量初始化Q这D代码只会初始化一ơ,且在c被W一ơ装载时。如果你能读懂ƈ理解q段代码Q会帮助你对static关键字的认识。在涉及到承的时候,会先初始化父cȝstatic变量Q然后是子类的,依次cL?/P>
通常一个普通类不允许声明ؓ静态的Q只有一个内部类才可以。这时这个声明ؓ静态的内部cd以直接作Z个普通类来用,而不需实例一个外部类。如下代码所C:
public class StaticCls{
public static void main(String[] args){
OuterCls.InnerCls oi=new OuterCls.InnerCls();
}
}
class OuterCls{
public static class InnerCls{
InnerCls(){
System.out.println("InnerCls");
}
}
}
输出l果会如你所料:
InnerCls