??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲日韩欧洲乱码AV夜夜摸,亚洲一级高清在线中文字幕,亚洲一级片在线播放http://m.tkk7.com/jackybu/category/447.html<a ><b><font color=red>共有<script src=http://fastonlineusers.com/online.php?d=jackybu.blogjava.net></script>人在同时阅读此Blog</font></b></a>zh-cnFri, 02 Mar 2007 03:08:06 GMTFri, 02 Mar 2007 03:08:06 GMT60Serializable java序列?/title><link>http://m.tkk7.com/jackybu/articles/15821.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Tue, 18 Oct 2005 07:07:00 GMT</pubDate><guid>http://m.tkk7.com/jackybu/articles/15821.html</guid><wfw:comment>http://m.tkk7.com/jackybu/comments/15821.html</wfw:comment><comments>http://m.tkk7.com/jackybu/articles/15821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jackybu/comments/commentRss/15821.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jackybu/services/trackbacks/15821.html</trackback:ping><description><![CDATA[1、实现Serializable回导致发布的API难以更改Qƈ且得package-private和private q两个本来封装的较好的咚咚也不能得到保障? 2、Serializable会ؓ每个cȝ成一个序列号Q生成依据是cd、类实现的接口名? public和protectedҎ(gu)Q所以只要你一不小心改了一个已lpublish的APIQƈ且没有自 己定义一个longcd的叫做serialVersionUID的fieldQ哪怕只是添加一个getXXQ就? 让你d来的序列化到文g中的东西M出来Q不知道Z么要把方法名进去?Q? 3、不用构造函数用Serializable可以构造对象,看v来不大合理,q被UCؓ extralinguistic mechanismQ所以当实现Serializable时应该注意维持构造函C所l? 持的那些不变状? 4、增加了发布新版本的cL的测试负? 5?.4版本后,JavaBeans的持久化采用ZXML的机Ӟ不再需要Serializable 6、设计用来被l承的类Ӟ量不实现SerializableQ用来被l承的interface也不? l承Serializable。但是如果父cM实现Serializable接口Q子cd隑֮现它Q特别是 对于父类没有可以讉K的不含参数的构造函数的时候。所以,一旦你军_不实? Serializable接口q且c被用来l承的时候记得提供一个无参数的构造函? 7、内部类q是不要实现Serializable好了Q除非是static的,(偶也觉得内部cM适合 用来q这cL? 8、用一个自定义的序列化Ҏ(gu) 看看下面q个保存一个双向链表的例子Qpublic class StringList implements Serializable{?private int size = 0;?private Entry head = null;??private static class Entry implements Serializable?{? String data;? Entry next;? Entry previous;?}?...//Remainder ommitted} q样会导致链表的每个元素以及元素之间的关p(双向链表之间的连接)都保存下来,更好的方法是提供一个自定义的序列化如下Q? //String List with a resonable custom serialized formclass StringList implements Serializable{? private transient int size = 0;?????? //!transient? private transient Entry head = null;? //!transient? ? //no longer serializable!? private static class Entry? {??? String data;??? Entry next;??? Entry previous;? }? ? //Appends the specified string to the list? public void add(String s) {/*...*/};? ? /**?? * Serialize this StringList instance ?? * @author yuchifang?? * @serialData The size of the list (the number of strings * it contains) is emitted(int), in the proper sequence?? */? private void writeObject(ObjectOutputStream s) throws IOException? {??? s.defaultWriteObject();??? s.writeInt(size);??? //Write out all elements in the proper order??? for (Entry e = head; e != null; e = e.next)????? s.writeObject(e.data);? }? ? private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException? {??? int numElements = s.readInt();??? ??? //Read in all elements andd insert them in list??? for (int i = 0; i < numElements; i++)????? add((String)s.readObject());? }? //...remainder omitted} 9、不你选择什么序列化形式Q声明一个显式的UIDQ? private static final long serialVersionUID = randomLongValue; 10、不需要序列化的东西用transient注掉它吧Q别什么都留着 11、writeObject/readObject重蝲以完成更好的序列? readResolve ?writeReplace重蝲以完成更好的l护invariant controllers<img src ="http://m.tkk7.com/jackybu/aggbug/15821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jackybu/" target="_blank">?/a> 2005-10-18 15:07 <a href="http://m.tkk7.com/jackybu/articles/15821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>保留字synchronized的作?/title><link>http://m.tkk7.com/jackybu/articles/9783.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Thu, 11 Aug 2005 03:07:00 GMT</pubDate><guid>http://m.tkk7.com/jackybu/articles/9783.html</guid><wfw:comment>http://m.tkk7.com/jackybu/comments/9783.html</wfw:comment><comments>http://m.tkk7.com/jackybu/articles/9783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jackybu/comments/commentRss/9783.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jackybu/services/trackbacks/9783.html</trackback:ping><description><![CDATA[Synchronized是用来保证同一时刻本段代码不会同时q行。在操作pȝ中这些代码被认ؓ是界段Q如讉K打印机,盘Q信号量{,只可能有一D代码在使用q些临界资源。其他必ȝ待。这c问题在多cpu多线E的时候尤注意?BR>Synchronized method(){}是用来保证同一时刻某方法不会被多个U程同时执行,以免冲突.<BR>Synchronized (object){}是用来保证在执行大括号中代码?独占objectq个对象,所?<BR>如果当执行到q里?如果object正被其他同步Ҏ(gu)调用,则必ȝ候object被解?才能q入该程序块,而当q入该程序块?对object上锁,执行完以后解?以免在此期间,其他E序用到object.<BR>当某个方法被同步化,则内部的属性也被同步化。获得monitor的进E独占这些资源直到解锁。这样做保证某些变量被各个线E共享,q且变化是一致的<BR><img src ="http://m.tkk7.com/jackybu/aggbug/9783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jackybu/" target="_blank">?/a> 2005-08-11 11:07 <a href="http://m.tkk7.com/jackybu/articles/9783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重蝲QOverloadingQ,重置QOverridingQ?重构QRefactoringQ?http://m.tkk7.com/jackybu/articles/7531.html?/dc:creator>?/author>Tue, 12 Jul 2005 02:17:00 GMThttp://m.tkk7.com/jackybu/articles/7531.htmlhttp://m.tkk7.com/jackybu/comments/7531.htmlhttp://m.tkk7.com/jackybu/articles/7531.html#Feedback0http://m.tkk7.com/jackybu/comments/commentRss/7531.htmlhttp://m.tkk7.com/jackybu/services/trackbacks/7531.html重蝲和重|都是面向对象多态性的体现。重载是指一个方法可以有呈现出多UŞ态。多UŞ态是通过同名的方法可以有不同的参数类型顺序或者不同参C数实现的。重|则是子cd从基cȝ承的Ҏ(gu)的重写,也叫覆盖吧。这很容易理解,因ؓ即基类和子cdcMQ基cȝҎ(gu)肯定有不适合子类的地方,q时候子cd需要对基类的方法重|。重|时Ҏ(gu)参数的类型、数量和ơ序一定要和基cȝҎ(gu)一_否则成了重载?/P>

    重构一般有软g重构和代码重构。Y仉构是指在不改变Y件的功能和外部可见性的前提下,对Y件进行改造,其目的是Z改善软g的结构,提高清晰性、可扩展性和可重用性。代码重构就是在不改变代码外部情늚Ҏ(gu)代码的修攏V重构是代码l护中很重要Q但不增加新的行为。重构用于提高代码的可读性和改变代码的结构和设计Q这样在来更容易维护。如果在现有l构下给一个构件或者增加一个新的行为很困难或者根本不可能Q这时候就需要重构这个构件或者类Q其目的是ؓ了增加新行ؓ更容易?/P>

]]>
Java中对文g的操?/title><link>http://m.tkk7.com/jackybu/articles/2510.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Mon, 28 Mar 2005 01:55:00 GMT</pubDate><guid>http://m.tkk7.com/jackybu/articles/2510.html</guid><wfw:comment>http://m.tkk7.com/jackybu/comments/2510.html</wfw:comment><comments>http://m.tkk7.com/jackybu/articles/2510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jackybu/comments/commentRss/2510.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jackybu/services/trackbacks/2510.html</trackback:ping><description><![CDATA[<STRONG><FONT face=宋体> java中提供了iocdQ可以轻杄用java实现Ҏ(gu)件的各种操作。下面就来说一下如何用java来实现这些操作?/FONT></STRONG> <P align=left><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"><STRONG>   1。新建目?/STRONG></SPAN></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"></SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"><%@ page contentType="text/html;charset=gb2312"%><BR><%<BR>String filePath="c:/aaa/";<BR>filePath=filePath.toString();//中文转换<BR>java.io.File myFilePath=new java.io.File(filePath);<BR>if(!myFilePath.exists())<BR>myFilePath.mkdir();<BR>%></SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">  2。新建文?/SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"><%@ page contentType="text/html;charset=gb2312"%><BR><%@ page import="java.io.*" %><BR><%<BR>String filePath="c:/哈哈.txt";<BR>filePath=filePath.toString();<BR>File myFilePath=new File(filePath);<BR>if(!myFilePath.exists())<BR>myFilePath.createNewFile();<BR>FileWriter resultFile=new FileWriter(myFilePath);<BR>PrintWriter myFile=new PrintWriter(resultFile);<BR>String strContent = "中文试".toString();<BR>myFile.println(strContent);<BR>resultFile.close();<BR>%></SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 3。删除文?/SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"><%@ page contentType="text/html;charset=gb2312"%><BR><%<BR>String filePath="c:/支出证明?xls";<BR>filePath=filePath.toString();<BR>java.io.File myDelFile=new java.io.File(filePath);<BR>myDelFile.delete();<BR>%></SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 4。文件拷?/SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"><%@ page contentType="text/html; charset=gb2312" %><BR><%@ page import="java.io.*" %><BR><%<BR>int bytesum=0;<BR>int byteread=0; <BR><U><FONT color=#0000ff><A href="file://?">file://?/A></FONT></U>到流?BR>InputStream inStream=new FileInputStream("c:/aaa.doc");<BR>FileOutputStream fs=new FileOutputStream( "d:/aaa.doc");</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">byte[]  buffer =new  byte[1444];<BR>int length;<BR>while ((byteread=inStream.read(buffer))!=-1)<BR> {<BR>   out.println("<DT><B>"+byteread+"</B></DT>");<BR>   bytesum+=byteread;<BR>   System.out.println(bytesum);<BR>   fs.write(buffer,0,byteread);<BR> } <BR>inStream.close(); <BR>%></SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 5。整个文件夹拯</SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"><%@ page contentType="text/html;charset=gb2312"%><BR><%@ page import="java.io.*" %><BR><%String url1="C:/aaa";<BR>  String url2="d:/java/";<BR>  (new File(url2)).mkdirs();<BR> File[] file=(new File(url1)).listFiles();<BR> for(int i=0;i<file.length;i++){<BR>  if(file[i].isFile()){<BR>   file[i].toString();<BR>   FileInputStream input=new FileInputStream(file[i]);<BR>   FileOutputStream output=new FileOutputStream(url2+"/"+(file[i].getName()).toString());<BR>   byte[] b=new byte[1024*5];<BR>    int len;<BR>    while((len=input.read(b))!=-1){<BR>    output.write(b,0,len);<BR>    }<BR>    output.flush();<BR>    output.close();<BR>    input.close();<BR>  }<BR> }<BR>%> </SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 6。文件下?/SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"><%@ page contentType="text/html; charset=gb2312" %><BR><%@ page import="java.io.*" %><BR><%<BR>  String fileName = "zsc104.swf".toString();<BR><A href="file://?">//?/A>到流?BR>InputStream inStream=new FileInputStream("c:/zsc104.swf");<BR><A href="file://?">//?/A>|输出的格式 <BR>  response.reset(); <BR>  response.setContentType("bin");<BR>  response.addHeader("Content-Disposition","attachment; filename=\"" + fileName + "\"");<BR><A href="file://?">//?/A>环取出流中的数据 <BR>  byte[] b = new byte[100]; <BR>  int len; <BR>  while((len=inStream.read(b)) >0) <BR>  response.getOutputStream().write(b,0,len);  <BR>  inStream.close(); <BR>%></SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 7。数据库字段中的文g下蝲</SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"><%@ page contentType="text/html; charset=gb2312" %><BR><%@ page import="java.sql.*"%><BR><%@ page import="java.lang.*" %><BR><%@ page import="java.io.*" %><BR><%@ page import="com.jspsmart.upload.*" %><BR><%@ page import="DBstep.iDBManager2000.*"%><BR><%<BR>int bytesum=0;<BR>int byteread=0;<BR><A href="file://?">//?/A>开数据?BR>ResultSet result=null;<BR>String Sql=null;<BR>PreparedStatement prestmt=null; <BR>DBstep.iDBManager2000 DbaObj=new DBstep.iDBManager2000();<BR>DbaObj.OpenConnection();<BR><A href="file://?">//?/A>得数据库中的数据<BR>Sql="select  *  from  t_local_zhongzhuan ";<BR>result=DbaObj.ExecuteQuery(Sql);<BR>result.next();</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"></SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"><A href="file://?">file://?/A>数据库中的数据读到流?<BR>InputStream inStream=result.getBinaryStream("content"); <BR>FileOutputStream fs=new FileOutputStream( "c:/dffdsafd.doc");</SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"></SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">byte[]  buffer =new  byte[1444];<BR>int length;<BR>while ((byteread=inStream.read(buffer))!=-1)<BR>  {<BR>     out.println("<DT><B>"+byteread+"</B></DT>");<BR>     bytesum+=byteread;<BR>     System.out.println(bytesum);<BR>     fs.write(buffer,0,byteread);<BR>     }<BR>%></SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 8。把|页保存成文?/SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"><%@ page import="java.text.*"%><BR><%@ page import="java.util.*"%><BR><%@ page import="java.io.*"%><BR><%@ page import="java.net.*"%><BR><%<BR> URL stdURL = null;<BR> BufferedReader stdIn = null;<BR> PrintWriter stdOut = null;<BR> try {<BR>  stdURL = new URL("http://www.163.com");<BR> }<BR> catch (MalformedURLException e) {<BR>   throw e;<BR> }</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"></SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">try {<BR>   stdIn = new BufferedReader(new InputStreamReader(stdURL.openStream()));<BR>   stdOut = new PrintWriter(new BufferedWriter(new FileWriter("c:/163.html")));<BR> }<BR> catch (IOException e) {<BR> }</SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> /***把URL指定的页面以的形式dQ写成指定的文g***/<BR> try {<BR>   String strHtml = "";<BR>   while((strHtml = stdIn.readLine())!=null) {<BR>   stdOut.println(strHtml);<BR>   }<BR> }<BR> catch (IOException e) {<BR>   throw e;<BR> }<BR> finally {<BR>   try {<BR>     if(stdIn != null)<BR>       stdIn.close();<BR>     if(stdOut != null)<BR>       stdOut.close();<BR>   }<BR>   catch (Exception e) {<BR>     System.out.println(e);<BR>   }<BR> }<BR>%></SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"> 9。直接下载网上的文g</SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"><%@ page import="java.io.*"%><BR><%@ page import="java.net.*"%><BR><%<BR>int bytesum=0;<BR>int byteread=0;</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'"></SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">URL url = new URL("http://pimg.163.com/sms/micheal/logo.gif");<BR> URLConnection conn = url.openConnection();<BR> InputStream inStream = conn.getInputStream();<BR> FileOutputStream fs=new FileOutputStream( "c:/abc.gif");</SPAN></STRONG></P> <P align=left><STRONG><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'">  byte[]  buffer =new  byte[1444];<BR>   int length;<BR>    while ((byteread=inStream.read(buffer))!=-1)<BR>    {<BR>       out.println("<DT><B>"+byteread+"</B></DT>");<BR>       bytesum+=byteread;<BR>       System.out.println(bytesum);<BR>       fs.write(buffer,0,byteread);<BR>     }<BR>%><BR><BR></P> <P align=left><FONT face=仿宋_GB2312 size=4>10。按行读文g<BR><%@ page contentType="text/html; charset=gb2312" %><BR><%@ page import="java.io.*" %><BR><%<BR>FileReader  myFileReader=new FileReader("c:/哈哈.txt");<BR>BufferedReader myBufferedReader=new BufferedReader(myFileReader);<BR>String myString=null;<BR>String resultString=new String();<BR>while((myString=myBufferedReader.readLine())!=null)<BR>  {  resultString=resultString+myString+"<br>"; <BR>   }<BR>out.println(resultString); <BR>myFileReader.close();<BR>%> </FONT></P> <P align=left><FONT face=仿宋_GB2312 size=4>11?数据库里字段文g直接下蝲到客L<BR><%@ page import="java.sql.*"%><BR><%@ page import="java.lang.*" %><BR><%@ page import="java.io.*" %><BR><%@ page import="com.jspsmart.upload.*" %><BR><%@ page import="DBstep.iDBManager2000.*"%><BR><%<BR>  String fileName = "bb.doc".toString();<BR>  //打开数据?BR>  ResultSet result=null;<BR>  String Sql=null;<BR>  PreparedStatement prestmt=null; <BR>  DBstep.iDBManager2000 DbaObj=new DBstep.iDBManager2000();<BR>  DbaObj.OpenConnection();<BR>//取得数据库中的数?BR>Sql="select  *  from  marklist order by markdate desc";<BR>result=DbaObj.ExecuteQuery(Sql);<BR>result.next();<BR>//数据库中的数据d中<BR>  InputStream in =result.getBinaryStream("markbody"); <BR>//讄输出的格?<BR>  response.reset(); <BR>  response.setContentType("application/Msword");<BR>  response.addHeader("Content-Disposition","attachment; filename=\"" + fileName + "\"");<BR>//循环取出中的数?<BR>  byte[] b = new byte[1024]; <BR>  int len; <BR>  while((len=in.read(b)) >0)<BR>  response.getOutputStream().write(b,0,len);<BR>  in.close(); <BR>%><BR></P> <DD>12。文件夹遍历<BR><%@ page contentType="text/html; charset=gb2312" %><BR><%@ page import="java.io.*" %><BR><%<BR>String url1="C:/aaa";<BR>File  f=(new File(url1));<BR>if(f.isDirectory()){<BR>       File [] fe = f.listFiles();<BR>       go_on:<BR>      for (int i = 0;i<fe.length;i++){<BR>      if (fe[i].isDirectory()){                           <BR>    File [] fe1 = fe[i].listFiles();<BR>    for (int j = 0;j<fe1.length;j++){<BR>    if (fe1[j].isDirectory())<BR>    continue go_on;<BR>    out.println(fe1[j].toString());<BR>            }<BR>        }                            <BR>     else out.println(fe[i].toString());            <BR>    }<BR>  }<BR>                           <BR>%> <DD>13。通过字符~码Ud文g <DD><%@ page contentType="text/html; charset=gb2312" %><BR><%@ page import="java.io.*" %><BR><%<BR>String ret=new String();<BR>try<BR>{<BR>  byte[] bytes=new byte[102400];<BR>  InputStream in=new FileInputStream("c:/aaa.doc");<BR>  in.read(bytes);<BR>  ret=new sun.misc.BASE64Encoder().encode(bytes); //具体的编码方?BR>  in.close();<BR>}<BR>catch(FileNotFoundException e)<BR>{<BR>  e.printStackTrace();<BR>}<BR>catch(java.io.IOException ex)<BR>{<BR>  ex.printStackTrace();<BR>}<BR>out.println(ret);<BR><BR>byte[] bytes = new sun.misc.BASE64Decoder().decodeBuffer(ret);    <BR>java.io.ByteArrayInputStream  inStream=new java.io.ByteArrayInputStream(bytes);<BR>byte[]  buffer =new  byte[1444];<BR>FileOutputStream fs=new FileOutputStream( "d:/aaa.doc");<BR>int bytesum=0;<BR>int byteread=0;         <BR>while ((byteread=inStream.read(buffer))!=-1)<BR>  {     <BR>     bytesum+=byteread; <BR>     fs.write(buffer,0,byteread);<BR>     }    <BR>%> <P>14。把文g~码成base64字符?BR><%<BR>     String ret=new String();<BR>      byte[] bytes=new byte[1024];<BR>     String aa="aaaa";<BR>     bytes=aa.getBytes();<BR>     ret=new sun.misc.BASE64Encoder().encode(bytes); //具体的编码方?BR>  bytes = new sun.misc.BASE64Decoder().decodeBuffer(ret);    <BR>  aa=new String(bytes);<BR>  out.println(aa);<BR>%> </P></FONT></DD></SPAN></STRONG><img src ="http://m.tkk7.com/jackybu/aggbug/2510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jackybu/" target="_blank">?/a> 2005-03-28 09:55 <a href="http://m.tkk7.com/jackybu/articles/2510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Javaa計模式]學習心得作者:板橋里hhttp://m.tkk7.com/jackybu/articles/2509.html?/dc:creator>?/author>Mon, 28 Mar 2005 01:52:00 GMThttp://m.tkk7.com/jackybu/articles/2509.htmlhttp://m.tkk7.com/jackybu/comments/2509.htmlhttp://m.tkk7.com/jackybu/articles/2509.html#Feedback0http://m.tkk7.com/jackybu/comments/commentRss/2509.htmlhttp://m.tkk7.com/jackybu/services/trackbacks/2509.html 整個設a模式貫I一個原?/SPAN>:面對介面R程Q而不是面實?/SPAN>Q?/SPAN>Q面向物件編E應該改爲面向介面編E)?/SPAN>目標原則?/SPAN>:降低耦合Q?/SPAN>增D靈活?/SPAN>?  

