??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲a∨一区二区三区,天堂一区二区在线免费观看,91嫩草亚洲精品http://www.aygfsteel.com/fjq639/category/6212.htmlJAVA技?/description>zh-cnTue, 27 Feb 2007 16:09:06 GMTTue, 27 Feb 2007 16:09:06 GMT60Java异常学习心得Q{Q?/title><link>http://www.aygfsteel.com/fjq639/archive/2005/12/22/25087.html</link><dc:creator>黑石</dc:creator><author>黑石</author><pubDate>Thu, 22 Dec 2005 07:42:00 GMT</pubDate><guid>http://www.aygfsteel.com/fjq639/archive/2005/12/22/25087.html</guid><wfw:comment>http://www.aygfsteel.com/fjq639/comments/25087.html</wfw:comment><comments>http://www.aygfsteel.com/fjq639/archive/2005/12/22/25087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fjq639/comments/commentRss/25087.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fjq639/services/trackbacks/25087.html</trackback:ping><description><![CDATA[<P>本文重在Java中异常机制的一些概c写本文的目的在于方便我很长旉后若是忘了这些东西可以通过q片文章q速回忆v来?/P> <P>1. 异常机制<BR>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> <P>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的异常的特点<BR>2.2.1 Error体系<BR>ErrorcMpLqCJavaq行pȝ中的内部错误以及资源耗尽的情形。应用程序不应该抛出q种cd的对象(一般是p拟机抛出Q。如果出现这U错误,除了力使程序安全退出外Q在其他斚w是无能ؓ力的。所以,在进行程序设计时Q应该更xException体系?BR>2.2.2 Exception体系<BR>Exception体系包括RuntimeException体系和其他非RuntimeException的体p?BR>2.2.2.1 RuntimeException<BR>RuntimeException体系包括错误的类型{换、数l越界访问和试图讉KI指针等{。处理RuntimeException的原则是Q如果出现RuntimeExceptionQ那么一定是E序员的错误。例如,可以通过查数l下标和数组边界来避免数l越界访问异常?BR>2.2.2.2 其他QIOException{等Q?BR>q类异常一般是外部错误Q例如试图从文g֐d数据{,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> <P>3 异常的用方?BR>3.1 声明Ҏ抛出异常 <BR>3.1.1 语法QthrowsQ略Q?BR>3.1.2 Z么要声明Ҏ抛出异常Q?BR>Ҏ是否抛出异常与方法返回值的cd一样重要。假设方法抛出异常确没有声明该方法将抛出异常Q那么客L序员可以调用q个Ҏ而且不用~写处理异常的代码。那么,一旦出现异常,那么q个异常没有合适的异常控制器来解决?BR>3.1.3 Z么抛出的异常一定是已检查异常?<BR>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 如何抛出异常<BR>3.2.1 语法QthrowQ略Q?BR>3.2.2 抛出什么异常?<BR>对于一个异常对象,真正有用的信息时异常的对象类型,而异常对象本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 捕获异常<BR>如果一个异常没有被处理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 异常处理做什么?<BR>对于Java来说Q由于有了垃圾收集,所以异常处理ƈ不需要回收内存。但是依然有一些资源需要程序员来收集,比如文g、网l连接和囄{资源?BR>3.3.3 应该声明Ҏ抛出异常q是在方法中捕获异常Q?BR>原则Q捕捉ƈ处理哪些知道如何处理的异常,而传递哪些不知道如何处理的异?BR>3.3.4 再次抛出异常<BR>3.3.4.1 Z么要再次抛出异常Q?BR>在本U中Q只能处理一部分内容Q有些处理需要在更高一U的环境中完成,所以应该再ơ抛出异常。这样可以每的异常处理器处理它能够处理的异常?BR>3.3.4.2 异常处理程<BR>对应与同一try块的catch块将被忽略,抛出的异常将q入更高的一U?/P> <P>4 关于异常的其他问?BR>4.1 q度使用异常<BR>首先Q用异常很方便Q所以程序员一般不再愿意编写处理错误的代码Q而仅仅是单单的抛Z个异常。这样做是不对的Q对于完全已知的错误Q应该编写处理这U错误的代码Q增加程序的鲁棒性。另外,异常机制的效率很差?BR>4.2 异怸普通错误区分开<BR>对于普通的完全一致的错误Q应该编写处理这U错误的代码Q增加程序的鲁棒性。只有外部的不能定和预知的q行旉误才需要用异常?BR>4.3 异常对象中包含的信息<BR>一般情况下Q异常对象唯一有用的信息就是类型信息。但使用异常带字W串的构造函数时Q这个字W串q可以作为额外的信息。调用异常对象的getMessage()、toString()或者printStackTrace()Ҏ可以分别得到异常对象的额外信息、类名和调用堆栈的信息。ƈ且后一U包含的信息是前一U的集?/P><img src ="http://www.aygfsteel.com/fjq639/aggbug/25087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fjq639/" target="_blank">黑石</a> 2005-12-22 15:42 <a href="http://www.aygfsteel.com/fjq639/archive/2005/12/22/25087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中不同数据库q接字符?/title><link>http://www.aygfsteel.com/fjq639/archive/2005/12/21/24974.html</link><dc:creator>黑石</dc:creator><author>黑石</author><pubDate>Wed, 21 Dec 2005 09:42:00 GMT</pubDate><guid>http://www.aygfsteel.com/fjq639/archive/2005/12/21/24974.html</guid><wfw:comment>http://www.aygfsteel.com/fjq639/comments/24974.html</wfw:comment><comments>http://www.aygfsteel.com/fjq639/archive/2005/12/21/24974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fjq639/comments/commentRss/24974.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fjq639/services/trackbacks/24974.html</trackback:ping><description><![CDATA[一.q接oracle数据?BR>    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); <BR>    String url="jdbc:oracle:thin:@服务器ip:1521:数据库名U?;<BR>    Connection conn=DriverManager.getConnection(url,"用户?,"密码");<BR><BR>?q接mssql数据?BR><BR>     q接驱动文gjtds-0.6.jar<BR><BR>     String url="jdbc:jtds:sqlserver://localhost:1433/‘数据库名?Q?<BR>     自带驱动:<BR><BR>     Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();<BR>     String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"; <BR><BR>?q接DB2数据?BR>     Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); <BR>     String url="jdbc:db2://localhost:5000/数据库名U?;<BR>四、jspq接Informix数据?BR><BR>      Class.forName("com.informix.jdbc.IfxDriver").newInstance(); <BR>      String url = "jdbc:informix-sqli://123.45.67.89:1533/testDB:INFORMIXSERVER=myserver; <BR>      user=testuser;password=testpassword"; <BR>     //testDBZ的数据库?<BR>     Connection conn= DriverManager.getConnection(url); <BR>     Statement stmt=conn.createStatement <BR><BR>五、jspq接<A target=_blank><FONT color=#3366cc>Sybase</FONT></A>数据?<BR><BR>    Class.forName("com.sybase.jdbc.SybDriver").newInstance(); <BR>   String url =" jdbc:sybase:Tds:localhost:5007/tsdata"; <BR>   //tsdataZ的数据库?<BR>   Properties sysProps = System.getProperties(); <BR>   SysProps.put("user","userid"); <BR>   SysProps.put("password","user_password"); <BR>   Connection conn= DriverManager.getConnection(url, SysProps); <BR><BR><BR>六、jspq接MySQL数据?nbsp;<BR>       Class.forName("org.gjt.mm.mysql.Driver").newInstance(); <BR>      String url ="jdbc:mysql://localhost/softforum? <BR><BR>      user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" <BR>    //testDBZ的数据库?<BR>     Connection conn= DriverManager.getConnection(url); <BR><BR>未完待箋....<BR><BR><BR><BR><img src ="http://www.aygfsteel.com/fjq639/aggbug/24974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fjq639/" target="_blank">黑石</a> 2005-12-21 17:42 <a href="http://www.aygfsteel.com/fjq639/archive/2005/12/21/24974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM内存试http://www.aygfsteel.com/fjq639/archive/2005/12/21/24965.html黑石黑石Wed, 21 Dec 2005 08:26:00 GMThttp://www.aygfsteel.com/fjq639/archive/2005/12/21/24965.htmlhttp://www.aygfsteel.com/fjq639/comments/24965.htmlhttp://www.aygfsteel.com/fjq639/archive/2005/12/21/24965.html#Feedback0http://www.aygfsteel.com/fjq639/comments/commentRss/24965.htmlhttp://www.aygfsteel.com/fjq639/services/trackbacks/24965.html
例子下蝲
默认的java虚拟机的大小比较,在对大数据进行处理时java׃报错Qjava.lang.OutOfMemoryError?/P>

讄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
-Xms是设|内存初始化的大?BR>-Xmx是设|最大能够用内存的大小Q最好不要超q物理内存大)

在weblogic中,可以在startweblogic.cmd中对每个domain虚拟内存的大进行设|,默认的设|是在commEnv.cmd里面?/P>

黑石 2005-12-21 16:26 发表评论
]]>
?Java 的注释上做文??http://www.aygfsteel.com/fjq639/archive/2005/12/21/24928.html黑石黑石Wed, 21 Dec 2005 04:15:00 GMThttp://www.aygfsteel.com/fjq639/archive/2005/12/21/24928.htmlhttp://www.aygfsteel.com/fjq639/comments/24928.htmlhttp://www.aygfsteel.com/fjq639/archive/2005/12/21/24928.html#Feedback0http://www.aygfsteel.com/fjq639/comments/commentRss/24928.htmlhttp://www.aygfsteel.com/fjq639/services/trackbacks/24928.html

目录

  前言
   一. 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


前言

  Java 的语法与 C++ 及ؓ怼Q那么,你知?Java 的注释有几种吗?是两U?

  // 注释一?BR>   /* ...... */ 注释若干?/P>

  不完全对Q除了以上两U之外,q有W三U,文档注释Q?/P>

  /** ...... */ 注释若干行,q写?javadoc 文档

  通常q种注释的多行写法如下:

  /**
   * .........
   * .........
   */

  暂停Q暂停!q第三种注释有什么用Qjavadoc 又是什么东西?

  好,那就让我告诉你—?