創徏模式

 

设计模式之Factory(工厂Ҏ(gu)和抽象工?

使用工厂模式p使用new一样频J?

     

a計模式?/FONT>Prototype(原型)
用原型實例指定創建物件的E類Q並且通過拯這些原型創徏新的物g?/FONT>

     

a計模式?/FONT>Builder
汽車p?/FONT> 方向?/FONT> 發動很多部件組成,同時Q將這些部gi裝成汽車也是一件複雜的工作Q?/FONT>Builder模式是這兩E情況分開進行?/FONT>

     

a計模式?/FONT>Singleton(單態)
保證一個類只有一個實?/FONT>,並提供一個訪問它的全局a問?/FONT>

   

i構模式

  a計模式?/FONT>Facade
可擴展的使用JDBC針對不同的資料nR程,Facade提供了一E靈zȝ實現?/FONT>       a計模式?/FONT>Proxy
?/FONT>Jive爲例,剖析代理模式在用戶級別授Ɗ機制上的應?/FONT>       a計模式?/FONT>Adapter
使用再生的兩個方?/FONT>:i合(new)和繼?/FONT>(extends),這個已E在"thinking in java"中提到過?/FONT>      

a計模式?/FONT>Composite
是類用樹形結構組合成一個單?/FONT>?/FONT>你向別h介紹你是某單位,你是單位元元中的一個元素,別h和你做買賣,相當於和單位做買賣。文章中還對Jive再進行了剖析?/FONT>

     

a計模式?/FONT>Decorator
Decorator
是個a漆工,i你的東q外表刷上麗的顔?/FONT>?/SPAN>

     

a計模式?/FONT>Bridge
?/FONT>"牛郎J女"分開(本應在一?/FONT>,分開他?/FONT>,形成兩個介?/FONT>),在他們之間搭Z個橋(動態的結?/FONT>)

     

a計模式?/FONT>Flyweight
提供Java運行性能,降低而大量重復的的開銷?/FONT>

   

行爲模式

 

a計模式?/FONT>Template
實際上向你介紹了爲什麽要使用Java 抽象?/FONT>,該模式原理簡?/FONT>,使用很普?/FONT>?/SPAN>

     

a計模式?/FONT>Memento
很簡單一個模?/FONT>,是在記憉中保留原來資料的拯?

     

a計模式?/FONT>Observer
介紹如何使用Java API提供的現?/FONT>Observer

     

a計模式?/FONT>Chain of Responsibility
各司其職的類串成一?/FONT>,好象擊鼓傌,當然如果自己能完?/FONT>,׃要推委下一?/FONT>?/SPAN>

     

a計模式?/FONT>Command
什麽是行爲封?/FONT>,Command是最好的說明?/SPAN>

     

a計模式?/FONT>State
狀態是R程中經常碰到的實例,狀態物件化,a立狀態變換器,便可在狀態中輕鬆切換?/SPAN>

     

a計模式?/FONT>Strategy
不同演算法各自封?/FONT>,用戶端可隨意挑選需要的演算?/FONT>?/SPAN>

     

a計模式?/FONT>Mediator
Mediator
很象十字路口的紅E燈,每個車輛只需和紅E燈交互可?/FONT>?/SPAN>

     

a計模式?/FONT>Interpreter
主要用來語a的分?/FONT>,應用會不多?/SPAN>

     

a計模式?/FONT>Visitor
a問者在進行a問?/FONT>,完成一pd實質性操?/FONT>,而且還可以擴?/FONT>?/SPAN>

     

a計模式?/FONT>Iterator
這個模式已E被用來遍曆Collection中物?/FONT>?/SPAN>使用ȝ很高?/SPAN>?/FONT>Java中無需門闡述,在大多數場合也無需自己製造一?/FONT>Iterator,只要物件裝?/FONT>Collection中,我們就直接可以使用Iterator模式?/FONT>



]]>
JavacL员初始化序http://m.tkk7.com/jackybu/articles/1738.html?/dc:creator>?/author>Sat, 05 Mar 2005 10:38:00 GMThttp://m.tkk7.com/jackybu/articles/1738.htmlhttp://m.tkk7.com/jackybu/comments/1738.htmlhttp://m.tkk7.com/jackybu/articles/1738.html#Feedback0http://m.tkk7.com/jackybu/comments/commentRss/1738.htmlhttp://m.tkk7.com/jackybu/services/trackbacks/1738.html静态优先,具体序如下Q?BR>
1、static字段
2、statici初始化块
3、staticҎ(gu)
4、实例字D?BR>5、实例初始化?BR>6、构造方?BR>7、实例方?BR>

]]>
谈谈 Java ?this 的?/title><link>http://m.tkk7.com/jackybu/articles/1732.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Sat, 05 Mar 2005 10:16:00 GMT</pubDate><guid>http://m.tkk7.com/jackybu/articles/1732.html</guid><wfw:comment>http://m.tkk7.com/jackybu/comments/1732.html</wfw:comment><comments>http://m.tkk7.com/jackybu/articles/1732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jackybu/comments/commentRss/1732.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jackybu/services/trackbacks/1732.html</trackback:ping><description><![CDATA[1. this是指当前对象自己?<BR>当在一个类中要明确指出使用对象自己的的变量或函数时应该加上this引用。如下面q?BR>个例子中: <BR><BR>public class A { <BR><BR>String s = "Hello"; <BR><BR>public A(String s) { <BR>System.out.println("s = " + s); <BR>System.out.println("1 -> this.s = " + this.s); <BR>this.s = s; <BR>System.out.println("2 -> this.s = " + this.s); <BR>} <BR><BR>public static void main(String[] args) { <BR>new A("HelloWorld!"); <BR>} <BR>} <BR><BR>q行l果Q?<BR><BR>s = HelloWorld! <BR>1 -> this.s = Hello <BR>2 -> this.s = HelloWorld! <BR><BR>在这个例子中Q构造函数A中,参数s与类A的变量s同名Q这时如果直接对sq行操作则是?BR>参数sq行操作。若要对cA的变量sq行操作应该用thisq行引用。运行结果的W一行就<BR>是直接对参数sq行打印l果Q后面两行分别是对对象A的变量sq行操作前后的打印结果?BR> <BR><BR>2. 把this作ؓ参数传?<BR>当你要把自己作ؓ参数传递给别的对象Ӟ也可以用this。如Q?<BR><BR>public class A { <BR>public A() { <BR>new B(this).print(); <BR>} <BR><BR>public void print() { <BR>System.out.println("Hello from A!"); <BR>} <BR>} <BR><BR>public class B { <BR>A a; <BR>public B(A a) { <BR>this.a = a; <BR>} <BR><BR>public void print() { <BR>a.print(); <BR>System.out.println("Hello from B!"); <BR>} <BR>} <BR><BR>q行l果Q?<BR>Hello from A! <BR>Hello from B! <BR><BR>在这个例子中Q对象A的构造函CQ用new B(this)把对象A自己作ؓ参数传递给了对象B<BR>的构造函数?<BR><BR>3. 注意匿名cd内部cM的中的this?<BR>有时候,我们会用C些内部类和匿名类。当在匿名类中用thisӞq个this则指的是?BR>名类或内部类本n。这时如果我们要使用外部cȝҎ(gu)和变量的话,则应该加上外部类?BR>cd。如下面q个例子Q?<BR><BR>public class A { <BR>int i = 1; <BR><BR>public A() { <BR>Thread thread = new Thread() { <BR>public void run() { <BR>for(;;) { <BR>A.this.run(); <BR>try { <BR>sleep(1000); <BR>} catch(InterruptedException ie) { <BR>} <BR>} <BR>} <BR>}; <BR>thread.start(); <BR>} <BR><BR>public void run() { <BR>System.out.println("i = " + i); <BR>i++; <BR>} <BR><BR>public static void main(String[] args) throws Exception { <BR>new A(); <BR>} <BR><BR>} <BR><BR>在上面这个例子中, thread 是一个匿名类对象Q在它的定义中,它的 run 函数里用C<BR>外部cȝ run 函数。这时由于函数同名,直接调用׃行了。这时有两种办法Q一U就?BR>把外部的 run 函数换一个名字,但这U办法对于一个开发到中途的应用来说是不可取的?BR>那么可以用q个例子中的办法用外部类的类名加?this 引用来说明要调用的是外部c?BR>的方?run<BR><img src ="http://m.tkk7.com/jackybu/aggbug/1732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jackybu/" target="_blank">?/a> 2005-03-05 18:16 <a href="http://m.tkk7.com/jackybu/articles/1732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的基问题Q三Q?http://m.tkk7.com/jackybu/articles/1727.html?/dc:creator>?/author>Sat, 05 Mar 2005 10:07:00 GMThttp://m.tkk7.com/jackybu/articles/1727.htmlhttp://m.tkk7.com/jackybu/comments/1727.htmlhttp://m.tkk7.com/jackybu/articles/1727.html#Feedback0http://m.tkk7.com/jackybu/comments/commentRss/1727.htmlhttp://m.tkk7.com/jackybu/services/trackbacks/1727.html我声明了什么!

String s = "Hello world!";