一. Java 文档?javadoc

  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>


? 文档注释的格?/B>

  文档注释可以用于对类、属性、方法等q行说明。写文档注释旉了需要?/** .... */ 限定之外Q还需要注意注释内部的一些细节问题?/P>

  1. 文档和文档注释的格式?/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再输入到文档的。如

  /**
* This is first line. <br>
***** This is second line. <br>
This is third line.
*/

  ~译输出后的 HTML 源码则是

  This is first line. <br>
This is second line. <br>
This is third line.

  前导?* 号允许连l用多个,其效果和使用一?* 号一P但多?* 号前不能有其它字W分隔,否则分隔W及后面?* 号都作为文档的内容? 号在q里是作为左边界使用Q如上例的第一行和W二行;如果没有前导?* P则边界从W一个有效字W开始,而不包括前面的空|如上例第三行?/P>

  q有一炚w要说明,文档注释只说明紧接其后的cR属性或者方法。如下例Q?/P>
 
/** comment for class */
public class Test {

    /** comment for a attribute */
    int number;

    /** comment for a method */
    public void myMethod() { ...... }

    ......
}

  上例中的三处注释是分别对类、属性和Ҏ的文档注释。它们生成的文档分别是说明紧接其后的cR属性、方法的。“紧接”二字尤光要,如果忽略了这一点,很可能造成生成的文档错误。如

 
import java.lang.*;

/** commnet for class */

public class Test { ...... }

// 此例为正的例子

  q个文档注释生成正的文档。但只需要改变其中两行的位置Q变成下例,׃出错Q?/P>
 
/** commnet for class */

import java.lang.*;

public class Test { ...... }

// 此例为错误的例子

  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>

  2. 文档注释的三部分

  Ҏ在文档中昄的效果,文档注释分ؓ三部分。先举例如下Q以便说明?/P>
 
/**
 * show Ҏ的简q?
 * <p>show Ҏ的详l说明第一?lt;br>
 * show Ҏ的详l说明第二行
 * @param b true 表示昄Qfalse 表示隐藏
 * @return 没有q回?
 */
public void show(boolean b) {
    frame.show(b);
}

  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?
   * <p>show Ҏ的详l说明第一?lt;br>
   * show Ҏ的详l说明第二行

  发现什么了Q对了,qC在其中。这一点要C了,不要画蛇添——在详细说明部分中再写一ơ简q哦Q?/P>

  W三部分是特D说明部分。这部分包括版本说明、参数说明、返回D明等。它在文档中的位|:

  W三部分在上例中相应的代码是

  * @param b true 表示昄Qfalse 表示隐藏
   * @return 没有q回?/FONT>

  除了 @param ?@return 之外Q还有其它的一些特D标讎ͼ分别用于对类、属性和Ҏ的说明……不要推我,我马上就说?/P>


? 使用 javadoc 标记

  javadoc 标记是插入文档注释中的特D标讎ͼ它们用于标识代码中的Ҏ引用。javadoc 标记由“@”及其后所跟的标记cd和专用注释引用组成。记住了Q三个部分——@、标记类型、专用注释引用。不q我宁愿把它分成两部分:@ 和标记类型、专用注释引用。虽?@ ?标记cd之间有时可以用空格符分隔Q但是我宁愿始终它们紧挨着写,以减出错机会?/P>

  javadoc 标记有如下一些:

标记 用于 作用
@author 对类的说?/TD> 标明开发该cL块的作?/TD>
@version 对类的说?/TD> 标明该类模块的版?/TD>
@see 对类、属性、方法的说明 参考{向,也就是相关主?/TD>
@param Ҏ法的说明 Ҏ法中某参数的说明
@return Ҏ法的说明 Ҏ法返回值的说明
@exception Ҏ法的说明 Ҏ法可能抛出的异常q行说明

  下面详细说明各标记?/P>

  1. @see 的?/P>

  @see 的句法有三种Q?

  @see cd
   @see #Ҏ名或属性名
   @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Ҏ受如

成员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[])

  有时也可以偷懒:假如上例中,没有 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>
 
/**
 * @see String
 * @see java.lang.StringBuffer
 * @see #str
 * @see #str()
 * @see #main(String[])
 * @see Object#toString()
 */
public class TestJavaDoc {

}

  生成的文档的相关部分如下图:

  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 作者名
   @version 版本?/FONT>

  其中Q@author 可以多次使用Q以指明多个作者,生成的文档中每个作者之间用逗号 (,) 隔开。@version 也可以用多ơ,只有W一ơ有效,生成的文档中只会昄W一ơ?@version 指明的版本号。如下例

 
/**
 * @author Fancy
 * @author Bird
 * @version Version 1.00
 * @version Version 2.00
 */
public class TestJavaDoc {

}

  生成文档的相关部分如图:

  从生成文档的囄中可以看出,两个 @author 语句都被~译Q在文档中生成了作者列表。而两?@version 语句中只有第一句被~译了,只生成了一个版本号?/P>

  从图上看Q作者列表是以逗号分隔的,如果我想分行昄怎么办?另外Q如果我xCZ个以上的版本号又该怎么办?

  ——我们可以将上述两条 @author 语句合ؓ一句,把两?@version 语句也合Z句:

  @author Fancy<br>Bird
   @version Version 1.00<br>Version 2.00

  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 参数?参数说明
   @return q回D?BR>   @exception 异常cd 说明

  每一?@param 只能描述Ҏ的一个参敎ͼ所以,如果Ҏ需要多个参敎ͼ需要多ơ?@param 来描q?/P>

  一个方法中只能用一?@returnQ如果文档说明中列了多个 @returnQ则 javadoc ~译时会发出警告Q且只有W一?@return 在生成的文档中有效?/P>

  Ҏ可能抛出的异常应当用 @exception 描述。由于一个方法可能抛出多个异常,所以可以有多个 @exception。每?@exception 后面应有q的异常cdQ说明中应指出抛出异常的原因。需要注意的是,异常cd应该Ҏ源文件的 import 语句定是写出类名还是类全名?  CZ如下Q?/P>
 
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;
    }

}

  使用 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>


? javadoc 命o

  q行 javadoc -help 可以看到 javadoc 的用法,q里列D常用参数如下Q?/P>

用法Q?BR>   javadoc [options] [packagenames] [sourcefiles]

选项Q?/P>
  -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口标题

  javadoc ~译文档时可以给定包列表Q也可以l出源程序文件列表。例如在 CLASSPATH 下有两个包若q类如下Q?/P>

  fancy.Editor
   fancy.Test
   fancy.editor.ECommand
   fancy.editor.EDocument
   fancy.editor.EView

  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>
-private (昄所有类和成?
-package (昄 package/protected/public cd成员)
-protected (昄 protected/public cd成员)
-public (仅显C?public cd成员)

  -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>

黑石 2005-12-21 12:15 发表评论
]]>
java中静态方法和非静态方法覆盖的区别http://www.aygfsteel.com/fjq639/archive/2005/12/21/24924.html黑石黑石Wed, 21 Dec 2005 03:16:00 GMThttp://www.aygfsteel.com/fjq639/archive/2005/12/21/24924.htmlhttp://www.aygfsteel.com/fjq639/comments/24924.htmlhttp://www.aygfsteel.com/fjq639/archive/2005/12/21/24924.html#Feedback0http://www.aygfsteel.com/fjq639/comments/commentRss/24924.htmlhttp://www.aygfsteel.com/fjq639/services/trackbacks/24924.html  首先我们提供两个c,基类?/FONT>ParentQ派生类?/FONT>Child。在Parent中我们提供两个方法,一个是静态方?/FONT>staticMethod(),一个是非静态方?/FONT>nonStaticMethod()。在Child