许多人都做过q样的事情,但是Q我们到底声明了什么?回答通常是:一个StringQ内?BR>是“Hello world!”。这hp的回答通常是概念不清的Ҏ(gu)。如果要准确的回{,一?BR>的h大概会回{错误?BR>q个语句声明的是一个指向对象的引用Q名为“s”,可以指向cd为String的Q何对象,
目前指向"Hello world!"q个Stringcd的对象。这是真正发生的事情。我们ƈ没有?BR>明一个String对象Q我们只是声明了一个只能指向String对象的引用变量。所以,如果?BR>刚才那句语句后面Q如果再q行一句:

String string = s;

我们是声明了另外一个只能指向String对象的引用,名ؓstringQƈ没有W二个对象?BR>Qstringq是指向原来那个对象Q也是Q和s指向同一个对象?BR>String s1 = "This is cool!"; // 生成一个字W串对象[OBJ_1]Q将其引用赋值给s1
String s2 = "This is cool!"; // 同L对象[OBJ_1]的引用赋值给s2
String s3 = new String("This is cool!"); // 新徏一个字W串对象[OBJ_2]Q其引用?BR>值给s3;
s1 = s2; // s2保存的[OBJ_1]的引用赋值给s1Q没有实际效?BR>s3 = "This is cool!"; // [OBJ_1]的引用赋值给s3Qs3原先引用的[OBJ_2]不再被引?BR>

q样的代码共有?个String实例Q有1对象可以被GC?BR>
问题2Q?=="和equalsҎ(gu)I竟有什么区别?

==操作W专门用来比较变量的值是否相{。比较好理解的一Ҏ(gu)Q?BR>int a=10;
int b=10;
则a==b是true?BR>但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b返回false?BR>
Ҏ(gu)前一帖说q,对象变量其实是一个引用,它们的值是指向对象所在的内存地址Q而不
是对象本w。a和b都用了new操作W,意味着在内存中生两个内容ؓ"foo"的字W串
Q既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址
的|所以?=="操作W,l果会是false。诚Ӟa和b所指的对象Q它们的内容都是"
foo"Q应该是“相{”,但是==操作Wƈ不涉及到对象内容的比较?BR>对象内容的比较,正是equalsҎ(gu)做的事?BR>
看一下Object对象的equalsҎ(gu)是如何实现的Q?BR>boolean equals(Object o){

return this==o;

}
Object对象默认使用?=操作W。所以如果你自创的类没有覆盖equalsҎ(gu)Q那你的cM
用equals和?=会得到同Ll果。同样也可以看出QObject的equalsҎ(gu)没有辑ֈeq
ualsҎ(gu)应该辑ֈ的目标:比较两个对象内容是否相等。因为答案应该由cȝ创徏者决?BR>Q所以Object把这个Q务留l了cȝ创徏者?BR>
看一下一个极端的c:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}

}
我覆盖了equalsҎ(gu)。这个实CD无论Monster实例内容如何Q它们之间的比较永远q?BR>回true?BR>
所以当你是用equalsҎ(gu)判断对象的内Ҏ(gu)否相{,请不要想当然。因为可能你认ؓ相等
Q而这个类的作者不q样认ؓQ而类的equalsҎ(gu)的实现是׃掌握的。如果你需要?BR>equalsҎ(gu)Q或者用Q何基于散列码的集合(HashSet,HashMap,HashTableQ,请察看一
?java doc以确认这个类的equals逻辑是如何实现的?BR>
问题3
String到底变了没有

没有。因为String被设计成不可?immutable)c,所以它的所有对象都是不可变对象。请
看下列代码:

String s = "Hello";
s = s + " world!";

s所指向的对象是否改变了呢?从本pdW一的l论很容易导个结论。我们来看看?BR>生了什么事情。在q段代码中,s原先指向一个String对象Q内Ҏ(gu)"Hello"Q然后我们对
sq行?操作Q那么s所指向的那个对象是否发生了改变呢?{案是没有。这Ӟs不指?BR>原来那个对象了,而指向了另一个String对象Q内容ؓ"Hello world!"Q原来那个对象还
存在于内存之中,只是sq个引用变量不再指向它了?BR>通过上面的说明,我们很容易导出另一个结论,如果l常对字W串q行各种各样的修改,
或者说Q不可预见的修改Q那么用String来代表字W串的话会引起很大的内存开销。因
为String对象建立之后不能再改变,所以对于每一个不同的字符Ԍ都需要一个String?BR>象来表示。这Ӟ应该考虑使用StringBuffer c,它允怿改,而不是每个不同的字符?BR>都要生成一个新的对象。ƈ且,q两U类的对象{换十分容易?BR>同时Q我们还可以知道Q如果要使用内容相同的字W串Q不必每ơ都new一个String。例?BR>我们要在构造器中对一个名叫s的String引用变量q行初始化,把它讄为初始|应当q?BR>样做Q?BR>public class Demo {
  private String s;
  ...
  public Demo {
    s = "Initial Value";
  }
  ...
}
而非
s = new String("Initial Value");
后者每ơ都会调用构造器Q生成新对象Q性能低下且内存开销大,q且没有意义Q因为St
ring对象不可改变Q所以对于内容相同的字符Ԍ只要一个String对象来表C就可以了?BR>也就_多次调用上面的构造器创徏多个对象Q他们的Stringcd属性s都指向同一个对?BR>?BR>上面的结Zq样一个事实:对于字符串常量,如果内容相同QJava认ؓ它们代表?BR>一个String对象。而用关键字new调用构造器QL会创Z个新的对象,无论内容是否?BR>同?BR>至于Z么要把Stringc设计成不可变类Q是它的用途决定的。其实不只StringQ很多Ja
va标准cd中的c都是不可变的。在开发一个系l的时候,我们有时候也需要设计不可变
c,来传递一l相关的|q也是面向对象思想的体现。不可变cL一些优点,比如因ؓ
它的对象是只ȝQ所以多U程q发讉K也不会有M问题。当然也有一些缺点,比如?BR>个不同的状态都要一个对象来代表Q可能会造成性能上的问题。所以Java标准cdq提?BR>了一个可变版本,?StringBuffer?BR>
问题4Qfinal关键字到底修C什么?
final使得被修饰的变量"不变"Q但是由于对象型变量的本质是“引用”,使得“不变”也
有了两种含义Q引用本w的不变Q和引用指向的对象不变?BR>
引用本n的不变:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//~译期错?BR>
引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //~译通过

可见Qfinal只对引用的“值?也即它所指向的那个对象的内存地址)有效Q它q引用?BR>能指向初始指向的那个对象Q改变它的指向会D~译期错误。至于它所指向的对象的?BR>化,final是不负责的。这很类?=操作W:==操作W只负责引用的“值”相{,至于q个
地址所指向的对象内Ҏ(gu)否相{, ==操作W是不管的?BR>
理解final问题有很重要的含义。许多程序漏z都Z?---final只能保证引用永远指向
固定对象Q不能保证那个对象的状态不变。在多线E的操作?一个对象会被多个线E共?BR>或修改,一个线E对对象无意识的修改可能会导致另一个用此对象的线E崩溃。一个错
误的解决Ҏ(gu)是在此对象新徏的时候把它声明ؓfinalQ意图得它“永q不变”。其?BR>那是徒劳的?BR>
问题5
到底要怎么样初始化Q?BR>
本问题讨论变量的初始化,所以先来看一下Java中有哪些U类的变量?BR>1. cȝ属性,或者叫值域
2. Ҏ(gu)里的局部变?BR>3. Ҏ(gu)的参?BR>
对于W一U变量,Java虚拟Z自动q行初始化。如果给Z初始|则初始化初始
倹{如果没有给出,则把它初始化cd变量的默认初始倹{?BR>
intcd变量默认初始gؓ0
floatcd变量默认初始gؓ0.0f
doublecd变量默认初始gؓ0.0
booleancd变量默认初始gؓfalse
charcd变量默认初始gؓ0(ASCII?
longcd变量默认初始gؓ0
bytecd变量默认初始gؓ0
shortcd变量默认初始gؓ0
所有对象引用类型变量默认初始gؓnullQ即不指向Q何对象。注意数l本w也是对象,
所以没有初始化的数l引用在自动初始化后其g是null?BR>
对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance
属性在创徏实例的时候初始化Q?static属性在cd载,也就是第一ơ用到这个类的时候初
始化Q对于后来的实例的创建,不再ơ进行初始化。这个问题会在以后的pd中进行详l?BR>讨论?BR>
对于W二U变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,~译?BR>会抗议。如果初始化的语句在try块中或if块中Q也必须要让它在W一ơ用前一定能够得
到赋倹{也是_把初始化语句攑֜只有if块的条g判断语句中编译器也会抗议Q因?BR>执行的时候可能不W合if后面的判断条Ӟ如此一来初始化语句׃会被执行了,q就q?BR>反了局部变量用前必须初始化的规定。但如果在else块中也有初始化语句,可以通过
~译Q因为无论如何,L臛_一条初始化语句会被执行Q不会发生用前未被初始化的
事情。对于try-catch也是一P如果只有在try块里才有初始化语句,~译部通过。如?BR>在catch或finally里也有,则可以通过~译。MQ要保证局部变量在使用之前一定被?BR>始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要Z化成
什么值好Q就用上面的默认值吧Q?BR>
其实W三U变量和W二U本质上是一LQ都是方法中的局部变量。只不过作ؓ参数Q肯
定是被初始化q的Q传入的值就是初始|所以不需要初始化?BR>
问题6
instanceof是什么东东?

instanceof是Java的一个二元操作符Q和==Q?gt;Q?lt;是同一cM东。由于它是由字母l成?BR>Q所以也是Java的保留关键字。它的作用是试它左边的对象是否是它双的类的实例,
q回booleancd的数据。D个例子:

String s = "I AM an Object!";
boolean isObject = s instanceof Object;

我们声明了一个String对象引用Q指向一个String对象Q然后用instancof来测试它所指向
的对象是否是Objectcȝ一个实例,昄Q这是真的,所以返回trueQ也是isObject?BR>gؓTrue?BR>instanceof有一些用处。比如我们写了一个处理̎单的pȝQ其中有q样三个c:

public class Bill {//省略l节}
public class PhoneBill extends Bill {//省略l节}
public class GasBill extends Bill {//省略l节}

在处理程序里有一个方法,接受一个Billcd的对象,计算金额。假设两U̎单计方?BR>不同Q而传入的Bill对象可能是两U中的Q何一U,所以要用instanceof来判断:

public double calculate(Bill bill) {
  if (bill instanceof PhoneBill) {
    //计算?sh)话账?BR>  }
  if (bill instanceof GasBill) {
    //计算燃气账单
  }
  ...
}
q样可以用一个方法处理两U子cR?BR>
然而,q种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求?BR>Ҏ(gu)重蝲完全可以实现Q这是面向对象变成应有的做法Q避免回到结构化~程模式。只?BR>提供两个名字和返回值都相同Q接受参数类型不同的Ҏ(gu)可以了Q?BR>
public double calculate(PhoneBill bill) {
  //计算?sh)话账?BR>}

public double calculate(GasBill bill) {
  //计算燃气账单
}

所以,使用instanceof在绝大多数情况下q不是推荐的做法Q应当好好利用多态?BR>
参考:http://community.csdn.net/Expert/topic/3364/3364544.xml?temp=8.037966E-0
2


]]>
Java的基问题Q四Q?/title><link>http://m.tkk7.com/jackybu/articles/1728.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Sat, 05 Mar 2005 10:07:00 GMT</pubDate><guid>http://m.tkk7.com/jackybu/articles/1728.html</guid><wfw:comment>http://m.tkk7.com/jackybu/comments/1728.html</wfw:comment><comments>http://m.tkk7.com/jackybu/articles/1728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jackybu/comments/commentRss/1728.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jackybu/services/trackbacks/1728.html</trackback:ping><description><![CDATA[Q?StringcdStringBufferc?<BR><BR>它们都是处理字符串的c?但是它们有一个最大的区别,那就?String对象是存储你不能?BR>动的文本字符 <BR>?相反,如果你希望改?则应使用StringBuffercM为替? <BR>eg1: <BR>...... <BR>//omit some code <BR>String s1="You are hired!"; <BR>System.out.println(s1.replace(′h?′f?);//用f把字串中的h替换?<BR>System.out.println(s1); <BR>...... <BR>//omit some code <BR>q行l果: <BR>You are fired! <BR>You are hired! <BR>l果分析: <BR>从结?明显可知,s1的值ƈ没有被改?而第一行结果只是屏q内容的替换. <BR>eg2: <BR>...... <BR>//omit some code <BR>StringBuffer s2=new StringBuffer("Hello from Java!"); <BR>s2.replace(6,10,"to"); <BR>System.out.println(s2); <BR>...... <BR>//omit some code <BR>q行l果: <BR>Hello to Java! <BR>l果分析: <BR>昄,s2的值已改变. <BR><BR>Q?位逻辑与条仉辑 <BR><BR>首先声明, Z与位逻辑更好区分开?我把通常所说的逻辑取了个别名叫做条仉辑. <BR><BR>它们都有各自的操作符,位逻辑操作W有:&(与运?,^(异或q算),|(或运?;条g逻辑?BR>作符?&&(q?<BR>?,||(或?. <BR>位逻辑q算通常是针对两个数而言,实行位操?而条仉辑q算是针对两个条件表辑ּ?BR>a,实行条g?<BR>?其实,位逻辑操作W一样可以实现条件操?但是此时有一个重要的区别:用位操作W时<BR>,不管操作W两边的 <BR>条g表达式成不成?它都要通通进行运判?而条仉辑操作W不一样了,如果通过左侧<BR>的操作数可以进 <BR>行它们需要的判断,那么它就不会再计右侧的操作C,q种情况叫短?废话说!且看<BR>下例. <BR>eg1: <BR>...... <BR>//omit some code <BR>double value=0; <BR>if(value!=0 && 1/value<1000){ <BR>System.out.println("The value is not too small."); <BR>} <BR>else{ <BR>System.out.println("The value is too small."); <BR>} <BR>...... <BR>//omit some code <BR>q行l果: <BR>The value is too small. <BR>l果分析: <BR>照理说应会出现除Cؓ0的错?但是我刚才说?׃条g逻辑操作W是短\操作W?昄<BR>,value!=0?<BR>成立,立即可作出判断应执行else后的语句,所以它?yu)׃再会q算判断1/value<1000??BR>果不懂请再看一 <BR>? <BR>eg2: <BR>...... <BR>//omit some code <BR>double int1=0,int2=1,int3=1; <BR>if(int1!=0 & (int2=2)==1){} <BR>System.out.println("int2="+int2); <BR>if(int1!=0 && (int3=2)==1){} <BR>System.out.println("int3="+int3); <BR>...... <BR>//omit some code <BR>q行l果: <BR>int2=2.0 <BR>int3=1.0 <BR>l果分析: <BR>我想不用我分析了,你应该懂了吧. <BR><BR>Q?实例变量与类变量 <BR><BR>可以通过两种Ҏ(gu)在类中存储数据───作ؓ实例变量和类变量.实例变量是特定于对象?BR>,如果你有两个?<BR>?即一个类的两个实?,每一个对象中的实例变量独立于另一个对象中的实例变量的;?BR>一斚w,两个对象?<BR>cd量均指向相同的数?q因此面保存相同的?换句话说,cd量被cM的所有对象共?BR>.差点忘了,它们?<BR>形式上的区别,cd量在声明时比实例变量多一个static. <BR>eg: <BR>class data <BR>{ <BR>public int intdata=0;//昄,intdata在这儿是实例变量 <BR>} <BR>public class exam <BR>{ <BR>public static void main(String[] args) <BR>{ <BR>data a,b; <BR>a=new data(); <BR>b=new data(); <BR>a.intdata=1; <BR>System.out.println("b.indata="+b.intdata); <BR>} <BR>} <BR>q行l果: <BR>b.intdata=0 <BR>l果分析: <BR>可以看出,a.intdata的D然变?但ƈ没有影响b.intdata.但是如果在datacM声明int<BR>data?在其?<BR>面加上static变成类变量??public static int intdata=0;),则此时运行结果会?BR>? <BR>b.intdata=1 <BR>q次a.intdata值的改变可把b.intdata影响?事实?对象a和b的类变量均指向相同的?BR>?所有g <BR>?q就是类变量的作? <BR><BR>Q?实例Ҏ(gu),cL?构造器Ҏ(gu) <BR><BR>我们通常所说的Ҏ(gu)pL实例Ҏ(gu),像c语言中的函数一?其具体方法我׃用说??BR>q里我主要是 <BR>用它来区分类Ҏ(gu)和构造器Ҏ(gu).cL法与实例Ҏ(gu)最大的区别?在Ş式上cL法多一?BR>static,在用法上, <BR>不必创徏对象可直接调用cL?而实例方法却一定要先创建对?再通过对象调用). <BR><BR>eg: <BR>class add <BR>{ <BR>static int addem(int op1,int op2) <BR>{ <BR>return op1+op2; <BR>} <BR>} <BR>public class xxf <BR>{ <BR>public static void main(String[] args) <BR>{ <BR>System.out.println("addem(2,2)="+add.addem(2,2)); <BR>} //直接用类名作为对象调用类Ҏ(gu) <BR>} <BR><BR>? 也可按通常的方?卛_创徏对象,再调用方?不过,q时static无M意义? <BR><BR>再说说构造器Ҏ(gu),它是用来初始化对象中的数据的一U方?创徏很容?只需在类中加?BR>一个与q个c?<BR>同名的方?不需要在前面加Q何访问说明符或者返回类?另外,构造器也一样可以向Ҏ(gu)<BR>一样传递参? <BR>eg: <BR>class data <BR>{ <BR>private String data1;//事先声明 <BR><BR>data(String s) <BR>{ <BR>data1=s; /*通过接收数据来初始化变量.(?不能在构造器?<BR>声明变量,事先在外p声明.)*/ <BR>} <BR><BR>public String getdata() <BR>{ <BR>return data1; <BR>} <BR>} <BR><BR>public class xxf <BR>{ <BR>public static void main(String[] args) <BR>{ <BR>System.out.println((new data("I love you")).getdata());/*通过传递参数调用构造器<BR>新徏一 <BR>个对?再通过对象调用Ҏ(gu)得到数据*/ <BR>} <BR>} <BR><BR>Q?接口与类 <BR><BR>cL对一cȝ定对象的规格说明,我们可以cd义创建对?通过创徏对象来组合所有属?BR>该类的组??<BR>接口不能q样?而接口实质上是一个常量和抽象Ҏ(gu)的集?要用一个接?需要在<BR>cM实现q个?<BR>?然后作ؓcd义的一部分,~写接口中声明的每一个方?接口中的Ҏ(gu)永远是public,<BR>abstract,接口中的 <BR>帔R永远是public static和final,因此不需要ؓ它们说明属? <BR>因ؓ在Java中不支持多重l承,但是,可以用接口来实现cM的功?q是接口的重要作用之<BR>一. <BR>eg: <BR>interface anyone //定义一个接?<BR>{ <BR>final double PI=3.1416; <BR>void setNumber(int number); <BR>int getNumber(); <BR>} <BR>interface anyother //定义另一个接?<BR>{ <BR>void setString(String str); <BR>String getString(); <BR>} <BR><BR>class xxf implement anyone,anyother //定义一个类,q用两个接?<BR>{ <BR>int number; <BR>String str; <BR>public xxf(){} <BR>void setNumber(int number) <BR>{ <BR>this.number=number; <BR>} <BR>void setString(String str) <BR>{ <BR>this.str=str; <BR>} <BR>void int getNumber(){}//可以Z个空实现. <BR>void String getString(){} <BR>} <BR>//在类中必d现接口中声明的所有方?(当然也可不必,但是要用到适配器类或用抽象c?BR><img src ="http://m.tkk7.com/jackybu/aggbug/1728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jackybu/" target="_blank">?/a> 2005-03-05 18:07 <a href="http://m.tkk7.com/jackybu/articles/1728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的基问题Q二Q?/title><link>http://m.tkk7.com/jackybu/articles/1724.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Sat, 05 Mar 2005 10:04:00 GMT</pubDate><guid>http://m.tkk7.com/jackybu/articles/1724.html</guid><wfw:comment>http://m.tkk7.com/jackybu/comments/1724.html</wfw:comment><comments>http://m.tkk7.com/jackybu/articles/1724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jackybu/comments/commentRss/1724.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jackybu/services/trackbacks/1724.html</trackback:ping><description><![CDATA[目录Q?BR><BR>一、准备篇<BR>Q1.1  什么是J2EEQ它和普通的Java有什么不同?<BR>Q1.2  J2EE好学吗?<BR>Q1.3 J2EE有什么用Q?BR>Q1.4 学J2EE有前途吗Q?BR>Q1.5 据说J2EE的性能不如.NET好,是真的吗Q?BR>Q1.6 听你说了q么多,我想学着玩玩?BR>Q1.7 学习J2EE该怎么开始?<BR>Q1.8 我下了一个J2EE服务器但是不会配|?BR>Q1.9 我发C没有提到Tomcat?BR><BR>二?Servlet/JSP?BR>Q2.1 什么是ServletQ?BR>Q2.2 我怎么获得Httph里的参数Q?BR>Q2.3 我怎么q回l果Q?BR>Q2.4 sendRedirect()和forward()有什么不同?<BR>Q2.5 我写了一个ServletE序Q怎么q行它?<BR>Q2.6 EAR和WAR有什么不同?<BR>Q2.7 EAR格式是怎样的?<BR>Q2.8 WAR格式是怎样的?<BR>Q2.9 我的普通HTML文g/JSP文g应当攑֜哪里Q?BR>Q2.10 我访问不到servletQ甚臌HTML文g都访问不刎ͼ<BR>Q2.11 我能讉KHTML但是讉K不到servlet?BR>Q2.12  什么是JSPQ它和Servlet有什么区别?<BR>Q2.13  我的JSP昄的汉字是q?BR>Q2.14  Z么用gb18030而不是gb2312Q?BR>Q2.15  在JSP里面怎么引用Java Bean?BR>Q2.16  我想在servlet间传递数据?BR>Q2.17  怎么调用cookieQ?BR>Q2.18  怎么在JSP里面实现文g下蝲Q?BR>Q2.19  怎么实现文g上传Q?BR>Q2.20  我想让页面自动刷斎ͼ比如聊天室?BR>Q2.21  我想让用L录以后才能访问页面?BR>Q2.22  我想要能注册用户?BR>Q2.23  怎么在JSP中访问数据库Q?BR>Q2.24  什么是JSTLQ?BR><BR>一、准备篇<BR><BR>Q1.1  什么是J2EEQ它和普通的Java有什么不同?<BR>{:J2EE全称为Java2 Platform, Enterprise Edition?BR>“J2EEq_本质上是一个分布式的服务器应用E序设计环境——一个Java环境Q它提供?BR>Q?BR>·宿主应用的一个运行基框架环境?BR>·一套用来创建应用的Java扩展API。”(引自《J2EE服务器端高~程》)<BR><BR>Q1.2  J2EE好学吗?<BR>{:J2EE是很多技术的集合体,q且q在成长中?BR>你会遇到很多专有名词Q比?X)HTMLQServlet/JSPQJDBCQJMSQJNDIQEJBQXMLQWeb<BR> Service……?BR>其是XML和Web Service正在快速成ѝ幸q的是,你不需要等到学会所有技术后再开?BR>~程?BR>大体上J2EE可以分成3个主要应用方式:Servlet/JSPQEJBQWeb Service 和一些支撑技?BR>例如JDBC和JNDI?BR>你可以一个一个的学?BR><BR>Q1.3 J2EE有什么用Q?BR>{:用来大型的分布式企业U应用程序。或者用更时髦的名词说就是“电(sh)子商务”应<BR>用程序?BR>q些企业可能大到拥有中心数据库服务器QWeb服务器集和遍布全国的办公终端,也可?BR>到只不q想做一个网站。但是你肯定听过“杀鸡焉用牛刀”的古训?BR><BR>Q1.4 学J2EE有前途吗Q?BR>{:在这一市场目前只有一U技术可以和J2EE竞争Q那是Microsoft?NET?BR>相对来说.NET要“新”一些而J2EE要“老”一些。这也意味着.NET更易用一点而J2EE更成<BR>熟一炏V?BR>但是.NET只能用于Windowsq_QMicrosoft声称要开发C#在Linux上的虚拟Z是尚未兑?BR>该诺aQ?BR>在过dq_.NET的市Z额ƈ不理惟뀂不qMicrosoftq有Longhornq一杀手锏Q鹿死谁<BR>手还很难说?BR><BR>Q1.5 据说J2EE的性能不如.NET好,是真的吗Q?BR>{:在Sun公司提供的样例程序Pet Store上,Microsoft声称不如相同?NETE序好?BR>而Sun公司反驳说这一E序不能真正体现J2EE的性能Qƈ且指责Microsoft在数据库上做?BR>优化?BR>作者没有学习过.NET因而不能妄下断a?BR>无论如何Q大型分布式E序中的性能瓉通常首先来自于错误的设计?BR><BR>Q1.6 听你说了q么多,我想学着玩玩?BR>{:除非你想靠它当饭吃或者作为技术储备,否则请不要浪费你的时间?BR>Flash要好玩得多。计机游戏更加好玩了?BR><BR>Q1.7 学习J2EE该怎么开始?<BR>{:首先Q下载一个免费的J2EE服务器。其ơ,去java.sun.com下蝲J2EE的API。第三,?BR>一本好的参考书。最后,找一个顺手的IDE?BR>J2EE服务器。你可以用Sun的J2EE SDKQ免费)Q或者WeblogicQ性能最好,但是太大Q?BR>且作者不推荐盗版行ؓQ,<BR>或者JBossQ免费,是文档太少Q,或者JRunQ开发版免费Q作者用q个Q?BR>参考书作者感觉Wrox的《J2EE服务器端高~程》不错,但是太老(作者手头的?001q?BR>中文版)?BR>Q似乎很多h不喜Ƣ这本书......所以你得自己判断它是否适合你。)<BR>你还需要去下蝲一些最新的技术资料(当然肯定是英文的Q?BR>IDE如果你的机器配置够好Q内存至?12M以上Q?56M或以下请勿考虑Q,可以用IBM的WS<BR>ADQ不然就l箋用Eclipse或者其他?BR>你也可以l常L木清华的Java版逛逛,但是在发贴前先看看精华区里有没有你要的答?BR>?BR><BR>Q1.8 我下了一个J2EE服务器但是不会配|?BR>{:误真阅读随机指导文档,不同的服务器的配|都不一P作者爱莫能助?BR><BR>Q1.9 我发C没有提到Tomcat?BR>{:Tomcat只是一个Web服务器,更准地说主要只是一个Web Container?BR>如果你想要学习EJB的话QTomcat无法满你的需要?BR><BR>二?Servlet/JSP?BR><BR>Q2.1 什么是ServletQ?BR>{:一个Servlet是一个JavacR它处理Http(s)hq作出响应,包括q回一个HTML面<BR>或{交给其他URL处理?BR>Servlet必须q行在一个Web Container例如Tomcat中?BR>Servlet必须是javax.servlet.http.HttpServlet的子c,<BR>你可以承doGet()或者doPost()Ҏ(gu)Q两者分别对应于Http(s)中的Geth和Posth?BR><BR><BR>Q2.2 我怎么获得Httph里的参数Q?BR>{:HttpRequest的getParameter()Ҏ(gu)。例如:String paramValue = request.getPara<BR>meter("paramName");<BR><BR>Q2.3 我怎么q回l果Q?BR>{:你可以利用相关API打开一个输出流Qƈ向流中直接写入一个HTML面?BR>但是作者完全不赞成q样做。一斚wq样做会很罗嗦?BR>另一斚w从Model-View-Controller模式Q在《J2EE核心模式》中被归为Front Controlle<BR>r模式Q的观点来看Q?BR>你应当提供一些HTML或者JSP作ؓ视图QviewQ,而Servlet则根据请求参数决定{到哪一<BR>个视图?BR>你可以利用response.sendRedirect(...)Ҏ(gu)或request.getDispatcher(...).forward()<BR>Ҏ(gu)来实现?BR><BR>Q2.4 sendRedirect()和forward()有什么不同?<BR>{:sendRedirect()是向览器发送一个redirect通知Q浏览器向新的URL发送一个新的请<BR>求?BR>而forward是在服务器端直接请求{到新的URLQ对于浏览器是透明的?BR>换而言之,sendRedirect()应当共享数据放在session中,forward应当共享数据放?BR>request中(当然你也可以攑֜session中,但放在request中可以有效减session中的?BR>据量Q从而改善性能Q?BR>前者浏览器的地址栏显C的是新的URLQ后者浏览器的地址栏显C的是Servlet的URL?BR>因而当h目标URLӞ两者会造成一些差别?BR><BR>Q2.5 我写了一个ServletE序Q怎么q行它?<BR>{:开发J2EEE序有一个部|ԌdeployQ的概念Q实际上是开发——部|y—运行的三部<BR>曌Ӏ?BR>大多数服务器支持Hot deploy。你只需要在相应的Application目录Q具体\径依赖于服务<BR>器)下面<BR>建立一个符合WAR或EAR格式Q参见Q2.7QQ2.8Q的目录Q启动服务器Q就可以通过览?BR>讉K了?BR>特别的,你的Servlet的class文g应当攑֜/WEB-INF/classes目录中?BR>注意J2EE SDK不支持Hot deployQ你需要通过它的deploy tool来部|Ӏ?BR>Tomcat只支持WAR格式?BR><BR>Q2.6 EAR和WAR有什么不同?<BR>{:EAR是一个完整的J2EE应用E序Q包括Web部分和EJB部分?BR>WAR只是其中的Web部分?BR><BR>Q2.7 EAR格式是怎样的?<BR>{:一个EAR可以包含L多个WAR或EJB JARQƈ且包含一个META-INF的目录?BR>?META-INF中包含了一个application.xmlQ其中描qCq个EAR包含哪些模块Q以及安?BR>性配|?BR>l节L参考书?BR><BR>Q2.8 WAR格式是怎样的?<BR>{:一个WAR包含一个WEB-INF的目录,q个目录下包含classes目录Qlib目录和web.xml?BR><BR>/WEB-INF/classes存放按packagel织的class文gQ?WEB-INF/lib目录存放jar文gQ?BR>web.xml描述了很多东西,误参考书?BR><BR>Q2.9 我的普通HTML文g/JSP文g应当攑֜哪里Q?BR>{:攑֜除了/WEB-INF以外的其他地斏V?BR><BR>感谢antegg|友对于安全性的提醒Q?BR>如果你想直接?A href="http://url/***.jsp的方式来讉KQ就要像上面说得那样放? target=_blank><FONT color=#002c99>http://url/***.jsp的方式来讉KQ就要像上面说得那样放?/FONT></A><BR>但是q样的做法是不安全的Q安全的做法是把所有的JSP面攑֜/WEB-INF目录下面Qƈ?BR><BR>通过WEB-CONTAINER来访问?BR><BR>作者意?<BR>我更喜欢用filter来做安全性检查?BR>在MVC模式中,JSP只是一个视图而已Q一般无需特别担忧安全性。和普通的html攑֜一?BR>也利于维护?BR><BR>Q2.10 我访问不到servletQ甚臌HTML文g都访问不刎ͼ<BR>{:<BR>W一你没启动服务器?BR>W二你敲错了端口?BR>W三你没有正配|context-path?BR>W四你的服务器不支持auto reload或者你关闭了这一选项Q你得重启服务器或重新部|W<BR>AR?BR>W五认你没有把HTML攑֜/WEB-INF目录下,那是讉K不到的?BR><BR>Q2.11 我能讉KHTML但是讉K不到servlet?BR>{:h查你的web.xml文g。确保你正确定义?lt;servlet>?lt;servlet-mapping>元素?BR><BR>前者标识了一个servletQ后者将一个相对于context-path的URL映射C个servlet?BR>在Tomcat中你可以通过/context-path/servlet/package/servletname的Ş式访问servlet<BR>Q?BR>但是q只是Tomcat的便捯问方式,q不是正式规范?BR>l节L参考书?BR><BR>Q2.12  什么是JSPQ它和Servlet有什么区别?<BR>{:你可以将JSP当做一个可扩充的HTML来对待?BR>虽然在本质上JSP文g会被服务器自动翻译ؓ相应的Servlet来执行?BR>可以说Servlet是面向JavaE序员而JSP是面向HTMLE序员的Q除此之外两者功能完全等?BR>?BR><BR>Q2.13  我的JSP昄的汉字是q?BR>{:在你的JSP开头加上一?<%@ page contentType="text/html; charset=gb18030"%><BR><BR>如果你已l声明了page我想你知道该怎么修改?BR><BR>Q2.14  Z么用gb18030而不是gb2312Q?BR>{:gb18030是gb2312之后的下一代汉字编码标准,最l将q渡到Unicode?BR><BR>Q2.15  在JSP里面怎么引用Java Bean?BR>{:首先Q确认你要引用的cd/WEB-INF/classes下或?WEB-INF/lib的某个jar内?BR>其次Q在JSP里加一?<jsp:useBean id="..." scope="..." class="..."/><BR>具体解释L参考书?BR><BR>Q2.16  我想在servlet间传递数据?BR>{:利用session。在Servlet/JSP中,你可以在4个地方保存数据?BR>1) pageQ本面?BR>2) sessionQ用来存攑֮L关的信息Q比如购物RQ对应接口ؓjavax.servlet.http.H<BR>ttpSession?BR>session机制实际上是cookie和URL Rewriting的抽象,服务器会自动使用cookie或URL Re<BR>writing来实现?BR>3) requestQ可以在forward()时传递信息,对应接口为javax.servlet.http.HttpReques<BR>t?BR>4) applicationQ或UcontextQ存攑օ局信息Q对应接口ؓjavax.servlet.ServletCont<BR>ext?BR><BR>Q2.17  怎么调用cookieQ?BR>{:作者徏议用sessionQ你L会遇到某些禁用cookie的用戗这时session会自动<BR>用URL重写来实现?BR><BR>Q2.18  怎么在JSP里面实现文g下蝲Q?BR>{:实际上这是一个HTML的问题。答案是一个超链接<a>?BR><BR>Q2.19  怎么实现文g上传Q?BR>{:客户端是HTML问题Q在form中设|method为postQenctype为multi-part/form-dataQ?BR>加一?lt;input type="file">?BR>而在接收的servlet中只是一个I/O问题Q你可以使用jakarta的file-upload库?BR><BR>Q2.20  我想让页面自动刷斎ͼ比如聊天室?BR>{:q是一个HTML问题Q在<head>部分中加一?lt;meta http-equiv="refresh" content="<BR>5" url="...">?BR>q是所谓的Client-pullQ客Lh技术?BR>相对的还有Server-pushQ服务器端刷新技术,但是q一技术由于要占用服务器端资源而会<BR>在大量访问时出现瓉现象Q参?A target=_blank><FONT color=#002c99>http://216.239.33.104/search?q=cache:autUfoakirY</FONT></A><BR>J:www.kfunigraz.ac.at/edvndwww/books/books/javaenterprise/servlet/ch06_03.htm+<BR>server-push+servlet&hl=zh-CN&ie=UTF-8<BR><BR>Q2.21  我想让用L录以后才能访问页面?BR>{:使用声明式安全措施?BR>你只需要在web.xml中定义安全角ԌRoleQ,q定义受保护的URL集合只能q定Role?BR>问?BR>大多数服务器支持Z数据库的用户映射Q你只要在相应数据库中徏立两张表q|服?BR>器就可以了?BR>注意J2EE SDK不支持基于数据库的用h?BR>l节L参考书和服务器文档?BR>不过在商业环境中QJ2EE所提供的声明式安全措施仍然偏弱。一般商业程序会使用数据?BR>存储user-role-privilege模型来达到安全性要求,l节误问你的构架设计师?BR><BR>Q2.22  我想要能注册用户?BR>{:参看Q2.21。在接受注册h的Servlet中执行写入数据库操作卛_?BR><BR>Q2.23  怎么在JSP中访问数据库Q?BR>{:标准做法是用DAO模式Q定义一个Java bean来访问数据库q在JSP中用?BR>然而,当你的数据库模式很简单时Q你可以使用JSTL中的<sql:query>标签来快速访问?BR><BR>在一般的J2EE目中,JSP处于表示层(展现层)Q需要先后通过业务层和集成层才会访?BR>到数据库Q所以这个问题确实只会在很小的程序中才会遇到?BR><BR>Q2.24  什么是JSTLQ?BR>{:JSTL是Jsp Standard Tag Library的羃写。这是一l通用标签q将成ؓJSP 2.0的一?BR>分?BR>其中包含赋?lt;c:set>Q分?lt;c:if>Q@?lt;c:forEach>Q查询数据库<sql:query>Q更新数<BR>据库<sql:update><BR>{。目前你需要像d自定义标{ֺ一hdJSTLQ但是可以预计JSP 2.0会将JSTL作ؓ<BR>l成部分?BR>标签库可以在<A target=_blank><FONT color=#002c99>http://jakarta.apache.org</FONT></A>下蝲。注意JSTL需要在支持JSP 1.2或更高版?BR>的容器下q行?BR>帮助文g可以阅读sun的JSTL正式规范?BR><img src ="http://m.tkk7.com/jackybu/aggbug/1724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jackybu/" target="_blank">?/a> 2005-03-05 18:04 <a href="http://m.tkk7.com/jackybu/articles/1724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的基问题Q一Q?/title><link>http://m.tkk7.com/jackybu/articles/1722.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Sat, 05 Mar 2005 10:03:00 GMT</pubDate><guid>http://m.tkk7.com/jackybu/articles/1722.html</guid><wfw:comment>http://m.tkk7.com/jackybu/comments/1722.html</wfw:comment><comments>http://m.tkk7.com/jackybu/articles/1722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jackybu/comments/commentRss/1722.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jackybu/services/trackbacks/1722.html</trackback:ping><description><![CDATA[目录Q?BR>Q1.1 什么是Java、Java2、JDKQJDK后面?.3?.4版本号又是怎么回事Q?BR>Q1.2 什么是JRE/J2REQ?BR>Q1.3 学习Java用什么工h较好Q?BR>Q1.4  学习Java有哪些好的参考书Q?BR>Q1.5  Java和C++哪个更好Q?BR>Q1.6  什么是J2SE/J2EE/J2MEQ?BR>Q2.1  我写了第一个JavaE序Q应该如何编?q行Q?BR>Q2.2  我照你说的做了,但是出现什么?javac' 不是内部或外部命令,也不是可q行?BR>E序或批处理文g。”?BR>Q2.3  环境变量怎么讄Q?BR>Q2.4  我在javac xxx.java的时候显CZ么“unreported exception java.io.IOExcepti<BR>on;”?BR>Q2.5  javac xxx.java利通过了,但是java xxx的时候显CZ么“NoClassDefFoundErr<BR>or”?BR>Q2.6  我在java xxx的时候显C“Exception in thread "main" java.lang.NoSuchMetho<BR>dError: main”?BR>Q2.7  在java xxx的时候显C“Exception in thread "main" java.lang.NullPointerEx<BR>ception”?BR>Q2.8 package是什么意思?怎么用?<BR>Q2.9 我没有声明Q何package会怎么P<BR>Q2.10 在一个类中怎么使用其他c?<BR>Q2.11 我用了package的时候显C?NoClassDefFoundError"Q但是我把所有packageL?BR>时候能正常q行?BR>Q2.12 我想把java~译成exe文gQ该怎么做?<BR>Q2.13 我在~译的时候遇C?deprecated API"Q是什么意思?<BR>Q3.1 我怎么ljavaE序加启动参敎ͼ像dir /p/w那样Q?BR>Q3.2 我怎么从键盘输入一个int/double/字符Ԍ<BR>Q3.3 我怎么输出一个int/double/字符Ԍ<BR>Q3.4 我发现有些书上直接用System.in输入Q比你要单得多?BR>Q3.5 我怎么从文件输入一个int/double/字符Ԍ<BR>Q3.6 我想d文g的指定位|,该怎么办?<BR>Q3.7 怎么判断要读的文件已l到了尽_<BR>Q4.1  java里面怎么定义宏?<BR>Q4.2  java里面没法用const?BR>Q4.3  java里面也不能用goto?BR>Q4.4  java里面能不能重载操作符Q?BR>Q4.5  我new了一个对象,但是没法delete掉它?BR>Q4.6  我想知道Z么mainҎ(gu)必须被声明ؓpublic staticQؓ什么在mainҎ(gu)中不能调<BR>用非static成员Q?BR>Q4.7  throw和throws有什么不同?<BR>Q4.8  什么是异常Q?BR>Q4.9  final和finally有什么不同?<BR>Q5.1  extends和implements有什么不同?<BR>Q5.2  java怎么实现多承?<BR>Q5.3 abstract是什么?<BR>Q5.4 public,protected,private有什么不同?<BR>Q5.5 Override和Overload有什么不同?<BR>Q5.6 我承了一个方法,但现在我惌用在父类中定义的Ҏ(gu)?BR>Q5.7 我想在子cȝ构造方法中调用父类的构造方法,该怎么办?<BR>Q5.8 我在同一个类中定义了好几个构造方法ƈ且想在一个构造方法中调用另一个?BR>Q5.9 我没有定义构造方法会怎么P<BR>Q5.10 我调用无参数的构造方法失败了?BR>Q5.11 我该怎么定义cM于C++中的析构Ҏ(gu)QdestructorQ?<BR>Q5.12 我想一个父cd象{换成一个子cd象该怎么做?<BR>Q5.13 其实我不定a是不是B的实例,能不能分情况处理Q?BR>Q5.14 我在Ҏ(gu)里修改了一个对象的|但是退出方法后我发现这个对象的值没变!<BR>Q6.1 java能动态分配数l吗Q?BR>Q6.2 我怎么知道数组的长度?<BR>Q6.3 我还惌数组的长度能自动改变Q能够增?删除元素?BR>Q6.4 什么是链表Qؓ什么要有ArrayList和LinkedList两种ListQ?BR>Q6.5 我想用队?栈?BR>Q6.6 我希望不要有重复的元素?BR>Q6.7 我想遍历集合/Map?BR>Q6.8 我还要能够排序?BR>Q6.9 但是我想l数l排序?BR>Q6.10 我想按不同方式排序?BR>Q6.11 Map有什么用Q?BR>Q6.12 setҎ(gu)没问题,但是getҎ(gu)q回的是Object?BR>Q6.13 ArrayList和Vector有什么不同?HashMap和Hashtable有什么不同?<BR>Q6.14 我要获得一个随机数?BR>Q6.15 我比较两个StringLfalseQ但是它们明明都?abc" Q?BR>Q6.16 我想修改一个String但是在StringcM没找到编辑方法?BR>Q6.17 我想处理日期/旉?BR><BR>一、准备篇<BR><BR>Q1.1 什么是Java、Java2、JDKQJDK后面?.3?.4版本号又是怎么回事Q?BR>{:Java是一U通用的,q发的,强类型的Q面向对象的~程语言Q摘自Java规范W二?BR>Q?BR>JDK是Sun公司分发的免费Java开发工具包Q正式名UCؓJ2SDK(Java2 Software Develop K<BR>it)?BR>包括基本的java工具包和标准cd?BR>到目?2003q??为止QJava?个主要版本,?.0Q?.1Q?.0Q?BR>JDK?.0Q?.1Q?.2Q?.3Q?.4五个版本?BR>从JDK1.2PSun公司觉得Java改变_大而将java语言版本h升ؓ2.0?BR>不同的JDK主要在于提供的类库不同。作为学习你可以下蝲最新的JDK1.4.2?BR>真正开发时则应考虑向前兼容Q比?.3。下载请?A target=_blank>http://java.sun.com</A>?BR>JDK1.5预计在2004q推出,届时其中包含若q崭新的Ҏ(gu)?BR><BR>Q1.2 什么是JRE/J2REQ?BR>{:J2RE是Java2 Runtime EnvironmentQ即Javaq行环境Q有时简UJRE?BR>如果你只需要运行JavaE序或AppletQ下载ƈ安装它即可?BR>如果你要自行开发Java软gQ请下蝲JDK。在JDK中附带有JRE?BR>注意׃Microsoft对Java的支持不完全Q请不要使用IE自带的虚拟机来运行AppletQ务?BR>安装一个JRE或JDK?BR><BR>Q1.3 学习Java用什么工h较好Q?BR>{:作者徏议首先用JDK+文本~辑器,q有助你理解下列几个基础概念QpathQclassp<BR>athQpackage <BR>q熟(zhn)基本命令:javac和java。ƈ且下载和你的JDK版本一致的API帮助?BR>如果你不定cL函数的用法,请先查阅API而不是发贴求助?BR>当你熟?zhn)Java之后Q你可以考虑开始用一个IDE?BR>作者推荐eclipseQ下载网址<A target=_blank>http://www.eclipse.org</A>。因为eclispe是免费的Q插件化?BR>?BR>eclispe的主要缺Ҏ(gu)~Z一个可视化的桌面程序开发工P<BR>q运的是IBM?003q?1月已l将部分代码捐给eclipsel织Q可以预计这个缺点很快就?BR>得到弥补?BR>无论如何Q请不要使用Microsoft的VJ++Q众所周知Microsoft从来没有认真支持过Java<BR>?BR>最后但q最不重要,要有一本好的参考书Qƈ且英文要q关?BR><BR>Q1.4  学习Java有哪些好的参考书Q?BR>{:作者首先推荐Thinking in JavaQ中文名《Java~程思想》,有中文版?BR>目前的最新版本是W三版?BR>?A target=_blank>http://64.78.49.204</A>可以免费下蝲英文版?BR>该书W一章介l了很多面向对象的编E思想Q作为新手应当认真阅诅R?BR>除此以外QO'relly出版C֒Wrox出版C书也不错。作者本Z喜欢大陆作者的书?BR>也许你觉得英文太难,但是|上大多数资料都是英文的。另外,你需要经常查阅APIQ而那<BR>也是英文的?BR><BR>Q1.5  Java和C++哪个更好Q?BR>{:q个问题是一个很不恰当的问题。你应该问:Java和C++哪个更适用于我的项目?<BR>Java的优点和~点一h显?BR>跨^台是Java的主要优点,但代hq行速度的下降?BR>VC和Windowsq_有良好的集成和够快的速度Q但是也只能局限在Windowsq_上?BR>和C++相比QJava学v来更快,开发h员不会碰到很多容易出错的Ҏ(gu)?BR>但是VBE序员甚臛_需要拼装模块就可以了?BR><BR>Q1.6  什么是J2SE/J2EE/J2MEQ?BR>{:J2SE是一般的Java?BR>J2ME是针对嵌入式讑֤的,比如支持Java的手机,它有自己的JRE和SDK?BR>J2EE是一l用于企业E序开发的规范和类库,它用J2SE的JRE?BR><BR>二、命令篇<BR><BR>Q2.1  我写了第一个JavaE序Q应该如何编?q行Q?BR>{:首先请将E序保存为xxx.java文gQ注意你可能需要修Ҏ(gu)件后~名?BR>然后在dosH口下用javac xxx.java命oQ你会发现该目录下多了一个xxx.class文gQ?BR><BR>再用java xxx命oQ你的javaE序开始运行了?BR><BR>Q2.2  我照你说的做了,但是出现什么?javac' 不是内部或外部命令,也不是可q行?BR>E序或批处理文g。”?BR>{:你遇Cpath问题。操作系l在一定的范围(path)内搜索javac.exeQ但是没能找到?BR><BR>L辑你的操作系l环境变量,新增一个JAVA_HOME变量Q设ZJDK的安装目录,<BR>再编辑Path变量Q加上一?%JAVA_HOME%\bin?BR>然后保存q新开一个dosH口Q你可以用javac和java命o了?BR><BR>Q2.3  环境变量怎么讄Q?BR>{:请向w边会设的h咨询?BR><BR>Q2.4  我在javac xxx.java的时候显CZ么“unreported exception java.io.IOExcepti<BR>on;”?BR>{:参见Q4.8以了解java中的异常机制?BR><BR>Q2.5  javac xxx.java利通过了,但是java xxx的时候显CZ么“NoClassDefFoundErr<BR>or”?BR>{:1. 你遇Cclasspath问题。java命o在一定的范围(classpath)内搜索你直接或间?BR>使用的class文gQ但是未能找到?BR>首先L认你没有错敲成java xxx.classQ?BR>其次Q检查你的CLASSPATH环境变量Q其实你q不需要设|该变量Q?BR>但如果你讄了该变量又没有包?Q代表当前目录)的项Q?BR>你就会遇到这个问题。请在你的CLASSPATH环境变量中加入一? 或干脆删掉这个变量?BR><BR>2. 如果你用了qJDK自带的标准包Q比如javax.servlet.*包,也会遇到q个问题Q请<BR>相应的jar文g加入classpath?BR>3. 如果你在java源文件中定义了packageQ请参见Q2.11?BR><BR><BR>Q2.6  我在java xxx的时候显C“Exception in thread "main" java.lang.NoSuchMetho<BR>dError: main”?BR>{:首先Q在你的E序中每个java文g有且只能有一个publicc,<BR>q个cȝcd必须和文件名的大写完全一栗?BR>其次Q在你要q行的类中有且只能有一个public static void main(String[] args)Ҏ(gu)<BR>Q?BR>q个Ҏ(gu)是你的ȝ序?BR><BR><BR>Q2.7  在java xxx的时候显C“Exception in thread "main" java.lang.NullPointerEx<BR>ception”?BR>{:在程序中你试囑֜gؓnull的对象变量上调用Ҏ(gu)Q请查你的程序确保你的对象被恰当的初始化?BR>参见Q4.8以了解java中的异常机制?BR><BR><BR>Q2.8 package是什么意思?怎么用?<BR>{:Z唯一标识每个cdƈ分组Qjava使用了package的概c?BR>每个c都有一个全名,例如String的全名是java.lang.StringQ其中java.lang是包名,S<BR>tring是短名。按照java命名惯例Q包名是全部写的,而类名的W一个字母是大写的?BR>q样Q如果你自行定义了同样名字的cStringQ你可以把它攑֜mypackage中,<BR>通过使用全名mypackage.String和java.lang.String来区分这两个cR?BR>同时Q将逻辑上相关的cL在同一个包中,可以使程序结构更为清楚?BR>Z定义包,你要做的是在java文g开头加一行“package mypackage;”?BR>注意包没有嵌套或包含关系Qmypackage包和mypackage.mysubpackage包对JRE来说是ƈ列的两个包(虽然开发者可<BR>能暗C包含关p)?BR><BR>Q2.9 我没有声明Q何package会怎么P<BR>{:你的c被认ؓ攑֜默认包中。这时全名和短名是一致的?BR><BR>Q2.10 在一个类中怎么使用其他c?<BR>{:如果你用java.lang包或者默认包中的c,不用做Q何事?BR>如果你的cM于mypackage包中Qƈ且要调用同一包中的其他类Q也不用做Q何事?BR>如果你用其他包中的c,在package声明之后Q类声明之前使用import otherpackage1.Class<BR>1; ?import otherpackage2.*;  <BR>q里.*表示引入q个包中的所有类。然后在E序中你可以使用其他cȝ短名?BR>如果短名间有重名冲突Q必M用全名来区分?BR>注意在用其他包中的cLQ你只能使用public的类和接口,参见Q5.4?BR><BR>Q2.11 我用了package的时候显C?NoClassDefFoundError"Q但是我把所有packageL?BR>时候能正常q行?BR>{:你的java文g按包名组l存放?BR>比如你的工作目录?workQ你的类是package1.Class1Q那么将它存放ؓ/work/package1<BR>/Class1.java?BR>如果没有声明包,那么直接攑֜/work下?BR>?work下执行javac package1/class1.javaQ再执行java package1.class1Q你会发C<BR>切正常?BR>另外Q如果你的类的个数已l多C你需要用包来组l的话,你可以考虑开始用IDE?BR><BR>Q2.12 我想把java~译成exe文gQ该怎么做?<BR>{:JDK只能java源文件编译ؓclass文g?BR>class文g是一U跨q_的字节码Q必M赖^台相关的JRE来运行。Java以此来实现跨q?BR>台性?BR>有些开发工具可以将java文g~译为exe文g。作者反对这U做法,因ؓq样取消了跨^<BR>台性?BR>如果你确信你的Y件只在Windowsq_上运行,你可以考虑使用C++/C#来编E?BR><BR>Q2.13 我在~译的时候遇C?deprecated API"Q是什么意思?<BR>{:所谓deprecated是指已经q时Q但是ؓ了向前兼容v见仍然保留的Ҏ(gu)?BR>q些Ҏ(gu)可能会在以后取消支持。你应当改用较新的方法?BR>在API里面会说明你应当用什么方法来代替之?BR><BR>三、I/O?BR><BR>Q3.1 我怎么ljavaE序加启动参敎ͼ像dir /p/w那样Q?BR>{:q记得public static void main(String[] args)吗?q里的args是你的启动参数<BR>?BR>在运行时你输入java package1.class1 arg1 arg2Qargs中就会有两个StringQ第一个是<BR>arg1Q第二个是arg2?BR><BR>Q3.2 我怎么从键盘输入一个int/double/字符Ԍ<BR>{:java的I/O操作比C++要复杂一炏V如果要从键盘输入,样例代码如下Q?BR>BufferedReader cin = new BufferedReader( new InputStreamReader( System.in ) );<BR><BR>String s = cin.readLine();<BR>q样你就获得了一个字W串Q如果你需要数字的话再使用Q?BR>int n = Integer.parseInt( s ); 或?double d = Double.parseDouble( s );<BR>来将字符?534"转换成int或double?BR><BR>Q3.3 我怎么输出一个int/double/字符Ԍ<BR>{:使用System.out.println(n)或者System.out.println("Hello"){等?BR><BR>Q3.4 我发现有些书上直接用System.in输入Q比你要单得多?BR>{:java使用unicodeQ是双字节。而System.in是单字节的stream?BR>如果你要输入双字节文字比如中文,请用作者的做法?BR><BR>Q3.5 我怎么从文件输?输出一个int/double/字符Ԍ<BR>{:cM于从键盘输入Q只不过换成<BR>BufferedReader fin = new BufferedReader( new FileReader(" myFileName " ) );<BR>PrintWriter fout = new PrintWriter( new FileWriter(" myFileName " ) );<BR>另外如果你还没下载APIQ请开始下载ƈ阅读java.io包中的内宏V?BR><BR>Q3.6 我想d文g的指定位|,该怎么办?<BR>{:java.io.RandomAccessFile可以满你的需要?BR><BR>Q3.7 怎么判断要读的文件已l到了尽_<BR>{:在Reader的readҎ(gu)中明说明返?1表示的l尾?BR><BR>四?关键字篇<BR><BR>Q4.1  java里面怎么定义宏?<BR>{:java不支持宏Q因为宏代换不能保证cd安全?BR>如果你需要定义常量,可以它定义为某个类的static final成员。参见Q4.2和Q4.6?BR><BR><BR>Q4.2  java里面没法用const?BR>{:你可以用final关键字。例?final int m = 9。被声明为final的变量不能被再次?BR>倹{唯一的例外是所谓blank finalQ如下例所C:<BR>public class MyClass1 {<BR>    private final int a = 3;<BR>    private final int b; // blank final<BR><BR>    public MyClass1() {<BR>        a = 5; // 不合法,final变量不能被再ơ赋倹{?BR>        b = 4; // 合法Q这是bW一ơ被赋倹{?BR>        b = 6; // 不合法,b不能被再ơ赋倹{?BR>    }<BR>}<BR>final也可以用于声明方法或c,被声明ؓfinal的方法或cM能被l承?BR>注意const是java的保留字以备扩充?BR><BR>Q4.3  java里面也不能用goto?BR>{:甚至在面向过E的语言中你也可以完全不用goto。请查你的程序流E是否合理?BR><BR>如果你需要从多层循环中迅速蟩出,java增强了(和C++相比Qbreak和continue的功能,<BR>支持label?BR>例如Q?BR>outer : <BR>while( ... )<BR>{<BR> inner :<BR> for( ... )<BR> {<BR>           ...   break inner; ...<BR>           ... continue outer; ...<BR> }<BR>}<BR>和const一Pgoto也是java的保留字以备扩充?BR><BR>Q4.4  java里面能不能重载操作符Q?BR>{:不能。String?h唯一一个内|的重蝲操作W。你可以通过定义接口和方法来实现<BR>cM功能?BR><BR>Q4.5  我new了一个对象,但是没法delete掉它?BR>{:java有自动内存回收机Ӟx谓Garbarge Collection。你不需要删除对象。你再也<BR>不用担心指针错误Q内存溢Z?BR><BR>Q4.6  我想知道Z么mainҎ(gu)必须被声明ؓpublic staticQؓ什么在mainҎ(gu)中不能调<BR>用非static成员Q?BR>{:声明为public是ؓ了这个方法可以被外部调用Q详情见Q5.4?BR>static是ؓ了将某个成员变量/Ҏ(gu)兌到类QclassQ而非实例QinstanceQ?BR>你不需要创Z个对象就可以直接使用q个cȝstatic成员Q因而在static成员中不能调<BR>用非static成员Q因为后者是兌到对象实例(instanceQ的?BR>在AcM调用Bcȝstatic成员可以使用B.staticMember的写法?BR>注意一个类的static成员变量是唯一的,被所有该cd象所׃n的,在多U程E序设计中尤其要谨慎心?BR>cȝstatic成员是在cȝ一ơ被JRE装蝲的时候初始化的?BR>你可以用如下方法来使用非static成员Q?BR>public class A<BR>{<BR>    private void someMethod() //非static成员<BR>    {}<BR>    public static void main(String args)<BR>    {<BR>         A a = new A();  //创徏一个对象实?BR>         a.someMethod();  //现在你可以用非staticҎ(gu)?BR>    }<BR>}<BR><BR><BR>Q4.7  throw和throws有什么不同?<BR>{:throws用于Ҏ(gu)声明中,声明一个方法会抛出哪些异常。而throw是在Ҏ(gu)体中实际执行抛出异常?BR>动作?BR>如果你在Ҏ(gu)中throw一个异常,却没有在Ҏ(gu)声明中声明之Q编译器会报错?BR>注意Error和RuntimeException的子cL例外Q无需特别声明?BR><BR>Q4.8  什么是异常Q?BR>{:异常最早在Ada语言中引入,用于在程序中动态处理错误ƈ恢复?BR>你可以在Ҏ(gu)中拦截底层异常ƈ处理之,也可以抛l更高层的模块去处理?BR>你也可以抛出自己的异常指C发生了某些不正常情c常见的拦截处理代码如下Q?BR>try<BR>{<BR> ......//以下是可能发生异常的代码<BR>        ...... //异常被你或低层API抛出Q执行流E中断ƈ转向拦截代码?BR>        ...... <BR>}<BR>catch(Exception1 e) //如果Exception1是Exception2的子cdƈ要做特别处理Q应排在?BR>?BR>{<BR>  //发生Exception1时被该段拦截<BR>}<BR>catch(Exception2 e)<BR>{<BR>  //发生Exception2时被该段拦截<BR>}<BR>finally //q是可选的<BR>{<BR>   //无论异常是否发生Q均执行此段代码<BR>   //即在catchD中又向外抛Z新的exceptionQfinallyD也会得到执行?BR>}<BR><BR>Q4.9  final和finally有什么不同?<BR>{:final误Q4.2。finally用于异常机制Q参见Q4.8?BR><BR>五?面向对象?BR><BR>Q5.1  extends和implements有什么不同?<BR>{:对于class而言Qextends用于Q单Q承一个类QclassQ,而implements用于实现一个接口(interf<BR>aceQ?BR>interface的引入是Z部分地提供多l承的功能?BR>在interface中只需声明Ҏ(gu)_而将Ҏ(gu)体留l实现的class来做?BR>q些实现的class的实例完全可以当作interface的实例来对待?BR>在interface之间也可以声明ؓextendsQ多l承Q的关系?BR>注意一个interface可以extends多个其他interface?BR><BR>Q5.2  java怎么实现多承?<BR>{:java不支持显式的多ѝ?BR>因ؓ在显式多l承的语a例如c++中,会出现子c被q声明祖先虚基类构造函数的问题Q?BR><BR>而这是违反面向对象的装性原则的?BR>java提供了interface和implements关键字来部分地实现多l承。参见Q5.1?BR><BR>Q5.3 abstract是什么?<BR>{:被声明ؓabstract的方法无需l出Ҏ(gu)体,留给子类来实现?BR>而如果一个类中有abstractҎ(gu)Q那么这个类也必d明ؓabstract?BR>被声明ؓabstract的类无法实例化,管它可以定义构造方法供子类使用?BR><BR>Q5.4 public,protected,private有什么不同?<BR>{:q些关键字用于声明类和成员的可见性?BR>public成员可以被Q何类讉KQ?BR>protected成员限于自己和子c访问,<BR>private成员限于自己讉K?BR>Javaq提供了W四U的默认可见性,一般称为package privateQ当没有Mpublic,protected,private修饰W时Q成?BR>是同一包内可见?BR>cd以用public或默认来修饰?BR><BR>Q5.5 Override和Overload有什么不同?<BR>{:Override是指父类和子cM间方法的l承关系Q这些方法有着相同的名U和参数cd<BR>?BR>Overload是指同一个类中不同方法(可以在子cM可以在父cM定义Q间的关p,<BR>q些Ҏ(gu)有着相同的名U和不同的参数类型?BR><BR><BR>Q5.6 我承了一个方法,但现在我惌用在父类中定义的Ҏ(gu)?BR>{:用super.xxx()可以在子cM调用父类Ҏ(gu)?BR><BR>Q5.7 我想在子cȝ构造方法中调用父类的构造方法,该怎么办?<BR>{:在子cL造方法的W一行调用super(...)卛_?BR><BR>Q5.8 我在同一个类中定义了好几个构造方法ƈ且想在一个构造方法中调用另一个?BR>{:在构造方法第一行调用this(...)?BR><BR>Q5.9 我没有定义构造方法会怎么P<BR>{:自动获得一个无参数的构造方法?BR><BR>Q5.10 我调用无参数的构造方法失败了?BR>{:如果你至定义了一个构造方法,׃再有自动提供的无参数的构造方法了?BR>你需要另外显式定义一个无参数的构造方法?BR>另外一U可能是你的构造方法或者类不是public的,参见Q5.4了解java中的可见性?BR><BR>Q5.11 我该怎么定义cM于C++中的析构Ҏ(gu)QdestructorQ?<BR>{:提供一个void finalize()Ҏ(gu)。在Garbarge Collector回收该对象时会调用该Ҏ(gu)?BR><BR>注意实际上你很难判断一个对象会在什么时候被回收。作者从未感到需要用到该Ҏ(gu)?BR><BR><BR>Q5.12 我想一个父cd象{换成一个子cd象该怎么做?<BR>{:强制cd转换。如<BR>public void meth(A a)<BR>{<BR> B b = (B)a;<BR>}<BR>如果a实际上ƈ不是B的实例,会抛出ClassCastException。所以请保a实是B的实例?BR><BR><BR>Q5.13 其实我不定a是不是B的实例,能不能分情况处理Q?BR>{:可以使用instanceof操作W。例?BR>if( a instanceof B )<BR>{<BR> B b = (B)a;<BR>}<BR>else<BR>{<BR> ...<BR>}<BR><BR>Q5.14 我在Ҏ(gu)里修改了一个对象的|但是退出方法后我发现这个对象的值没变!<BR>{:很可能你把传入参数重赋了一个新对象Q例如下列代码就会造成q种错误Q?BR>public void fun1(A a) //a是局部参敎ͼ指向了一个外在对象?BR>{<BR> a = new A(); //a指向了一个新对象Q和外在对象脱钩了。如果你要让a作ؓ传出变量Q?BR>不要写这一句?BR>        a.setAttr(attr);//修改了新对象的|外在对象没有被修攏V?BR>}<BR>基本cd也会出现q种情况。例如:<BR>public void fun2(int a)<BR>{<BR> a = 10;//只作用于本方法,外面的变量不会变化?BR>}<BR><BR>六、java.util?BR><BR>Q6.1 java能动态分配数l吗Q?BR>{:可以。例如int n = 3; Language[] myLanguages = new Language[n];<BR><BR>Q6.2 我怎么知道数组的长度?<BR>{:用length属性。如上例中的  myLanguages.length ׃ؓ 3?BR><BR>Q6.3 我还惌数组的长度能自动改变Q能够增?删除元素?BR>{:用顺序表--java.util.List接口?BR>你可以选择用ArrayList或是LinkedListQ前者是数组实现Q后者是链表实现?BR>例如Q?nbsp; List list = new ArrayList(); 或是 List list = new LinkedList();  ?BR><BR>Q6.4 什么是链表Qؓ什么要有ArrayList和LinkedList两种ListQ?BR>{:误习数据结构?BR><BR>Q6.5 我想用队?栈?BR>{:用java.util.LinkedList?BR><BR>Q6.6 我希望不要有重复的元素?BR>{:用集?-java.util.Set接口。例如:Set set = new HashSet()?BR><BR>Q6.7 我想遍历集合/Map?BR>{:用java.util.Iterator。参见API?BR><BR>Q6.8 我还要能够排序?BR>{:用java.util.TreeSet。例如:Set set = new TreeSet()。放q去的元素会自动排序<BR>?BR>你需要ؓ元素实现Comparable接口Q还可能需要提供equals()Ҏ(gu)QcompareTo()Ҏ(gu)Qh<BR>ashCode()Ҏ(gu)?BR><BR>Q6.9 但是我想l数l排序?BR>{:java.util.Arrayscd含了sort{实用方法?BR><BR>Q6.10 我想按不同方式排序?BR>{:为每U方式定义一个实C接口Comparator的排序类q和Arrays或TreeSetl合q用?BR><BR><BR>Q6.11 Map有什么用Q?BR>{:存储key-value的关键字-值对Q你可以通过关键字来快速存取相应的倹{?BR><BR>Q6.12 setҎ(gu)没问题,但是getҎ(gu)q回的是Object?BR>{:强制cd转换成你需要的cd。参见Q5.12?BR><BR>Q6.13 ArrayList和Vector有什么不同?HashMap和Hashtable有什么不同?<BR>{:ArrayList和HashMap是多U程不安全的Q在多个U程中访问同一个ArrayList对象可能<BR>会引起冲HƈD错误?BR>而Vector和Hashtable是多U程安全的,即在多个线E中同时讉K同一个Vector对象也不<BR>会引起差错?BR>看v来我们更应该使用Vector和HashtableQ但是实际上Vector和Hashtable的性能太差Q?BR>所以如果你不在多线E中使用的话Q还是应该用ArrayList和HashMap?BR><BR>Q6.14 我要获得一个随机数?BR>{:使用java.util.RandomcR?BR><BR>Q6.15 我比较两个StringLfalseQ但是它们明明都?abc" Q?BR>{:比较String一定要使用equals或equalsIgnoreCaseҎ(gu)Q不要?== Q?BR>==比较的是两个引用Q变量)是否指向了同一个对象,而不是比较其内容?BR><BR>Q6.16 我想修改一个String但是在StringcM没找到编辑方法?BR>{:使用StringBuffercR?BR>String str = "......."; //待处理的字符?BR>StringBuffer buffer = new StringBuffer(str); //使用该字W串初始化一个StringBuf<BR>fer<BR>buffer.append("..."); //调用StringBuffer的相关API来编辑字W串<BR>String str2 = buffer.toString(); //获得~辑后的字符丌Ӏ?BR>另外Q如果你需要将多个字符串连接v来,请尽量避免?L接连接,而是使用Strin<BR>gBuffer.append()Ҏ(gu)?BR><BR>Q6.17 我想处理日期/旉?BR>{:使用java.util.DatecR你可以使用java.text.SimpleDateFormatcL在String和Da<BR>te间互相{换?BR>SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //?BR>定日期格?BR>Date date = formatter.parse("2003-07-26 18:30:35"); //符合格式的String转换?BR>Date<BR>String s = formatter.format(date); //Date转换为符合格式的String<BR>关于定义日期格式的详l信息请参见API?BR><img src ="http://m.tkk7.com/jackybu/aggbug/1722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jackybu/" target="_blank">?/a> 2005-03-05 18:03 <a href="http://m.tkk7.com/jackybu/articles/1722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[学习W记]Java Web Start http://m.tkk7.com/jackybu/articles/1717.html?/dc:creator>?/author>Sat, 05 Mar 2005 06:29:00 GMThttp://m.tkk7.com/jackybu/articles/1717.htmlhttp://m.tkk7.com/jackybu/comments/1717.htmlhttp://m.tkk7.com/jackybu/articles/1717.html#Feedback0http://m.tkk7.com/jackybu/comments/commentRss/1717.htmlhttp://m.tkk7.com/jackybu/services/trackbacks/1717.html*******************************************************

作者:陈刚Q程序员Q广西省桂林人,q西师范大学数学p?SPAN lang=EN-US>97届毕业?/SPAN>

blogQ?A >http://blog.csdn.net/glchengang

EmailQ?A href="mailto:glchengang@yeah.net">glchengang@yeah.net  

******************************************************* 

 

谁可以提供一个稍微大一些的FTPI间Q有些文章的源代码无处可?/SPAN>

Java Web Start?/SPAN>

最q由于工作关p,老大嘱咐我看一?/SPAN>Java Web Start。以前安?/SPAN>JDKӞ会在“开始”菜单加一个快捯单?/SPAN>Java Web Start”,也不知是做什么用的,我一般都是删除。今天从|上查了一下资料,不看不知道,一看吓一跻I觉得q?/SPAN>JWSQ?/SPAN>Java Web StartUͼ很象传说中的“服务器端小E序下蝲q行”。而且JWS很早有了,我看有些文章资料已经?/SPAN>2002q发的,自己竟然全然不知它的存在Q实在是愚昧呀?/SPAN>

1.  JWS有什么用

B/S风行的一个很大原因就是它有部|方便的优势Q这?/SPAN>C/S?/SPAN>Application所无法比拟的。现在,JWS让用户可以下载服务器端的Java Application到本行,q且没有安装、配|等J琐的操作?/SPAN>SUN|站上有DemoQ大家可以体验一下效果:http://java.sun.com/products/javawebstart/demos.html  ?/SPAN>

2.  JWS的运行原?/SPAN>

览器的q行Java Applica ton的链接指向的不是E序本nQ而是一?/SPAN>*.jnlp文gQ这个文件包含了Java Application的一些配|信息。然?/SPAN>JWS解读q个文g的信息,服务器端的Java Application下蝲到本ZQƈq行?/SPAN>

当然W一ơ运行程序时Q由于要下蝲所以速度会稍微慢一些,不过W二ơ运行时Q?/SPAN>JWS会自动去服务器上查是否有新的E序版本发布Q如果没有就会直接运行本机已l下载的E序Q这和q行本机Java Application没什么区别了。运行程序之初,JWSq会提示你是否创Z个相应的快捷菜单?/SPAN>

E序下蝲到本机的默认位置是:?/SPAN>C:\Documents and Settings\admin\Application Data\Sun\Java\Deployment\javaws\cache\indirect\indirect12423.ind”,你可以在本机的?/SPAN>JWS应用E序理器”的里重新设|此存放目录?/SPAN>

 

JWS无疑要比Applet的应用范围更q(据说q得q*Q的最?jng)_意奖Q,它对于布|一些小型的E序应用是非常方便的Q但我以为现在还主要适用于局域网。因Z个程序一般约有几?/SPAN>MQ如果是Internet用户W一ơ的下蝲速度会很慢?/SPAN>

3.  安全性问题?/SPAN>

但和Applet一PJWS也面临安全性问题,默认情况?/SPAN>JWSҎ(gu)机磁盘和本地|络的访问是有限制的。如果该E序要越权访问,q时会弹Z个警告框Q类gActivX的数字签名)Q用户可以自已决定是否信任该软gQ而对其放开限制?/SPAN>

4.  JWS的优~点

JWS的优点就是让E序的布|更单,而且用户端的应用可以时刻保持和服务器端的最新版本同步,qؓ升版本提供了很大的方便?/SPAN>

~点也是明显的,׃要运行应用必Mơ下载所有的E序文gQ?/SPAN>JWS?/SPAN>jnlp配置文g有个lazy选项Q但作用不明显)Q所以第一ơ下载速度很慢Q不适用于互联网。从q一Ҏ(gu)?/SPAN>B/S形式的应用还是有优势的?/SPAN>

 

参考资?/H3>

http://www.chinaitlab.com/www/news/article_show.asp?id=25239

http://blog.csdn.net/emag_java/archive/2005/01/13/252047.aspx 

 

 

Java Web Start实例

1?/SPAN>CZ说明

׃?/SPAN>BLOGC要以Eclipse?/SPAN>SWT为内容,所?/SPAN>Java Web StartQ简U?/SPAN>JWSQ也以一?/SPAN>SWT应用E序来做为示例?/SPAN>

本文用<Eclipse开发指南>书中打包一章的打包l果为示例,该示例ؓ一?/SPAN>SWT/JFaceE序Q其打包后的文gl构如下Q?/SPAN>

 

l           myswt是主包,里面含有自己写的E序代码

l           swt-win32-3063.dll是本地化文g

l           lib子目录下q有三个jar文gQ?/SPAN>jface.jar?/SPAN>runtime.jar?/SPAN>swt.jarQ这三个文g?/SPAN>SWTE序的支持库?/SPAN>

如果是在本地q行此程序,双击myswt.jar卛_Q要?/SPAN>Windows?/SPAN>jar格式的文仉认用javaw.exe打开Q如下图所C:

 

现在我们要将q个E序?/SPAN>JWS部v到服务器端,然后~写一个网,让用户单ȝ上的链接就可以下蝲?/SPAN>SWTE序q运行?/SPAN>

2、准备工?/SPAN>

本h的环境ؓQ?/SPAN>WinodwsXP SP2 Q?/SPAN> JDK1.4.2 Q?/SPAN> Tomcat 5.0.28

Q?/SPAN>1Q首先得先安?/SPAN>TomcatQ这一步的操作Ҏ(gu)本文省略

Q?/SPAN>2Q在Tomcat?/SPAN>webapps\ROOT路径下创Z个?/SPAN>myswt”目录。在我的?sh)脑上,其绝对\径如下:E:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\ROOT\myswt?/SPAN>

Q?/SPAN>3Q将前面所q的SWTE序的文件复制到webapps\ROOT\myswt目录中?/SPAN>

3、生成证?/SPAN>

       创徏一个批处理文gQ?/SPAN>key.bat

c:\jdk\bin\keytool -genkey -keystore myKeystore -alias myself

c:\jdk\bin\keytool -list -keystore myKeystore

pause

内容说明Q?/SPAN>

l           keytool?/SPAN>JDK自带的一个工P用于数字{֐。在我的?sh)脑Q它是位?/SPAN>c:\jdk\bin\路径下,׃我没有设|环境变?/SPAN>pathQ所以在批处理文件中性指?/SPAN>keytool的\径。如果是自己用或者公司内部用Q象本文q样?/SPAN>keytool生成一个自{֐的证书也可以了。但如果你想让签名更正式一些,以获得其他用L信QQ最好去认证中心Q如 Thawte ?/SPAN> VeriSignQ获取一个证书?/SPAN>

l           W一句将生成一个证书,文g名:myKeystore

l           W二句是列出密钥证书中的所有入口。(q一句是可选的Q只是ؓ了显C出来看一下,不要也行Q?/SPAN>

l           最后一句是暂停pauseQ以便批处理完成后,我们可以回顾一下全q程?/SPAN>

 

q行批处?/SPAN>key.bat后的全部输入q程如下图所C:

4、用证用为应用程序签?/SPAN>

Q?/SPAN>1Q因为签名只?/SPAN>jar包,所以先?/SPAN>swt-win32-3063.dll文g?/SPAN>WinRAR?/SPAN>c:\jdk\bin\jar打一?/SPAN>jar?/SPAN>(swt-win32-3063.jar)。客L下蝲后,会自动解开此包Q将swt-win32-3063.dllq原到客L?/SPAN>

注意Q如果你?/SPAN>WinRAR打包Q在压羃时必?/SPAN>ZIP格式Q不能?/SPAN>RAR格式?/SPAN>

 

Q?/SPAN>2Q创Z个用于签名的批处理文Ӟjarsigner.batQ其内容如下Q?/SPAN>

c:\jdk\bin\jarsigner -keystore myKeystore myswt.jar myself

c:\jdk\bin\jarsigner -keystore myKeystore lib\jface.jar myself

c:\jdk\bin\jarsigner -keystore myKeystore lib\runtime.jar myself

c:\jdk\bin\jarsigner -keystore myKeystore lib\swt.jar myself

c:\jdk\bin\jarsigner -keystore myKeystore swt-win32-3063.jar myself

pause

q里每一条命令都要求你输入密码,它就是在创徏证书myKeystore时设|的那个密码。至此,{֐证书部䆾完成了,下一步是创徏jnlp文g?/SPAN>

5、创建jnlp文g

Q?/SPAN>1Q创Z个名?/SPAN>myswt.jnlp?/SPAN>jnlp文gQ这个文件是Java Web Start的核心配|文Ӟ其内容如下:

<?xml version="1.0" encoding="GBK"?>

<jnlp codebase="http://localhost:8080/myswt">

 

  <information>

    <title>子在川曰(http://blog.csdn.net/glchengang)</title>

    <vendor>陈刚</vendor>

    <offline-allowed/>

  </information>

 

  <security>

      <all-permissions/>

  </security>

 

  <resources>

    <j2se version="1.4+"/>

    <jar href="myswt.jar"/>

    <jar href="lib/jface.jar"/>

    <jar href="lib/runtime.jar"/>

    <jar href="lib/swt.jar"/>

    <nativelib href="swt-win32-3063.jar"/>

  </resources>

 

  <application-desc main-class="jface.dialog.wizard.WizardDialog1"/>

 

</jnlp>  

说明Q?/SPAN>

l           encoding="GBK"  本文选择?/SPAN>GBKQ一般来说应该用UTF-8。我在这里之所以选择GBK字符集,主要是ؓ了演C示例方便,如果是正式应用,q是应该改ؓUTF-8。如果用UTFQ?/SPAN>8Q则该文件的中文要{换成UNICODE码,否则实际q行时将昄qQ你可以?/SPAN>c:\jdk\bin\native2ascii.exe来进行“汉字-Q?/SPAN>UNICODE”的转换?/SPAN>

l           codebase="http://localhost:8080/myswt" 本应用程序的URL

l           <information>,是一些显CZ息,<title>?/SPAN><vendor>都是必选的?/SPAN><offline-allowed/>是可选的Q它表示允许应用E序脱机q行Q不和服务器联网Q?/SPAN>

l           <security>Ҏ(gu)指开攄h机的所有权限给应用E序Q这一会D弹出一个数字签名对话框?/SPAN>

l           <resources>列出了用户需要下载的资源?/SPAN><j2se version="1.4+"/>是指Q要求用h机安?/SPAN>Java1.4以上版本?/SPAN><nativelib>是指此包含有本地文gQ这?/SPAN>JWS下蝲后会此包解开?/SPAN>

l           <application-desc>指定了程序的入口c,你也可以指定其他的入口类Q它不受限制?/SPAN>jface.dialog.wizard.WizardDialog1?/SPAN>myswt.jar包中的一个向导式对话框,q是我自q写的一?/SPAN>SWTE序?/SPAN>

Q?/SPAN>2Q创Z?/SPAN>HTML|页

创徏一?/SPAN>HTML|页Q网|?/SPAN>jnlp文g。我们给?/SPAN>HTML|页取名Q?/SPAN>test.htmlQ其内容如下Q?/SPAN>

<A HREF="myswt.jnlp">启动</A>

6、最后效?/SPAN>

Q?/SPAN>1Q最后的服务器的目录l构如下图所C:

 

Q?/SPAN>2Q用览器浏览:http://localhost:8080/myswt/test.html

 

单击“启动”后出现下图Q开始从服务器上下蝲SWT应用E序Q?/SPAN>

 

下蝲完成后,出现如下图,提示用户是否向应用程序开放本机所有权限(弹出q个对话框是?/SPAN>jnlp文g中的<security>设|决定的Q?/SPAN>

 

单击“启动”按钮,运行程序,出现下图。(附注Q这里没有弹出提CZd快捷菜单的对话框Q?/SPAN>

 

7、其他注意事?/SPAN>

Q?/SPAN>1Q如果单ȝ늚“启动”链接时Q显C的?/SPAN>jnlp文g的内容,q非下蝲服务器的应用E序。这时你需要做如下查:

l           ?/SPAN>Windows中,jnlp格式的文件应该默认用javaw打开。如果你把它改变成了用记事本或其他程序打开Q就也会出错?/SPAN>

l           WEB服务器是否能否L?/SPAN>jnlp?/SPAN>jar?/SPAN>class文g的格式。如果你是用TomcatQ可以打开conf目录?/SPAN>WEB.XML文g查一下。一般来_较新?/SPAN>WEB服务器都支持jnlpQ如?/SPAN>Tomcat?/SPAN>WebLogic{(微Y?/SPAN>IIS不支?/SPAN>JavaQ当然也不可能支?/SPAN>jnlpQ我是这么想的没L试过Q。如果不支持Q就?/SPAN>WEB服务器的配置文g里加上下面的内容?/SPAN>

    <mime-mapping>

        <extension>class</extension>

        <mime-type>application/java</mime-type>

    </mime-mapping>   

    <mime-mapping>

        <extension>jar</extension>

        <mime-type>application/java-archive</mime-type>

    </mime-mapping>

    <mime-mapping>

        <extension>jnlp</extension>

        <mime-type>application/x-java-jnlp-file</mime-type>

    </mime-mapping> 

Q?/SPAN>2Q在使用Java Web Start的时候可能会出现"下蝲资源错误"Q大致的出错信息如下Q?/SPAN>  

   JNLPException[category: Download Error : Exception:

   java.io.IOException:

   rename failed in cache : LaunchDesc: null ] at.....

q个错误的原因是因ؓ每次调用Java Web Start都会?/SPAN>server上查扄序是否更斎ͼ然后程序下载到本地?/SPAN>java web start目录下的cache目录中,如果cache中已l有同名文gQ而且该文件正在被使用Q那么新下蝲的文件就会出?/SPAN> rename failed错误Q而且手工d除本地的文gq会报错Q文件正被用!

q里涉及?/SPAN>Java Web Start中的sign机制Q可能对每个jar文g都需要标讎ͼ有的时候会在Q务管理器中看?/SPAN>javaw.exe在运行,该E序l止后就可以本地的jar文g删除掉,说明q些本地文g可能q保留着文g锁定吧!有时即ɞ?/SPAN>Task Manager中将所有的javaE序?/SPAN>kill掉还是会出错Q必要注销windows才可以,不知道是不是Java Web Start

Q?/SPAN>3Q如果需要给*.jar文g传递参敎ͼ可以用如下代码:

   <application-desc main-class="XBFrame"/>

       <argument>-port</argument>

       <argument>1008</argument>    '' 要注?/SPAN>-port ?/SPAN>1008是两个参敎ͼ要分开?/SPAN>.

    </application-desc>

Q?/SPAN>4Q有的时候还需要看?/SPAN>*.jar?/SPAN>System.out.print语句输出的信息,p打开jws?/SPAN>consoleQ可以在jws manager 中的首选项中设|?/SPAN>

Q附注:Q?/SPAN>2Q、(3Q、(4Q照抄<Q?/SPAN>java web start实现关键问题(?/SPAN>)Q>一文)

Q?/SPAN>5Q如果出现失败,最基本的查错手D就是看看出错的“详l信息”,如下图所C?/SPAN>

 

单击“详l信息”按钮,出现下图

 

 

参考资?/H3>

http://www-900.ibm.com/developerWorks/cn/java/j-webstart/index.shtml

http://www-900.ibm.com/developerWorks/cn/linux/opensource/os-jws/index.shtml

http://www-900.ibm.com/developerWorks/cn/java/l-webstart/index.shtml#author1

http://dev.csdn.net/article/14/14216.shtm  学用Java Web Start 部v应用E序

   http://ecolab.ruc.edu.cn/new/Article_Show.asp?ArticleID=80    关于java的数字签?/SPAN>

http://www.51one.net/info/3291681715538397.htm   java web start实现关键问题(?/SPAN>)



]]>JAVAE序员面?2?http://m.tkk7.com/jackybu/articles/1540.html?/dc:creator>?/author>Sun, 27 Feb 2005 09:38:00 GMThttp://m.tkk7.com/jackybu/articles/1540.htmlhttp://m.tkk7.com/jackybu/comments/1540.htmlhttp://m.tkk7.com/jackybu/articles/1540.html#Feedback0http://m.tkk7.com/jackybu/comments/commentRss/1540.htmlhttp://m.tkk7.com/jackybu/services/trackbacks/1540.htmlW一Q谈谈final, finally, finalize的区别?/FONT>

W二QAnonymous Inner Class (匿名内部c? 是否可以extends(l承)其它c,是否可以implements(实现)interface(接口)?

W三QStatic Nested Class ?Inner Class的不同,说得多好(面试题有的很W统)?/FONT>

W四Q?amp;?amp;&的区别?/FONT>

W五QHashMap和Hashtable的区别?/FONT>

W六QCollection ?Collections的区别?/FONT>

W七Q什么时候用assert?/FONT>

W八QGC是什? Z么要有GC?

W九(ji)QString s = new String("xyz");创徏了几个String Object?

W十QMath.round(11.5){於多少? Math.round(-11.5){於多少?

W十一Qshort s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

W十二,sleep() ?wait() 有什么区?

W十三,Java有没有goto?

W十四,数组有没有length()q个Ҏ(gu)? String有没有length()q个Ҏ(gu)?

W十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的cd?

W十六,Set里的元素是不能重复的Q那么用什么方法来区分重复与否? 是用==q是equals()? 它们有何区别?

W十七,l我一个你最常见到的runtime exception?/FONT>

W十八,error和exception有什么区?

W十?ji),List, Set, Map是否l承自Collection接口?

W二十,abstract class和interface有什么区?

W二十一Qabstract的method是否可同时是static,是否可同时是nativeQ是否可同时是synchronized?

W二十二Q接口是否可l承接口? 抽象cL否可实现(implements)接口? 抽象cL否可l承实体c?concrete class)?

W二十三Q启动一个线E是用run()q是start()?

W二十四Q构造器Constructor是否可被override?

W二十五Q是否可以承Stringc?

W二十六Q当一个线E进入一个对象的一个synchronizedҎ(gu)后,其它U程是否可进入此对象的其它方?

W二十七Qtry {}里有一个return语句Q那么紧跟在q个try后的finally {}里的code会不会被执行Q什么时候被执行Q在return前还是后?

W二十八Q编E题: 用最有效率的Ҏ(gu)出2乘以8{於?

W二十九(ji)Q两个对象值相?x.equals(y) == true)Q但却可有不同的hash codeQ这句话对不?

W三十,当一个对象被当作参数传递到一个方法后Q此Ҏ(gu)可改变这个对象的属性,q可q回变化后的l果Q那么这里到底是g递还是引用传?

W三十一Qswtich是否能作用在byte上,是否能作用在long上,是否能作用在String?

W三十二Q编E题: 写一个Singleton出来?BR>
以下是答?BR>
W一Q谈谈final, finally, finalize的区别?BR>final—修饰符Q关键字Q如果一个类被声明ؓfinalQ意味着它不能再z出新的子c,不能作ؓ父类被ѝ因此一个类不能既被声明?abstract的,又被声明为final的。将变量或方法声明ؓfinalQ可以保证它们在使用中不被改变。被声明为final的变量必d声明时给定初|而在以后的引用中只能dQ不可修攏V被声明为final的方法也同样只能使用Q不能重?BR>finally—再异常处理时提?finally 块来执行M清除操作。如果抛Z个异常,那么相匹配的 catch 子句׃执行Q然后控制就会进?finally 块(如果有的话)?BR>finalize—方法名。Java 技术允怋?finalize() Ҏ(gu)在垃圾收集器对象从内存中清除出M前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对q个对象调用的。它是在 Object cM定义的,因此所有的c都l承了它。子c覆?finalize() Ҏ(gu)以整理系l资源或者执行其他清理工作。finalize() Ҏ(gu)是在垃圾攉器删除对象之前对q个对象调用的?/FONT>

W二QAnonymous Inner Class (匿名内部c? 是否可以extends(l承)其它c,是否可以implements(实现)interface(接口)?
匿名的内部类是没有名字的内部cR不能extends(l承) 其它c,但一个内部类可以作ؓ一个接口,由另一个内部类实现?/FONT>

W三QStatic Nested Class ?Inner Class的不同,说得多好(面试题有的很W统)?BR>Nested Class Q一般是C++的说法)QInner Class (一般是JAVA的说?。Java内部cMC++嵌套cL大的不同在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&page=1
注: 静态内部类QInner ClassQ意味着1创徏一个static内部cȝ对象Q不需要一个外部类对象Q?不能从一个static内部cȝ一个对象访问一个外部类对象

W四Q?amp;?amp;&的区别?BR>&是位q算W?amp;&是布?yu)逻辑q算W?/FONT>

W五QHashMap和Hashtable的区别?BR>都属于Map接口的类Q实C惟一键映到特定的g?BR>HashMap cL有分cL者排序。它允许一?null 键和多个 null 倹{?
Hashtable cM?HashMapQ但是不允许 null 键和 null 倹{它也比 HashMap 慢,因ؓ它是同步的?/FONT>

W六QCollection ?Collections的区别?BR>Collections是个java.util下的c,它包含有各种有关集合操作的静态方法?BR>Collection是个java.util下的接口Q它是各U集合结构的父接口?/FONT>


W七Q什么时候用assert?BR>断言是一个包含布?yu)表辑ּ的语句,在执行这个语句时假定该表辑ּ?true。如果表辑ּ计算?falseQ那么系l会报告一?AssertionError。它用于调试目的Q?
  assert(a > 0); // throws an AssertionError if a <= 0
断言可以有两UŞ式:    
  assert Expression1 ;
  assert Expression1 : Expression2 ;
Expression1 应该L产生一个布?yu)倹{?
Expression2 可以是得Z个值的L表达式。这个值用于生成显C更多调试信息的 String 消息?BR>断言在默认情况下是禁用的。要在编译时启用断言Q需要?source 1.4 标记Q?nbsp;
  javac -source 1.4 Test.java
要在q行时启用断aQ可使用 -enableassertions 或?-ea 标记?
要在q行旉择用断言Q可使用 -da 或?-disableassertions 标记?
要系l类中启用断aQ可使用 -esa 或?-dsa 标记。还可以在包的基上启用或者禁用断a?
可以在预计正常情况下不会到达的Q何位|上攄断言。断a可以用于验证传递给U有Ҏ(gu)的参数。不q,断言不应该用于验证传递给公有Ҏ(gu)的参敎ͼ因ؓ不管是否启用了断aQ公有方法都必须查其参数。不q,既可以在公有Ҏ(gu)中,也可以在非公有方法中利用断言试后置条g。另外,断言不应该以M方式改变E序的状态?


W八QGC是什? Z么要有GC? (基础)?BR>GC是垃圾收集器。Java E序员不用担心内存管理,因ؓ垃圾攉器会自动q行理。要h垃圾攉Q可以调用下面的Ҏ(gu)之一Q?
  System.gc()
  Runtime.getRuntime().gc()

W九(ji)QString s = new String("xyz");创徏了几个String Object?
两个对象Q一个是“xyx?一个是指向“xyx”的引用对象s?/FONT>

W十QMath.round(11.5){於多少? Math.round(-11.5){於多少?
Math.round(11.5)q回QlongQ?2QMath.round(-11.5)q回QlongQ?11;

W十一Qshort s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1;有错Qs1是short型,s1+1是int?不能昑ּ转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确?/FONT>

W十?/FONT>Qsleep() ?wait() 有什么区? 搞线E的最?BR>sleep()Ҏ(gu)是ɾU程停止一D|间的Ҏ(gu)。在sleep 旉间隔期满后,U程不一定立x复执行。这是因为在那个时刻Q其它线E可能正在运行而且没有被调度ؓ攑ּ执行Q除?a)“醒来”的U程h更高的优先
(b)正在q行的线E因为其它原因而阻塞?BR>wait()是线E交互时Q如果线E对一个同步对象x 发出一个wait()调用Q该U程会暂停执行,被调对象q入{待状态,直到被唤醒或{待旉到?/FONT>

 

W十?/FONT>QJava有没有goto?
Goto—java中的保留字,现在没有在java中用?/FONT>

W十?/FONT>Q数l有没有length()q个Ҏ(gu)? String有没有length()q个Ҏ(gu)Q?BR>数组没有length()q个Ҏ(gu)Q有length的属性?BR>String有有length()q个Ҏ(gu)?/FONT>

W十?/FONT>QOverload和Override的区别。Overloaded的方法是否可以改变返回值的cd?
Ҏ(gu)的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父cM子类之间多态性的一U表玎ͼ重蝲Overloading是一个类中多态性的一U表现。如果在子类中定义某Ҏ(gu)与其父类有相同的名称和参敎ͼ我们说该Ҏ(gu)被重?(Overriding)。子cȝ对象使用q个Ҏ(gu)Ӟ调用子cM的定义,对它而言Q父cM的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参C数或有不同的参数cdQ则UCؓҎ(gu)的重?Overloading)。Overloaded的方法是可以改变q回值的cd?/FONT>

W十?/FONT>QSet里的元素是不能重复的Q那么用什么方法来区分重复与否? 是用==q是equals()? 它们有何区别?
Set里的元素是不能重复的Q那么用iterator()Ҏ(gu)来区分重复与否。equals()是判M个Set是否相等?BR>equals()?=Ҏ(gu)军_引用值是否指向同一对象equals()在类中被覆盖Qؓ的是当两个分ȝ对象的内容和cd盔R的话Q返回真倹{?/FONT>

W十?/FONT>Q给我一个你最常见到的runtime exception?BR>ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

W十?/FONT>Qerror和exception有什么区?
error 表示恢复不是不可能但很困隄情况下的一U严重问题。比如说内存溢出。不可能指望E序能处理这L情况?BR>exception 表示一U设计或实现问题。也是_它表C如果程序运行正常,从不会发生的情况?/FONT>


W十?/FONT>QList, Set, Map是否l承自Collection接口?
ListQSet?/FONT>

Map不是

W二?/FONT>Qabstract class和interface有什么区?
声明Ҏ(gu)的存在而不d现它的类被叫做抽象类Qabstract classQ,它用于要创徏一个体现某些基本行为的c,qؓ该类声明Ҏ(gu)Q但不能在该cM实现该类的情c不能创建abstract cȝ实例。然而可以创Z个变量,其类型是一个抽象类Qƈ让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract cȝ子类为它们父cM的所有抽象方法提供实玎ͼ否则它们也是抽象cMؓ。取而代之,在子cM实现该方法。知道其行ؓ的其它类可以在类中实现这些方法?BR>接口QinterfaceQ是抽象cȝ变体。在接口中,所有方法都是抽象的。多l承性可通过实现q样的接口而获得。接口中的所有方法都是抽象的Q没有一个有E序体。接口只可以定义static final成员变量。接口的实现与子cȝ|除了该实现类不能从接口定义中l承行ؓ。当cd现特D接口时Q它定义Q即程序体l予Q所有这U接口的Ҏ(gu)。然后,它可以在实现了该接口的类的Q何对象上调用接口的方法。由于有抽象c,它允怋用接口名作ؓ引用变量的类型。通常的动态联~将生效。引用可以{换到接口cd或从接口cd转换Qinstanceof q算W可以用来决定某对象的类是否实现了接口?/FONT>

W二十一Qabstract的method是否可同时是static,是否可同时是nativeQ是否可同时是synchronized?
都不?/FONT>

W二十二Q接口是否可l承接口? 抽象cL否可实现(implements)接口? 抽象cL否可l承实体c?concrete class)?
接口可以l承接口。抽象类可以实现(implements)接口Q抽象类是否可承实体类Q但前提是实体类必须有明的构造函数?/FONT>

W二十三Q启动一个线E是用run()q是start()?
启动一个线E是调用start()Ҏ(gu)QɾU程所代表的虚拟处理机处于可运行状态,q意味着它可以由JVM调度q执行。这q不意味着U程׃立即q行。run()Ҏ(gu)可以产生必须退出的标志来停止一个线E?/FONT>

 

W二十四Q构造器Constructor是否可被override?
构造器Constructor不能被承,因此不能重写OverridingQ但可以被重载Overloading?/FONT>

W二十五Q是否可以承Stringc?
StringcLfinalcL不可以ѝ?/FONT>

W二十六Q当一个线E进入一个对象的一个synchronizedҎ(gu)后,其它U程是否可进入此对象的其它方?
不能Q一个对象的一个synchronizedҎ(gu)只能׃个线E访问?/FONT>

W二十七Qtry {}里有一个return语句Q那么紧跟在q个try后的finally {}里的code会不会被执行Q什么时候被执行Q在return前还是后?
会执行,在return前执行?/FONT>


W二十八Q编E题: 用最有效率的Ҏ(gu)出2乘以8{於?
有C背景的程序员特别喜欢问这U问题?/FONT>

2 << 3

W二十九(ji)Q两个对象值相?x.equals(y) == true)Q但却可有不同的hash codeQ这句话对不?
不对Q有相同的hash code?/FONT>

W三?/FONT>Q当一个对象被当作参数传递到一个方法后Q此Ҏ(gu)可改变这个对象的属性,q可q回变化后的l果Q那么这里到底是g递还是引用传?
是g递。Java ~程语言只由g递参数。当一个对象实例作Z个参数被传递到Ҏ(gu)中时Q参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变Q但对象的引用是永远不会改变的?/FONT>


W三十一Qswtich是否能作用在byte上,是否能作用在long上,是否能作用在String?
switchQexpr1Q中Qexpr1是一个整数表辑ּ。因此传递给 switch ?case 语句的参数应该是 int?short?char 或?byte。long,string 都不能作用于swtich?/FONT>

W三十二Q编E题: 写一个Singleton出来?BR>     Singleton模式主要作用是保证在Java应用E序中,一个类Class只有一个实例存在?BR>一般Singleton模式通常有几U种形式:
W一UŞ? 定义一个类Q它的构造函Cؓprivate的,它有一个static的private的该cd量,在类初始化时实例话,通过一个public的getInstanceҎ(gu)获取对它的引?l而调用其中的Ҏ(gu)?BR>public class Singleton {
  private Singleton(){}
  //在自己内部定义自׃个实例,是不是很奇怪?
  //注意q是private 只供内部调用
  private static Singleton instance = new Singleton();
  //q里提供了一个供外部讉K本class的静态方法,可以直接讉K  
  public static Singleton getInstance() {
    return instance;   
   }
}
W二UŞ?
public class Singleton {
  private static Singleton instance = null;
  public static synchronized Singleton getInstance() {
  //q个Ҏ(gu)比上面有所改进Q不用每ơ都q行生成对象Q只是第一ơ     
  //使用时生成实例,提高了效率!
  if (instance==null)
    instanceQnew Singleton();
return instance;   }
}
其他形式:
定义一个类Q它的构造函Cؓprivate的,所有方法ؓstatic的?BR>一般认为第一UŞ式要更加安全?
W三十三 Hashtable和HashMap
Hashtablel承自Dictionaryc,而HashMap是Java1.2引进的Map interface的一个实?

HashMap允许null作ؓ一个entry的key或者valueQ而Hashtable不允?

q有是QHashMap把Hashtable的containsҎ(gu)L了,Ҏ(gu)containsvalue和containsKey。因为containsҎ(gu)Ҏ(gu)让h引v误解?

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是Q在
多个U程讉KHashtableӞ不需要自׃ؓ它的Ҏ(gu)实现同步Q而HashMap
必Mؓ之提供外同步?

Hashtable和HashMap采用的hash/rehash法都大概一P所以性能不会有很大的差异?/FONT>



]]>
对Java同步一些理?http://m.tkk7.com/jackybu/articles/1539.html?/dc:creator>?/author>Sun, 27 Feb 2005 09:37:00 GMThttp://m.tkk7.com/jackybu/articles/1539.htmlhttp://m.tkk7.com/jackybu/comments/1539.htmlhttp://m.tkk7.com/jackybu/articles/1539.html#Feedback0http://m.tkk7.com/jackybu/comments/commentRss/1539.htmlhttp://m.tkk7.com/jackybu/services/trackbacks/1539.html对Java同步一些理?BR>kingfish 2005
------------------------------------------------------------
基本概念:
  每个Object都会?个锁.
  同步是串行使用一些资?

(说明:以下有些例子ZH出重点,省略了不必要的代?特别是省掉了一些成员变?是需要同步的对象.)

1. 多线E中对共享、可变的数据q行同步.
   对于函数中的局部变量没必要q行同步.
   对于不可变数?也没必要q行同步.

   多线E中讉K׃n可变数据才有必要.


2. 单个U程中可以用synchronized,而且可以嵌套,但无意义.
   class Test {
     public static void main(String[] args) {
         Test t = new Test();
         synchronized(t) {
           synchronized(t) {
              System.out.println("ok!");
           }
         }
     }
   }
  
3. 对象实例的锁
   class Test{
     public synchronized void f1(){
         //do something here
     }

     public void f2(){
        synchronized(this){
           //do something here
         }
     }
   }
 
   上面的f1()和f2()效果一? synchronized取得的锁都是Test某个实列(this)的锁.
   比如: Test t = new Test();
         U程A调用t.f2()? U程B无法q入t.f1(),直到t.f2()l束.

   作用: 多线E中讉KTest的同一个实例的同步Ҏ(gu)时会q行同步.

4. class的锁
   class Test{
       final static Object o= new Object();

       public static synchronized void f1(){
          //do something here
       }
 
       public static void f2(){
         synchronized(Test.class){
           //do something here
         }
       }
  
      public static void f3(){
        try {
          synchronized (Class.forName("Test")) {
          //do something here
          }
        }
        catch (ClassNotFoundException ex) {
        }
      }
     
       public static void g(){
          synchronized(o){
            //do something here
          }
       }
   }

   上面f1(),f2(),f3(),g()效果一?BR>   f1(),f2(),f3()中synchronized取得的锁都是Test.class的锁.
  
   g()是自׃生一个对象o,利用o的锁做同?BR>   作用: 多线E中讉K此类或此cMQ一个实例的同步Ҏ(gu)旉会同? singleton模式lazily initializing属于此类.

5. static method
   class Test{
      private static int v = 0;

      public static void f1(){
        //do something, 但函C没用用到v
      }

      public synchronized static void f2(){
        //do something, 函数中对vq行了读/?
      }  
   }

   多线E中使用Test的某个实列时,
    (1) f1()是线E安全的,不需要同?BR>    (2) f2()q个静态方法中使用了函数外静态变?所以需要同?

6.  对线E的run()q行同步没有意义,?public synchronized void run()
    class Test extends Thread{
      public synchronized void run(){
        while(true){
           //do something
        }
      }
     
      public synchronized void f(){
         //...
      }
    }
    q种例子会有一个问? 执行run()?内部在@?, 外部无法执行f()


    class Test extends Thread{
       public synchronized void run(){
         //do something
       }
    }
    q种例子同步基本没用, 因ؓrun()通常?new Test().start()来执行的.
    因ؓTest实例不同,锁也不同.



]]>
JDK1.5 最新特?http://m.tkk7.com/jackybu/articles/1206.html?/dc:creator>?/author>Tue, 15 Feb 2005 03:22:00 GMThttp://m.tkk7.com/jackybu/articles/1206.htmlhttp://m.tkk7.com/jackybu/comments/1206.htmlhttp://m.tkk7.com/jackybu/articles/1206.html#Feedback0http://m.tkk7.com/jackybu/comments/commentRss/1206.htmlhttp://m.tkk7.com/jackybu/services/trackbacks/1206.html请先看以下两D代码(分别选自 Core Java 5E ?Core Java 7EQ,不同之处已用蓝色表明?BR>
    E序一Q?BR>    public class Welcome
    {
       public static void main(String[] args)
       {
          String[] greeting = new String[3];
          greeting[0] = "Welcome to Core Java";
          greeting[1] = "by Cay Horstmann";
          greeting[2] = "and Gary Cornell";
   
          for (int i = 0; i < greeting.length; i++)
             System.out.println(greeting[i]);
       }
    }

    E序二:
    public class Welcome
    {
       public static void main(String[] args)
       {
          String[] greeting = new String[3];
          greeting[0] = "Welcome to Core Java";
          greeting[1] = "by Cay Horstmann";
          greeting[2] = "and Gary Cornell";
   
          for (String g : greeting)
             System.out.println(g);

       }
    }

    q两个程序输出的l果是相同的Q均为:
    Welcome to Core Java
    by Cay Horstmann
    and Gary Cornell

    而程序二如果使用JDK1.4或以下版本编译就会出错,使用1.5则可利通过。这说明了此?FONT color=#0000ff>Q?/FONT>”操作符是JDK1.5新加的特性之一?/FONT>



]]>Java异常学习心得http://m.tkk7.com/jackybu/articles/1197.html?/dc:creator>?/author>Tue, 15 Feb 2005 03:00:00 GMThttp://m.tkk7.com/jackybu/articles/1197.htmlhttp://m.tkk7.com/jackybu/comments/1197.htmlhttp://m.tkk7.com/jackybu/articles/1197.html#Feedback0http://m.tkk7.com/jackybu/comments/commentRss/1197.htmlhttp://m.tkk7.com/jackybu/services/trackbacks/1197.htmlJava异常学习心得

本文重在Java中异常机制的一些概c写本文的目的在于方便我很长旉后若是忘了这些东西可以通过q片文章q速回忆v来?/P>

1. 异常机制
1.1 异常机制是指当程序出现错误后Q程序如何处理。具体来_异常机制提供了程序退出的安全通道。当出现错误后,E序执行的流E发生改变,E序的控制权转移到异常处理器?BR>1.2 传统的处理异常的办法是,函数q回一个特D的l果来表C出现异常(通常q个Ҏ(gu)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 异常的分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的异常的特点
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例如试图从文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(hun)的?/P>

3 异常的用方?BR>3.1 声明Ҏ(gu)抛出异常 
3.1.1 语法QthrowsQ略Q?BR>3.1.2 Z么要声明Ҏ(gu)抛出异常Q?BR>Ҏ(gu)是否抛出异常与方法返回值的cd一样重要。假设方法抛出异常确没有声明该方法将抛出异常Q那么客L序员可以调用q个Ҏ(gu)而且不用~写处理异常的代码。那么,一旦出现异常,那么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Ҏ(gu)的子cL法不能抛出比父类Ҏ(gu)更多的异常,所以,有时设计父类的方法时会声明抛出异常,但实际的实现Ҏ(gu)的代码却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束Ҏ(gu)制器的搜索也会停止?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 应该声明Ҏ(gu)抛出异常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>

4 关于异常的其他问?BR>4.1 q度使用异常
首先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()Ҏ(gu)可以分别得到异常对象的额外信息、类名和调用堆栈的信息。ƈ且后一U包含的信息是前一U的集?BR>



]]>
关于接口的简单解?http://m.tkk7.com/jackybu/articles/1098.html?/dc:creator>?/author>Sat, 12 Feb 2005 15:23:00 GMThttp://m.tkk7.com/jackybu/articles/1098.htmlhttp://m.tkk7.com/jackybu/comments/1098.htmlhttp://m.tkk7.com/jackybu/articles/1098.html#Feedback0http://m.tkk7.com/jackybu/comments/commentRss/1098.htmlhttp://m.tkk7.com/jackybu/services/trackbacks/1098.html自己d现汽车如何{向,只要告诉其它的其它部Ӟ我调用{向的时候你们就l我转。。。?BR>
写接口一般是高行ؓQ做设计的时候用的多Q当两个E序员要怺调用的各自的E序的时?BR>应该通过接口来调用,隐藏实现l节Q对方要啥方法,我就在接口中定义q个几个Ҏ(gu)Q?BR>如何实现不用Ҏ(gu)知道Q他知道调用q个几个Ҏ(gu)p了,其它的相关的Ҏ(gu)Ҏ(gu)不用Ҏ(gu)知道Q?BR>q就辑ֈ了隐藏细节的目的Q减差错!


]]>
[转帖]学java i/o库要掌握的三个关键知识点 http://m.tkk7.com/jackybu/articles/1092.html?/dc:creator>?/author>Sat, 12 Feb 2005 15:15:00 GMThttp://m.tkk7.com/jackybu/articles/1092.htmlhttp://m.tkk7.com/jackybu/comments/1092.htmlhttp://m.tkk7.com/jackybu/articles/1092.html#Feedback0http://m.tkk7.com/jackybu/comments/commentRss/1092.htmlhttp://m.tkk7.com/jackybu/services/trackbacks/1092.html大家讨论java i/o库很久了, PaleSting也刚发了<<初 Java I/O lD>>pd文章,但我估计q是有些读者会觉得java i/o库难以琢?所以也来凑凑热?说说我认为的学习java i/o库要掌握的三个关键知识点??xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

知识点一: 四大{l构

java语言的i/o库提供了四大{l构:InputStream,OutputStream,Reader,Writer四个pd的类。InputStream和OutputStream处理8位字节流数据, Reader和Writer处理16位的字符数据。InputStream和Reader处理输入, OutputStream和Writer处理输出。大家一定要?/SPAN>J2SE文档中看看这四大{l构的类l承体系?SPAN lang=EN-US>

除了q四大系列类,i/o库还提供了少数的辅助c?其中比较重要的是InputStreamReader和OutputStreamWriter。InputStreamReader把InputStream适配为Reader, OutputStreamWriter把OutputStream适配为Writer;q样架起了字节处理类和字W流处理c间的桥梁?o:p>

(zhn)?SPAN lang=EN-US>i/o库时,只要按以上的规则,到相应的cMpML(zhn)需要的cd可?o:p>

知识点二: 适配功能

java i/o库中的承不是普通的l承;它的l承模式分ؓ两种,其一是Adapter模式(具体分析请参?lt;

InputStream?个直接子c?ByteArrayInputStream,FileInputStream,PipedInputStream,StringBufferInputStream,FilterInputStream,ObjectInputStream?/SPAN>SequenceInputStream。前四个采用?SPAN lang=EN-US>Adapter模式,如FileInputStream部分代码如下:

Public class FileInputStream extends InputStream

{

??? /* File Descriptor - handle to the open file */

??? private FileDescriptor fd;

??? public FileInputStream(FileDescriptor fdObj)

?{

?? ? SecurityManager security = System.getSecurityManager();

?? ? if (fdObj == null) {

?? ??? throw new NullPointerException();

?? ? }

?? ? if (security != null) {

?? ??? security.checkRead(fdObj);

?? ? }

?? ??? fd = fdObj;

?}

?//其他代码

}

可见,FileInputStreaml承?/SPAN>InputStream,l合?/SPAN>FileDescriptor,采用的是对象Adapter模式。我们学?SPAN lang=EN-US>i/o库时,主要应该掌握q四?/SPAN>对象Adapter模式的适配?/SPAN>: ByteArrayInputStream?/SPAN>适配源是Byte数组, FileInputStream的适配源是File对象, PipedInputStream?/SPAN>适配源是PipedOutputStream对象, StringBufferInputStream的适配源是String对象。其它三个系列类的学习方法与此相同?o:p>

知识点三: Decorator功能

InputStream的其它三个直接子c采用的是Decorator模式,<

Public class FilterInputStream extends InputStream {

??? /**

???? * The input stream to be filtered.

???? */

??? protected InputStream in;

??? protected FilterInputStream(InputStream in) {

?? ???? this.in = in;

??? }

??? //其它代码

}

?看清楚没?/SPAN>? FilterInputStreaml承?/SPAN>InputStream,也引用了InputStream,而它有四个子c?/SPAN>,q就是所谓的Decorator模式。我们暂时可以不ؓ什么要用Decorator模式,但我们现在应该知?因ؓInputStreamq有其它的几个子c?/SPAN>,所以我们可以将其它子类作ؓ参数来构?/SPAN>FilterInputStream对象!q是我们开发时常用的功?/SPAN>,代码CZ如下:

{

//从密钥文件中d?/SPAN>

?? SecretKey key=null;??

?? ObjectInputStream keyFile=new ObjectInputStream(

??????? new FileInputStream("c:\\安全文g\\对称密钥\\yhb.des"));

??? key=(SecretKey)keyFile.readObject();

??? keyFile.close();

?? }

?上面的代码中, ObjectInputStream也是InputStream的子c?/SPAN>,也用了Decorator功能,不过,q你不懂也不想?/SPAN>Decorator模式,只要C本文l出?/SPAN>FilterInputStream 的两D代码即?/SPAN>?SPAN lang=EN-US>

掌握了以上三?SPAN lang=EN-US>,怿我们已经能够很好的应用java i/o库?/SPAN>



]]>
վ֩ģ壺 ˳ɸ߲| һ˿| Avһ| hƵѸ߹ۿ| պҹTVӰԺ| ߹ۿ˳Ƶ| ޹ۺһ | Ļ| ޾ƷþþþYW| ëƬѹۿ| ߹ۿƵѹ| þþþav| ŷ| aѹۿվ| ձ| videos| avһ| ޸Ʒһ| Ƶۿ| aëƬƵ| Ʒȫѹۿ| 91Ӱ| һëƬȫ| ëƬaëƬѹۿƷ| ޳AƬ߹ۿWWW| ˬִֻ̼վ| ձzzzzwwwƬ| պ˳ۺձ| ޾Ʒ߹ۿ| 24СʱƵ| ˾þþƷӰԺ| ƷþþþþĻ| ձһ߹ۿ| þþƷƵ| һƵ| Ů18һëƬѹۿ| ëƬպëƬ| ٸԼA | պƷƵһ| Ļ| Ʒһ|