cM我们覆盖着两个Ҏ?

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用进行匹配。因此我们得出结论:当我们在子类中创建的静态方法,它ƈ不会覆盖父类中相同名字的静态方法?



黑石 2005-12-21 11:16 发表评论
]]>
理解构造器http://www.aygfsteel.com/fjq639/archive/2005/12/21/24920.html黑石黑石Wed, 21 Dec 2005 02:51:00 GMThttp://www.aygfsteel.com/fjq639/archive/2005/12/21/24920.htmlhttp://www.aygfsteel.com/fjq639/comments/24920.htmlhttp://www.aygfsteel.com/fjq639/archive/2005/12/21/24920.html#Feedback0http://www.aygfsteel.com/fjq639/comments/commentRss/24920.htmlhttp://www.aygfsteel.com/fjq639/services/trackbacks/24920.html

 要学习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> 不支?


黑石 2005-12-21 10:51 发表评论
]]>
javacȝ初始化顺?/title><link>http://www.aygfsteel.com/fjq639/archive/2005/12/21/24904.html</link><dc:creator>黑石</dc:creator><author>黑石</author><pubDate>Wed, 21 Dec 2005 01:12:00 GMT</pubDate><guid>http://www.aygfsteel.com/fjq639/archive/2005/12/21/24904.html</guid><wfw:comment>http://www.aygfsteel.com/fjq639/comments/24904.html</wfw:comment><comments>http://www.aygfsteel.com/fjq639/archive/2005/12/21/24904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fjq639/comments/commentRss/24904.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fjq639/services/trackbacks/24904.html</trackback:ping><description><![CDATA[<PRE>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覆盖后的方? 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 initializeOrder 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"); } initializeOrder(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 new initializeOrder(1000); } }<BR> q行l果Q?BR><BR>C:\java>java initializeOrder<BR>base static block<BR>base.getNumber int50<BR>base.getNumber int250<BR>subclass static block<BR>base.getNumber int100<BR>base nonstatic block<BR>100<BR>base start<BR>initializeOrder.draw 0<BR>base end<BR>base.getNumber int1001<BR>base.getNumber int10<BR>subclass nonstatic block<BR>1001<BR>initializeOrder initialized</PRE> <P>C:\java></P> <P>ȝQ?BR>1、类只有在用New调用创徏的时候才会被JAVAc装载器装入<BR>2、JAVAc首ơ装入时Q会寚w态成员变量或Ҏq行一ơ初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块别相同,非静态成员变量和非静态初始化块别相同?BR>先初始化父类的静态代?-->初始化子cȝ静态代?-><BR>初始化父cȝ非静态代?-->初始化父cL造函?--><BR>初始化子c非静态代?-->初始化子cL造函?BR>3、创建类实例Ӟ首先按照父子l承关系q行初始?BR>4、类实例创徏时候,首先初始化块部分先执行,然后是构造方法;然后?BR>本类l承的子cȝ初始化块执行Q最后是子类的构造方?BR>5、类消除时候,首先消除子类部分Q再消除父类部分<BR><STRONG>试:<BR><BR>package com.javabase;</STRONG></P> <P><STRONG>/**<BR> * <p>Title: qx例子练?lt;/p><BR> *<BR> * <p>Description: qx例子练?lt;/p><BR> *<BR> * <p>Copyright: Copyright (c) 2005</p><BR> *<BR> * <p>Company: 北京开元东方科技有限公司</p><BR> *<BR> * @author 樊徏?BR> * @version 1.0<BR> * 试javacd载初始化序<BR> */<BR>abstract class base<BR>{<BR>    public int age=getNumber(100);<BR>    static<BR>    {<BR>        System.out.println("base static block");<BR>    }<BR>    {<BR>        System.out.println("base nonstatic block");<BR>    }<BR>    static int sage=getNumber(50);<BR>    base()<BR>    {<BR>        System.out.println(age);<BR>        System.out.println("base start");<BR>        draw();//会调用子c覆盖后的方法,哪批怕写在游d中也会执行子c覆盖后的方?BR>        System.out.println("base end");</STRONG></P> <P><STRONG>    }<BR>    static int getNumber(int base)<BR>    {<BR>        System.out.println("base.getNumber int"+base);<BR>        return base;<BR>    }<BR>    public  void draw()<BR>    {<BR>        System.out.println("base.draw");<BR>    }<BR>}</STRONG></P> <P><STRONG>public class JavaBase extends base{<BR>    public int age=getNumber(1001);<BR>    private int _radius=getNumber(10);<BR>    static int sage=getNumber(250);<BR>    static<BR>    {<BR>        System.out.println("subclass static block");<BR>    }<BR>    {<BR>        System.out.println("subclass nonstatic block");<BR>    }<BR>    JavaBase(int radius)<BR>    {<BR>        _radius=radius;<BR>        System.out.println(age);<BR>        System.out.println("initializeOrder initialized");<BR>    }<BR>    public void draw()<BR>    {<BR>        System.out.println("initializeOrder.draw "+_radius);<BR>    }<BR>    /** *//**<BR>     * @param args<BR>     */<BR>    public static void main(String[] args) {<BR>        // TODO Auto-generated method stub<BR>        System.out.println("-------------cd始化开?------------");<BR>        new JavaBase(1000);<BR>        System.out.println("-------------cd始化l束-------------");<BR>    }<BR>}<BR><BR>执行l果:<BR><BR>base static block</STRONG></P> <P><STRONG>base.getNumber int50</STRONG></P> <P><STRONG>base.getNumber int250</STRONG></P> <P><STRONG>subclass static block</STRONG></P> <P><STRONG>-------------cd始化开?------------</STRONG></P> <P><STRONG>base.getNumber int100</STRONG></P> <P><STRONG>base nonstatic block</STRONG></P> <P><STRONG>initializeOrder.draw 0</STRONG></P> <P><STRONG>100</STRONG></P> <P><STRONG>base start</STRONG></P> <P><STRONG>base end</STRONG></P> <P><STRONG>base.getNumber int1001</STRONG></P> <P><STRONG>base.getNumber int10</STRONG></P> <P><STRONG>subclass nonstatic block</STRONG></P> <P><STRONG>1001</STRONG></P> <P><STRONG>initializeOrder initialized</STRONG></P> <P><STRONG>-------------cd始化l束-------------<BR>更正:static</STRONG>静态成员变量和静态初始化是在new对象之前q行?<BR><BR>后待d更正***************************************************************<BR><BR>Static详解:<BR><BR> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD vAlign=top width=413> 一、static <P>  请先看下面这D늨序:</P> <P>  public class Hello{<BR>    public static void main(String[] args){ //(1)<BR>      System.out.println("Hello,world!");   //(2)<BR>    }<BR>  }</P> <P>  看过q段E序Q对于大多数学过Java 的从来说Q都不陌生。即使没有学qJavaQ而学q其它的高语言Q例如CQ那你也应该能看懂这D代码的意思。它只是单的输出“Hello,world”,一点别的用处都没有Q然而,它却展示了static关键字的主要用法?/P><BR> <P></P></TD></TR> <TR> <TD colSpan=2 height=20> <P><BR></P></TD></TR></TBODY></TABLE></P> <P>  ?处,我们定义了一个静态的Ҏ名ؓmainQ这意味着告诉Java~译器,我这个方法不需要创Z个此cȝ对象卛_使用。你q记得你是怎么q行q个E序吗?一般,我们都是在命令行下,打入如下的命令:</P> <P>javac Hello.java<BR>java Hello<BR>Hello,world!</P> <P>  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会有这样一行:</P> <P>public void println(String x)?/P> <P>  好了Q现在你应该明白Z么我们要那样调用了,out是System的一个静态变量,所以可以直接用,而out所属的cL一个printlnҎ?/P> <P><STRONG>静态方?/STRONG></P> <P>  通常Q在一个类中定义一个方法ؓstaticQ那是_用类名而无需本类的对象即可调用此Ҏ。如下所C:</P> <P>class Simple{<BR>   static void go(){<BR>     System.out.println("Go...");<BR>   }<BR>}<BR>public class Cal{<BR>  public static void main(String[] args){<BR>    Simple.go();<BR>  }<BR>}</P> <P>  调用一个静态方法就是“类?Ҏ名?静态方法的使用很简单如上所C。一般来_静态方法常ؓ应用E序中的其它cL供一些实用工h用,在Java的类库中大量的静态方法正是出于此目的而定义的?/P> <P><STRONG>静态变?/STRONG></P> <P>  静态变量与静态方法类伹{所有此cd例共享此静态变量,也就是说在类装蝲Ӟ只分配一块存储空_所有此cȝ对象都可以操控此块存储空_当然对于final则另当别Z。看下面q段代码Q?/P> <P>class Value{<BR>  static int c=0;<BR>  static void inc(){<BR>    c++;<BR>  }<BR>}<BR>class Count{<BR>  public static void prt(String s){<BR>    System.out.println(s);<BR>  }<BR>  public static void main(String[] args){<BR>    Value v1,v2;<BR>    v1=new Value();<BR>    v2=new Value();<BR>    prt("v1.c="+v1.c+"  v2.c="+v2.c);<BR>    v1.inc();<BR>    prt("v1.c="+v1.c+"  v2.c="+v2.c);  <BR>  }<BR>}</P> <P>  l果如下Q?/P> <P>v1.c=0  v2.c=0<BR>v1.c=1  v2.c=1</P> <P>由此可以证明它们׃n一块存储区。static变量有点cM于C中的全局变量的概c值得探讨的是静态变量的初始化问题。我们修改上面的E序Q?/P> <P>class Value{<BR>  static int c=0;<BR>  Value(){<BR>    c=15;<BR>  }<BR>  Value(int i){<BR>    c=i;<BR>  }<BR>  static void inc(){<BR>    c++;<BR>  }<BR>}<BR>class Count{<BR>  public static void prt(String s){<BR>    System.out.println(s);<BR>  }<BR>    Value v=new Value(10);<BR>    static Value v1,v2;<BR>    static{<BR>      prt("v1.c="+v1.c+"  v2.c="+v2.c);<BR>      v1=new Value(27);<BR>      prt("v1.c="+v1.c+"  v2.c="+v2.c);<BR>      v2=new Value(15);<BR>      prt("v1.c="+v1.c+"  v2.c="+v2.c);<BR>    }</P> <P>  public static void main(String[] args){<BR>    Count ct=new Count();<BR>    prt("ct.c="+ct.v.c);<BR>    prt("v1.c="+v1.c+"  v2.c="+v2.c);<BR>    v1.inc();<BR>    prt("v1.c="+v1.c+"  v2.c="+v2.c);<BR>    prt("ct.c="+ct.v.c);<BR>  }<BR>}</P> <P>q行l果如下Q?/P> <P>v1.c=0  v2.c=0<BR>v1.c=27  v2.c=27<BR>v1.c=15  v2.c=15<BR>ct.c=10<BR>v1.c=10  v2.c=10<BR>v1.c=11  v2.c=11<BR>ct.c=11</P> <P>  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> <P>  通常一个普通类不允许声明ؓ静态的Q只有一个内部类才可以。这时这个声明ؓ静态的内部cd以直接作Z个普通类来用,而不需实例一个外部类。如下代码所C:</P> <P>public class StaticCls{<BR>  public static void main(String[] args){<BR>    OuterCls.InnerCls oi=new OuterCls.InnerCls();<BR>  }<BR>}<BR>class OuterCls{<BR>  public static class InnerCls{<BR>    InnerCls(){<BR>      System.out.println("InnerCls");<BR>    }<BR>   }<BR>}</P> <P>  输出l果会如你所料:</P> <P>InnerCls</P><img src ="http://www.aygfsteel.com/fjq639/aggbug/24904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fjq639/" target="_blank">黑石</a> 2005-12-21 09:12 <a href="http://www.aygfsteel.com/fjq639/archive/2005/12/21/24904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">鱦</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">º</a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">Ĭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̫</a>| <a href="http://" target="_blank">ͷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͨμ</a>| <a href="http://" target="_blank">˼é</a>| <a href="http://" target="_blank">Ӻ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ױ</a>| <a href="http://" target="_blank">ζ</a>| <a href="http://" target="_blank">人</a>| <a href="http://" target="_blank">Ǩ</a>| <a href="http://" target="_blank">Ұ</a>| <a href="http://" target="_blank">Ӣɳ</a>| <a href="http://" target="_blank">ֶ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">º</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">׳</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>