??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲人成影院77777,亚洲精品自偷自拍无码,国产成人亚洲综合网站不卡http://www2.blogjava.net/gufen/category/3587.htmlzh-cnWed, 28 Feb 2007 14:51:35 GMTWed, 28 Feb 2007 14:51:35 GMT60JDK5.0?1个主要新特征http://www.tkk7.com/gufen/archive/2005/10/15/15567.html落花飞雪落花飞雪Sat, 15 Oct 2005 04:15:00 GMThttp://www.tkk7.com/gufen/archive/2005/10/15/15567.htmlhttp://www.tkk7.com/gufen/comments/15567.htmlhttp://www.tkk7.com/gufen/archive/2005/10/15/15567.html#Feedback1http://www.tkk7.com/gufen/comments/commentRss/15567.htmlhttp://www.tkk7.com/gufen/services/trackbacks/15567.html阅读全文

落花飞雪 2005-10-15 12:15 发表评论
]]>
Win32下Swt-Designer4.1.1与MyEclipse4.0的破解方法及注册?/title><link>http://www.tkk7.com/gufen/archive/2005/09/27/14184.html</link><dc:creator>落花飞雪</dc:creator><author>落花飞雪</author><pubDate>Tue, 27 Sep 2005 05:05:00 GMT</pubDate><guid>http://www.tkk7.com/gufen/archive/2005/09/27/14184.html</guid><wfw:comment>http://www.tkk7.com/gufen/comments/14184.html</wfw:comment><comments>http://www.tkk7.com/gufen/archive/2005/09/27/14184.html#Feedback</comments><slash:comments>44</slash:comments><wfw:commentRss>http://www.tkk7.com/gufen/comments/commentRss/14184.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/gufen/services/trackbacks/14184.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>Win32</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US>Swt-Designer<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">4.1.1</st1:chsdate></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">破解</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境Q?/SPAN><SPAN lang=EN-US>win32</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/SPAN><SPAN lang=EN-US>Eclipse3.1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/SPAN><SPAN lang=EN-US>Designer_v<st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">4.1.1</st1:chsdate></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">1Q?SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先?/SPAN><SPAN lang=EN-US><A >http://www.swt-designer.com/</A></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">左边?/SPAN><SPAN lang=EN-US>download</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">菜单点击q去后下?/SPAN><SPAN lang=EN-US>Edition for Eclipse 3.1 & 3.2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q下载后的文件名?/SPAN><SPAN lang=EN-US>Designer_v<st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">4.1.1</st1:chsdate>_for_Eclipse3.1.zip<IMG height=283 alt=Snap2.gif src="http://www.tkk7.com/images/blogjava_net/gufen/001.swt.myeclipse.crack/Snap2.gif" width=606 border=0><BR></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><SPAN lang=EN-US><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:shapetype id=_x0000_t75 coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">2Q?SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后在我的网l硬盘中下蝲破解文g</SPAN><SPAN lang=EN-US>: <A >http://www.thefilehut.com/userfiles/gufen/forblog/swt.designer.pro.keygen.for.eclipse.3.1.rar</A></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">3Q?SPAN style="FONT: 7pt 'Times New Roman'">  </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解压后在</SPAN><SPAN lang=EN-US>cmd</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">命o中敲?/SPAN><SPAN lang=EN-US>swt.ui.bat</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q运行后出现以下界面Q输入框中的内容Q然后点?/SPAN><SPAN lang=EN-US>Generate</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">产生序列号和Ȁzȝ?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><IMG height=241 alt=Snap3.gif src="http://www.tkk7.com/images/blogjava_net/gufen/001.swt.myeclipse.crack/Snap3.gif" width=377 border=0><BR>如果你所使用的环境和版本不是</SPAN><SPAN lang=EN-US>win32</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/SPAN><SPAN lang=EN-US>Eclipse3.1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/SPAN><SPAN lang=EN-US>Designer_v<st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">4.1.1</st1:chsdate></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q请参照</SPAN><SPAN lang=EN-US><A >http://blog.chinaz.com/u1/530/archives/2005/1789.shtml</A></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来进行破解。这U情况下需要:</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -9pt; mso-list: l2 level2 lfo2; tab-stops: list 45.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">a)<SPAN style="FONT: 7pt 'Times New Roman'"> </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">该目录下的</SPAN><SPAN lang=EN-US>org.eclipse.swt.win32.win32.x86_<st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">3.1.0</st1:chsdate>.jar</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US>swt-win32-3138.dll</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">删除</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -9pt; mso-list: l2 level2 lfo2; tab-stops: list 45.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">b)</SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US>Eclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目录下找?/SPAN><SPAN lang=EN-US>swt.jar</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q名字视版本而定Q?/SPAN><SPAN lang=EN-US>eclipse3.1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下是</SPAN><SPAN lang=EN-US>org.eclipse.swt.win32.win32.x86_<st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">3.1.0</st1:chsdate>.jar</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/SPAN> <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US>swt-win32-2135.dll</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q名字视版本而定Q?/SPAN><SPAN lang=EN-US>eclipse3.1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下是</SPAN><SPAN lang=EN-US>swt-win32-3138.dll</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/SPAN><SPAN lang=EN-US>2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个文Ӟ拯?/SPAN><SPAN lang=EN-US>swt.ui.bat</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所在的目录?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -9pt; mso-list: l2 level2 lfo2; tab-stops: list 45.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">c)</SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">修改</SPAN><SPAN lang=EN-US>swt.ui.bat,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如这P</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 21pt; mso-para-margin-left: 3.43gd"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">原来?/SPAN><SPAN lang=EN-US>: start javaw -cp SWTDesigner_<st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">2.0.0</st1:chsdate>_Keygen.jar;<SPAN style="COLOR: red">org.eclipse.swt.win32.win32.x86_3.1.0.jar</SPAN> swtdesigner.keygen.SWTUI</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 21pt; mso-para-margin-left: 3.43gd"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">修改?/SPAN><SPAN lang=EN-US>:start javaw -cp SWTDesigner_<st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">2.0.0</st1:chsdate>_Keygen.jar;<SPAN style="COLOR: red">swt.jar</SPAN> swtdesigner.keygen.SWTUI</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 36pt; TEXT-INDENT: 21pt; mso-para-margin-left: 3.43gd"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">U色Z改的地方Q然后运行后?/SPAN><SPAN lang=EN-US>Version</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">填入你下载的</SPAN><SPAN lang=EN-US>swt-designer</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本号即可生注册码?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><SPAN lang=EN-US></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo3; tab-stops: list 21.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">4.<SPAN style="FONT: 7pt 'Times New Roman'">         </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下载的</SPAN><SPAN lang=EN-US>Designer_v<st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">4.1.1</st1:chsdate>_for_Eclipse3.1.zip</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">插g安装?/SPAN><SPAN lang=EN-US>eclipse,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果你不知道如何安装插g请在</SPAN><SPAN lang=EN-US>google</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里搜索这斚w的文章,应该很多的。我也是q样走过来的?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q行</SPAN><SPAN lang=EN-US>eclipse,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">打开</SPAN><SPAN lang=EN-US>window->preferences?></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选择左边树Ş中的</SPAN><SPAN lang=EN-US>designer(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果没有q一说?/SPAN><SPAN lang=EN-US>swt-designer</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">插g没有安装成功</SPAN><SPAN lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US>-></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">点击右下的?/SPAN><SPAN lang=EN-US>Registration and Activation</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US>-></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">弹出?/SPAN><SPAN lang=EN-US>Product Registration and Activation</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”框Q用默认直接点击</SPAN><SPAN lang=EN-US>Next-></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q一步需要注意的?/SPAN><SPAN lang=EN-US>Name</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框中两个字符串之间要有个I格Q他会认Z个是姓一个是名,否则</SPAN><SPAN lang=EN-US>Next</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">按钮一直是灰的Q其他随便填Q?/SPAN><SPAN lang=EN-US>email</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框中要合?/SPAN><SPAN lang=EN-US>email</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">格式可以了</SPAN><SPAN lang=EN-US>-></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输入破解产生的序列号和激zȝ</SPAN><SPAN lang=EN-US>-></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">昄?/SPAN><SPAN lang=EN-US>Activation is complete. Thank you.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”表C破解成?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现在可以免费?/SPAN><SPAN lang=EN-US>swt-designer</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN lang=EN-US><o:p> </o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>Win32</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US>MyEclipse4.0</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">破解</SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q个破解h很简单,先去</SPAN><SPAN lang=EN-US>http://www.myeclipseide.com</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下蝲</SPAN><SPAN lang=EN-US>Myeclipse4.0,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后?/SPAN><SPAN lang=EN-US><A >http://www.thefilehut.com/userfiles/gufen/forblog/MyEclipse-4.0.0-GA.Keygen.zip</A></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下蝲破解。安?/SPAN><SPAN lang=EN-US>Myeclipse,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之后解压破解文g后运?/SPAN><SPAN lang=EN-US>keygen.bat</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q生一?/SPAN><SPAN lang=EN-US>key</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q之后在</SPAN><SPAN lang=EN-US>Myeclipse</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注册一下就可以了?SPAN lang=EN-US>Myeclipse我忘C么地Ҏ(gu)册了Q好像装?SPAN lang=EN-US>Myeclipse后在preferences中的<SPAN lang=EN-US>Myeclipse里点几下׃弹出来个框,把key copyq去认可以了?BR><BR>以上破解Ҏ(gu)仅供个h学习Q请支持正版?形式Q?</SPAN></SPAN></SPAN></SPAN></P><img src ="http://www.tkk7.com/gufen/aggbug/14184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/gufen/" target="_blank">落花飞雪</a> 2005-09-27 13:05 <a href="http://www.tkk7.com/gufen/archive/2005/09/27/14184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Effective Java》笔?选择?njchenyi ?Blog)http://www.tkk7.com/gufen/archive/2005/09/25/13993.html落花飞雪落花飞雪Sun, 25 Sep 2005 07:24:00 GMThttp://www.tkk7.com/gufen/archive/2005/09/25/13993.htmlhttp://www.tkk7.com/gufen/comments/13993.htmlhttp://www.tkk7.com/gufen/archive/2005/09/25/13993.html#Feedback0http://www.tkk7.com/gufen/comments/commentRss/13993.htmlhttp://www.tkk7.com/gufen/services/trackbacks/13993.html有别人写好的W记Q不用自p写了。对于看qEffective Java的偶而忘记某个条目,看看W记或许能记h?/DIV>
 
Creating and Destroying Object
Item 1:考虑用静态工厂方法替代构造器
例如Qpublic static Boolean valueOf(boolean b)
     {
          return (b?Boolean.TRUE:Boolean.FALSE);
     }
q样的好处是Ҏ(gu)有名字,q且它可以复用对象,不像构造器每次调用都生新的对象。其ơ它q可以返回返回类型的子类。不好的地方是如果没有public or protected构造器的类不能被l承。还有就是静态工厂方法的名字和其他的静态方法名字不Ҏ(gu)区分?/DIV>
Item 2:通过dU有构造器来加强单例属性(singletom property)
例如Qpublic class Hello
            {
                  private static final Hello Instance = new Hell();
                  private Hello()
                  {}
                   
                    public static Hello getInstance()
                      {
                     return Instance;
                     }
            }
q个U有构造器只能在内部被使用Q确保了单例模式Q?BR>Item 3:避免创徏重复的对?BR>对不可修改的对象量q行复用Q这h率和性能都会提高。例如如果@?00ơString s = new String("hello")创?00个对?循环100ơString s = "hello";则只创徏了一个对象。很好的q行了复用?/DIV>
Item 4:用私有构造器来避免被实例?BR>例如public UtilityClass
{
   private UtilityClass()
   {}
///
}
通常那些工具cLq么设计?/DIV>
Item 5:消除l对的对象引?BR>     虽然java中用gc来管理内存,但是如果不注意的话也会生“内存泄漏”。例如下面的E序
public class Stack
{
 private Object[] elements;
 private int size = 0;
 
 public Stack(int i)
 {
  this.elements = new Object[i];
 }
 
 public void push(Object e)
 {
  ensure();
  elements[size++] = e;
 }
 
 public Object pop()
 {
  if(size == 0)
  {
   ////
  }
 
  return elements[size--];
 }
 
 private void ensure()
 {
  ////
 }
}
标记的地方存在着内存泄漏的问题,因ؓ当他被弹出栈的时候,它也没有成ؓ可回收的垃圾对象QStackl护着他们的绝对的引用。将不能更改。改q的Ҏ(gu)是如下的写法
 public Object pop()
 {
  if(size == 0)
  {
   ////
  }
  Object obj = elements[--size];
  elements[size] = null;
 
  return obj;
 }
 但是切忌不要滥用null?/DIV>
Item 6:避免finalizer
垃圾回收器是低线E别运行的且不能被执行。System.gc()只是垃圾回收器收集垃圾,它可不一定马上运行,而且垃圾回收器运行的时候会挂v其他U程DE序停止响应。推荐用的Ҏ(gu)cM?BR>InputStream is = null;
try
{
      is = /////;
}
finally
{
      is.close();
}
Methods Common to All Objects
item 7:当你覆盖equalsҎ(gu)的时候一定要遵守general contact
   覆盖equals的时候一定要加倍的心Q其实最好的办法是不覆盖这个方法。比如在下面的情况下可以不覆盖
   1q个cȝ每个实例都是唯一的,例如Threadc?/DIV>
   2 如果你不兛_q个cL否该提供一个测试逻辑相等的方?/DIV>
   3类已经覆盖了equalsҎ(gu)Qƈ且它合适子cM?/DIV>
   4如果q个cLprivate或者是package-private的,q且你确信他不会被调?/DIV>
   但是当我们要个类提供区分逻辑相等和引用相{的Ҏ(gu)的时候,我们必要覆盖q个Ҏ(gu)了。例如Stringc,DatecȝQ覆盖的时候我们一定要遵从general contactQ说白了是一个合同。合同的主要内容?BR>   1Qx.equals(x)必须q回true
   2Qx.equalsQyQ当且仅当y.equals(x)q回true的时候返回true
   3Qx.equals(y)q回trueQy.equals(z)q回true,那么x.equals(z)必须q回true
   4.如果没有M修改得话 那么多次调用x.equals(y)的返回值应该不?BR>   5QQ何时候非I的对象x,x.equals(null)必须q回false
下面是作者的如何正确的覆盖equalsҎ(gu)
1Q?nbsp; ?=查是否参数就是这个对象的引用
2Q?nbsp; 用instanceof判断参数的类型是否正?BR>3Q?nbsp; 把参数{换成合适的cd
4Q?nbsp; 比较cȝ字段是不是匹?/DIV>
例如Q?BR>public boolean equals(Object o)
{
       if(o== this) return true;
       if(!(o instanceof xxxx) return false;
       xxx in = (xxx)o;
       return …?.
}
最后一点要注意的时候不要提供这LҎ(gu)public boolean equals(MyClass o)q样是重载ƈ不是覆盖Object的equalsҎ(gu)
item 8 :当你覆盖equals的时候必覆盖hashCodeҎ(gu)
    q点必须切忌Q不然在你和hash-based集合打交道的时候,错误׃出现了。关键问题在于一定要满相等的对象必要有相{的hashCode。如果你在PhoneNumbercM覆盖了equalsҎ(gu)Q但是没有覆盖hashCodeҎ(gu)Q那么当你做如下操作的时候就会出现问题了?BR>Map m = new HashMap();
m.put(new PhoneNumber(408,863,3334),”ming?
当你调用m.get(new PhoneNumber(408,863,3334))的时候你希望得到ming但是你却得到了null,Z么呢因ؓ在整个过E中有两个PhoneNumber的实例,一个是put一个是getQ但是他们两个逻辑相等的实例却得到不同的hashCode那么怎么可以取得以前存入的ming呢?/DIV>
 
Item 9:永远覆盖toStringҎ(gu)
    在Object的toStringҎ(gu)q回的Ş式是Class的类型加上@加上16q制的hashcode。你最好在自己的类中提供toStringҎ(gu)更好的表q实例的信息Q不然别人怎么看得明白呢?/DIV>
Item 10:覆盖clone()Ҏ(gu)的时候一定要心
    一个对象要惌CloneQ那么要实现Clone()接口Q这个接口没有定义Q何的Ҏ(gu)Q但是如果你不实现这个接口的话,调用cloneҎ(gu)的时候会出现CloneNotSupportedExceptionQ这是作者叫做mixin的接口类型。通常clone()Ҏ(gu)可以q样覆盖
public Object clone()
{
try
{
              return super.clone();
}
catch(CloneNotSupportedException e)
{}
}
但是当你要clone的类里面含有可修改的引用字段的时候,那么你一定要把整个类的蓝图进行复Ӟ如果对你clone得到的对象进行修改的时候还会媄响到原来的实例,那么q是不可取的。所以应该这样clone()
public Object clone() throws CloneNotSupportedException
{
       Stack Result  = (Stack)super.clone();
       Result.elements = (Object[])elements.clone();
       Return result;
}
其中elements是stackcM可修改的引用字段Q注意如果elements是final的话我们无能ؓ力了Q因Z能给他重新赋g.其实如果不是必须的话Q根本就不用它最好?/DIV>
 
Item 11:考虑适当的时候覆盖Comparable接口
     Thinking in java上说的更清楚Q这里不多少了?/DIV>
    来发现这是一本难得的好书QJavaE序员不看这本书的话真是很遗憾。本章讲q的是类和接口相关的问题。这几个Item都非帔R?
Item 12Q把cd成员的可讉K范围降到最?BR>    好的模块设计应该最大可能封装好自己的内部信息,q样可以把模块之间的耦合E度降到最低。开发得以ƈ行,无疑q将加快开发的速度Q便于系l地l护。Java中通过讉K控制W来解决q个问题?/DIV>
public表示q个cdM范围都可用?
protected表示只有子类和包内的cd以?
private-package(default)表示在包内可?
private表示只有cd才可以用
你在设计一个类的时候应该尽量的按照4321得顺序设计。如果一个类只是被另一个类使用Q那么应该考虑把它设计成这个类的内部类。通常public的类不应该有public得字D,不过我们通常会用一个类来定义所有的帔RQ这是允许的。不q必M证这些字D要么是基本数据cd要么引用指向的对象是不可修改的。不然他们将可能被修攏V例如下面的定义中data是不合理的Q后面两个没有问题?BR>public class Con
{
      public static final int[] data = {1,2,3};// it is bad
      public static final String hello = "world";
      public static final int i = 1;
}
Item 13:不可修改的类更受青睐
    不可修改的类意思是他们一l创建就不会改变Q例如StringcR他们的设计、实现都很方便,安全性高——它们是U程安全的。设计不可修改类有几点规则:
不要提供M可以修改对象的方?
保没有Ҏ(gu)能够被覆盖,可以通过把它声明为final
所有字D设计成final
所有字D设计成private
保外部不能讉K到类的可修改的组?BR>不可修改cM有个~点是创徏不同值得cȝ时候要创徏不同的对象,String是q样的。通常有个解决的办法就是提供一个帮助类来I补,例如StringBuffercR?BR>Item 14:化合(合成Q比l承更值得考虑
      实现代码重用最重要的办法就是承,但是l承破坏了封装,D软g的键壮性不뀂如果子cȝ承了父类Q那么它从父cȝ承的Ҏ(gu)׃赖父cȝ实现Q一旦他改变了会D不可预测的结果。作者介l了InstrumentedHashSet作ؓ反例q行说明Q原因就是没有明白父cȝҎ(gu)实现。作者给出的解决办法是通过化合来代替承,用包装类和{发方法来解决问题。把x展的cM为本cȝ一个private final得成员变量。把Ҏ(gu)参数传递给q个成员变量q得到返回倹{这样做的缺Ҏ(gu)q样的类不适合回掉框架。承虽然好Q我们却不应该滥用,只有我们能确定它们之间是is-a得关pȝ时候才使用?/DIV>
Item 15:如果要用l承那么设计以及文档都要有质量保证,否则׃要用?/DIV>
    Z避免l承带来的问题,你必L供精的文档来说明覆盖相x法可能出现的问题。在构造器内千万不要调用可以被覆盖的方法,因ؓ子类覆盖Ҏ(gu)的时候会出现问题?BR>import java.util.*;
public class SubClass extends SuperClass
{
 private final Date date;
 
 public SubClass()
 {
  date = new Date();
 }
 
 public void m()
 {
  System.out.println(date);
 }
 
 public static void main(String[] args)
 {
  SubClass s = new SubClass();
  s.m();
 }
 
}
class SuperClass
{
 public SuperClass()
 {
  m();
 }
 
 public void m()
 {
 
 }
}
׃在date被初始化之前superQ)已经被调用了Q所以第一ơ输出null而不是当前的旉?BR>׃在Clone()或者序列化的时候非常类似构造器的功能,因此readObject()和cloneQ)Ҏ(gu)内最好也不要包括能被覆盖的方法?/DIV>
Item 16:在接口和抽象cM间优先选择前?/DIV>
      接口和抽象类都用来实现多态,不过我们应该优先考虑用接口。知道吗QJames说过如果要让他重新设计java的话他会把所有都设计成接口的。抽象类的优Ҏ(gu)方便扩展Q因为它是被l承的,q且Ҏ(gu)可以在抽象类内实玎ͼ接口则不行?/DIV>
Item 17Q接口只应该用来定义cd
      接口可以q样用的 Collection c = new xxxx();q是我们最常用的。不要把接口用来做其他的事情Q比如常量的定义。你应该定义一个类Q里面包含public final static 得字Dc?/DIV>
Item 18: 在静态和非静态内部类之间选择前?/DIV>
      如果一个类被定义在其他的类内部那么它就是嵌套类Q可以分为静态内部类、非静态内部类和匿名类?BR>   static member class 得目的是为enclosing class服务Q如果还有其他的目的Q就应该把它设计成top-level class。nonstatic member class是和enclosing class instance兌的,如果不需要访问enclosing class instance的话应该把它设计成static得,不然会浪Ҏ(gu)间和I间。anonymous class是声明和初始化同时进行的。可以放在代码的L位置。典型应用是Listener 和process object例如Thread?/DIV>
    ׃以前学过C语言Q所以对Cq是蛮有感情Q而JAVA和C又有很多怼之处Q很多从C转过来学习JAVA的兄弟,可能一开始都不是很适应Q因为很多在C里面的结构在JAVA里面都不能用了Q所以下面我们来介绍一下C语言l构的替代?/DIV>
      Item 19:用类代替l构
     JAVA刚面世的时候,很多CE序员都认ؓ用类来代替结构现在太复杂Q代价太大了Q但是实际上Q如果一个JAVA的类退化到只包含一个数据域的话Q这LcMC语言的结构大致是{h(hun)的?/DIV>
      比方说下面两个程序片D:
      class Point
      {
       private float x;
       private float y;
      }
      实际上这D代码和C语言的结构基本上没什么区别,但是q段代码恐怕是众多OO设计Fans所不的,因ؓ它没有体现封装的优异性,没有体现面向对象设计的优点,当一个域被修改的时候,你不可能再采取Q何辅助的措施了,那我们再来看一看采用包含私有域和共有访问方法的OO设计代码D:
     class Point
      {
       private float x;
       private float y;
       public Point(float x,float y)
       {
             this.x=x;
             this.y=y;
       }
        public float getX(){retrun x;}
        public float getY(){return y;}
        public void setX(float x){this.x=x;}
        public void setY(float y){this.y=y;}
      }
        单从表面上看Q这D代码比上面那个多了很多行,q多了很多函敎ͼ但是仔细想一下,q样的OO设计Q似乎更人性化Q我们可以方面的对值域q行提取Q修改等操作Q而不直接和值域发生关系Q这L代码不仅让hҎ(gu)LQ而且很安全,q吸取了面向对象E序设计的灵zL,试想一下,如果一个共有类暴露它的值域Q那么想要在来的版本中q行修改是impossible的,因ؓ共有cȝ客户代码已经遍布各处了?BR>需要提醒一点的是,如果一个类是包U私有的Q或者是一个私有的嵌套c,则直接暴露其值域q无不妥之处?/DIV>
Item 20Q用cdơ来代替联合
我们在用C语言来进行开发的时候,l常会用到联合这个概念,比如Q?BR>       typedef struct{
     double length;
     double width;    
}rectangleDimensions_t;
那我们在JAVA里面没有联合q个概念Q那我们用什么呢Q对Q用l承Q这也是JAVA最吸引我的地方之一Q它可以使用更好的机制来定义耽搁数据cdQ在Bruce Eckel的Thinking in java里面也多ơ提C一个和形状有关的例子,我们可以先笼l的定义一个抽象类Q即我们通常所指的类Q每个操作定义一个抽象的Ҏ(gu)Q其行ؓ取决于标{|如果q有其他的操作不依赖于标{|则把操作变成根类Q承的c)中的具体Ҏ(gu)?BR>q样做的最重要的优Ҏ(gu)Q类层次提供了类型的安全性?BR>其次代码非常明了Q这也是OO设计的优炏V?BR>而且它很Ҏ(gu)扩展Q即使是面向多个斚w的工作,能够同样胜Q?BR>最后它可以反映q些cd之间本质上的层次关系Q从而允许更强的灉|性,以便~译时类型检查?/DIV>
Item 21Q用cL代替enuml构
JavaE序设计语言提出了类型安全枚丄模式来替代enuml构Q它的基本思想很简单:定义一个类来代表枚丄型的单个元素Qƈ且不提供M公有的构造函敎ͼ相反Q提供公有静态finalc,使枚丄型中的每一个常量都对应一个域?BR>cd安全枚Dcd的一个缺Ҏ(gu)Q装载枚丄的和构造常量对象时Q需要一定的旉和空间开销Q除非是在资源很受限制的讑֤比如蜂窝?sh)哈和烤面包ZQ否则在实际中这个问题不会被考虑?BR> MQ类型安全枚丄型明显优于intcdQ除非实在一个枚丄型主要被用做一个集合元素,或者主要用在一个资源非怸受限的环境下Q否则类型安全枚丄型的~点都不成问题,依次Q在要求使用一个枚丄型的环境下,我们首先应考虑cd安全枚Dcd模式?/DIV>
Item 22Q用cd接口来代替函数指?BR>众所周知QJAVA语言和C的最大区别在于,前者去掉了指针Q小生第一ơ接触JAVA的时候觉得好不习惯,因ؓH然一下子没了指针Q觉得好不方面啊QC语言的精髓在于其指针的运用,而JAVA却把它砍掉了Q让人好生郁P不过随着旉的推U,我渐渐明白了用类和接口的应用也同样可以提供同L功能Q我们可以直接定义一个这样一个类Q他的方法是执行其他Ҏ(gu)上的操作Q如果一个类仅仅是导样一个方法,那么它实际上是一个指向该Ҏ(gu)的指针,举个例子Q?BR>class StringLengthComprator{
public int compare(String s1,String s2)
{
return s1.length()-s2.length();
}
}
q个cdZ个带两个字符串的Ҏ(gu)Q它是一个用于字W串比较的具体策略。它是无状态的Q没有域Q所以,q个cȝ所有实例在功能上都是等LQ可以节省不必要的对象创建开销。但是我们不好直接把q个cM递给可户使用Q因为可h法传递Q何其他的比较{略。相反,我们可以定义一个接口,x们在设计具体{略cȝ时候还需要定义一个策略接口:
      public interface Comparator{
           public int compare(Object o1,Object o2);
}
  我们完全可以依照自己的需要来定义它?BR>具体的策略类往往使用匿名cd明?BR>在JAVA中,我们Z实现指针的模式,声明一个接口来表示该策略,q且为每个具体策略声明一个实C该接口的c,如果一个具体策略只被用一ơ的话,那么通常使用匿名cL声明和实例化q个具体{略c,如果一个策略类反复使用Q那么它的类通常是一个私有的的静态成员类?
下面我们来讨Z下有x法设计的几个斚wQ下面说的几个要点大多数都是应用在构造函CQ当然也使用于普通方法,我们q求的依然是E序的可用性,健壮性和灉|性?/DIV>
Item 23Q检查参数的有效?/DIV>
非公有的Ҏ(gu)我们应该用断a的方法来查它的参敎ͼ而不是用通常大家所熟?zhn)的检查语句来。如果我们用的开发^台是JDK1.4或者更高的^収ͼ我们可以使用assertl构Q否则我们应该用一U时的断言机制?BR>有些参数在用过E中是先保存hQ然后在使用的时候再q行调用Q构造函数正是这U类型的一U体玎ͼ所以我们通常Ҏ(gu)造函数参数的有效性检查是非常仔细的?/DIV>
Item 24Q需要时使用保护性拷?BR>众所周知QJAVA在代码安全性方面较C/C++有显著的提高Q缓冲区溢出Q数l越界,非法指针{等Q我们的JAVA都有一个很完善的机制来q行免疫Q但是这q不代表我们不必去考虑JAVA的安全性,即便在安全的语言Q如果不采取措施Q还是无法自己与其他类隔开。假讄的客户会一切手D|破坏q个cȝU束条gQ在q样的前提下Q你必须从保护性的斚w来考虑设计E序。通过大量的程序代码研I我们得Ll论Q对于构造性函数的每个可变参数q行保护性拷贝是必要的。需要注意的是,保护性拷贝是在检查参数的有效性之?q行的,q且有效性检查是针对拯之后的对象,而不是原始的对象。对于“参数类型可以被不可信方子类化”的情况Q不要用cloneҎ(gu)来进行参数的保护性拷贝?BR>对于参数的保护性拷贝ƈ不仅仅在于非可变c,当我们编写一个函数或者一个构造函数的时候,如果它要接受客户提供的对象,允许该对象进入到内部数据l构中,则有必要考虑一下,客户提供的对象是否是可变的,如果是,则要考虑其变化的范围是否在你的程序所能容U的范围内,如果不是Q则要对对象q行保护性拷贝,q且让拷贝之后的对象而不是原始对象进入到数据l构中去。当然最好的解决Ҏ(gu)是用非可变的对象作Z的对象内部见,q样你就可以不必兛_保护性拷贝问题了。)Q?/DIV>
Item 25Q}慎用设计方法的原型
Q?Q}慎的选择Ҏ(gu)的名字:卌注意首先要是易于理解的,其次q要与该包中的其他方法的命名风格怸_最后当然要注意取一个大众所认可的名字?BR>Q?Q不要追求提供便利的Ҏ(gu)Q每一个方法都应该提供其应具备的功能点Q对于接口和cLҎ(gu)不要q多Q否则会对学习用维护等{方面带来许多不必要的麻烦,对于每一个类型所支持的每一个动作,都提供一个功能完全的Ҏ(gu)Q只有一个方法过于频J的使用Ӟ才考虑为它提供一个快h法?BR>Q?Q避免过长的参数列表Q通常在实践中Q我们以三个参数作ؓ最大|参数少好Q类型相同的长参数列其影响客户的用,两个Ҏ(gu)可以避免q长的参数这L情况发生Q一是把一个方法分解成多个Q每一个方法只要求使用q些参数的一个子集;二是创徏辅助c,用来保存参数的聚集,q些辅助cȝ状态通常是静态的?BR>对于参数cdQ优先用接口而不是类?BR>q样做的目的是避免媄响效能的拯操作?BR>谨慎的用函数对象?BR>创徏函数对象最Ҏ(gu)的方法莫q于使用匿名c,但是那样会带来语法上混ؕQƈ且与内联的控制结构相比,q样也会D功能上的局限性?/DIV>
Item 26Q}慎的使用重蝲
到底是什么造成了重载机制的h法Q这是个争论的话题,一个安全而保守的Ҏ(gu)是,永远不要导出两个h相同参数数目的重载方法。而对于构造函数来_一个类的多个构造函数L重蝲的,在某些情况下Q我们可以选择静态工厂,但是对于构造函数来说这样做q不L切合实际的?BR>当涉及到构造函数时Q遵循这条徏议也许是不可能的Q但我们应该极力避免下面的情形:
同一l参数只需要经q类型的转换可以传递给不同的重载方法。如果这样做也不能避免的话,我们臛_要保证一点:当传递同L参数Ӟ所有的重蝲Ҏ(gu)行ؓ一致。如果不能做到这一点,E序员就不能有效的用方法或者构造函数?/DIV>
Item 27Q返回零长度的数l而不是null
因ؓq样做的原因是编写客L序的E序员可能忘记写q种专门的代码来处理nullq回倹{没有理׃一个取数组值的Ҏ(gu)中返回nullQ而不是返回一个零长度数组?/DIV>
Item 28Qؓ所有导出的API元素~写文档注释
不爱写注释可能是大多数程序员新手的通病Q包括偶哈~Q,但是如果惌一个API真正可用Q就必须写一个文档来说明它,保持代码和文档的同步是一件比较烦琐的事情QJAVA语言环境提供了javadoc工具Q从而ɘq个烦琐的过E变得容易,q个工具可以Ҏ(gu)源代码自动生API文档?BR>Z正确得编写API文档Q我们必L一个被导出的类Q接口,构造函敎ͼҎ(gu)和域声明之前加一个文档注释?BR>每一个方法的文档注释应该见解的描q它和客户之间的U定?BR>我们接下来讨Z下Java语言的细节,包括局部变量的处理Q库的用,以及两种不是语言本n提供的机制的使用{等一些大家^时可能忽略的问题?/DIV>
Item 29:局部变量的作用域最化
和C语言要求局部变量必被生命在代码的开始处相比QJavaE序设计语言宽松得多Q它允许你在代码的Q何位|声明。要想一个局部变量的作用域最化Q最高小的技术是在第一ơ需要用它的地方声明,变量的作用域是从声明它的地方开始到q个声明做在的代码块的结束位止,如果我们把变量的声明和代码的使用位置分开的过大,那么对于读这D代码的人来_是很不幸的?BR>我们几乎都是在一个局部变量声明的地方同时l它初始化,注意q是很重要的Q甚x时候,如果我们的初始化应该推迟C一个代码的位置Q我们同时应该把声明也往后gq。这条规则唯一的例外是try-catchq个语句Q因为如果一个变量被Ҏ(gu)初始化,那么q个Ҏ(gu)很有可能抛出一个异常,那我们最常用的方法就是把它置于try块的内部去进行初始化。由此我们可以得出,for循环优于while循环Q我们在能用for循环的地方尽量用for而不使用whileQ因为for循环是完全独立的Q所以重用@环变量名字不会有M伤害?BR>最后我们要C的是量把我们的函数写的而集中,q样才能真正l做到”最化局部变量的作用域”这一要旨?/DIV>
Item 30Q了解和使用?BR>使用标准库,我们可以充分利用~写q些库的Java专家的知识,以及在你之前其他人的使用l验Q这是所谓站在巨人的肩膀上看世界吧~
在每一个Javaq_的发行版本里面,都会有许多新的包的加入,和这些更C持一直是值得的,比如说我们J2ME的开发,在MIDP 1.0的时代,我们要写个Gameq要自己动手写工LQ现在MIDP2.0推出之后Q大多数写游戏的人都觉得方便了很多,因ؓ在这个版本里面加入了游戏包,为我们的开发节省了大量的h力物力?/DIV>
Item 31Q如果想要知道精的{案Q就要避免用double和float
     对于金融行业来说Q对数据的严整性要求是很高的,不容半点马虎Q那大家都知道再我们的Java语言里面有两个QҎ(gu)cd的变量float和doubleQ可能大家会认ؓ他们的精度对于金融行业这样对数字敏感的行业来_已经够用了,但是在开发当中,我们要尽量少使用double和floatQ因他们_的表?.1是不可能的。那我们如何解决q个问题呢,{案是用BigDecimal,int或者longq行货币计算。在q里对大家的忠告是:对于商务q算Q我们尽量用BigDecimalQ对于性能要求较高的地方,我们有能力自己处理十q制的小数点Q数g太大的时候,我们可以使用int或者longQ根据自q需要来判定具体使用哪一个,如果范围过?8位数Q那我们必须使用BigDecimal?/DIV>
Item 32Q如果其他类型更适合Q则量避免使用字符?BR>     在偶看到q条之前Q我很喜欢用字W串Q不在什么场合下Q先String了再_但是实际上很多情况下Q我们要Ҏ(gu)实际情况来判定到底用什么类型,而且字符串不适合替代枚DcdQ类型安全枚丄型和int值都比字W串更适合用来表示枚Dcd的常量。字W串也不适合替代聚集cdQ有一个更好的Ҏ(gu)是单的写一个类来描q这个数据集Q通常是一个私有的静态成员类最好。字W串也不适合代替能力表,总而言之,如果可以适合更加适合的数据类型,或者可以编写更加适当的数据类型,那么应该避免使用字符串来表示对象?/DIV>
Item 33Q了解字W串的连接功?BR>我们l常在用System.out.println()的时候,往括号里写一串用?”连接v来的字符Ԍq是我们最常见的,但是q个Ҏ(gu)q不适合规模较大的情形,接N个字W串而重复地使用字符串连接操作符Q要求N的^方的时_q是因ؓ字符串是非可变的Q这导致了在字W串q行q接的时候,前后两者都要拷贝,q个时候我们就提倡用StingBuffer替代String?/DIV>
Item 34Q通过接口引用对象
通俗的说是量优先使用接口而不是类来引用对象,如果有合适的接口存在那么对用参敎ͼq回|变量域都应该使用接口cdL使用接口作ؓ对象的习惯,会ɽE序变得更加灉|?BR>如果没有合适的接口Q那么,用类而不是接口来引用一个对象,是完全合适的?/DIV>
Item 35Q接口优先于映像机制
java.lang.relect提供了“通过E序来访问关于已装蝲的类的信息”,由此Q我们可以通过一个给定的Class实例Q获得Constructor,Method和Field实例?BR>映像机制允许一个类使用另一个类Q即使当前编译的时候后者还不存在,但是q种能力也要付出代h(hun)Q?BR>我们损失了了~译时类型检查的好处Q而且要求执行映像讉K的代码非常笨拙和冗长Qƈ且在性能上大大损失?BR>通常Q普通应用在q行时刻不应以映像方式访问对象?/DIV>
Item 36Q}慎的使用本地Ҏ(gu)
JNI允许Java应用E序调用本地Ҏ(gu)Q所谓本地方法是指用本地E序设计语言Q如CQC++Q来~写的特D方法,本地Ҏ(gu)可以在本地语a执行M计算dQ然后返回到JavaE序设计语言中。但是随着JDK1.3及后l版本的推出q种通过使用本地Ҏ(gu)来提高性能的方法已不值得提倡,因ؓ现在的JVM来快了,而且使用本地Ҏ(gu)有一些严重的~点Q比如Java原本引以为傲的安全性荡然无存,M在用本地方法的时候要三思?/DIV>
Item 37Q}慎用优?BR>不要因ؓ性能而牺牲合理的代码l构Q努力编写好的程序而不是快的程序,但是避免那些限制性能的设计决定,同时考虑自己设计的API军_的性能后果Qؓ了获得更好的性能而对APIq行修改q也是一个非怸好的xQ通常我们在做优化之后Q都应该对优化的E度q行一些测量?/DIV>
Item 38Q遵守普遍接受的命名惯例
Java有一套比较完善的命名惯例机制Q大部分包含在《The Java Language Specification》,严格得讲q些惯例分成两类Q字面的和语法的?BR>字面涉及包,c,接口Q方法和域,语法的命名惯例比较灵z,所以争议更大,字面惯例是非常直接和明确的,而语法惯例则相对复杂Q也很松散。但是有一个公认的做法是:“如果长期养成的习惯用法与此不同的话Q请不要盲目遵从
Item 12Q把cd成员的可讉K范围降到最?BR>    好的模块设计应该最大可能封装好自己的内部信息,q样可以把模块之间的耦合E度降到最低。开发得以ƈ行,无疑q将加快开发的速度Q便于系l地l护。Java中通过讉K控制W来解决q个问题?/DIV>
public表示q个cdM范围都可用?
protected表示只有子类和包内的cd以?
private-package(default)表示在包内可?
private表示只有cd才可以用
你在设计一个类的时候应该尽量的按照4321得顺序设计。如果一个类只是被另一个类使用Q那么应该考虑把它设计成这个类的内部类。通常public的类不应该有public得字D,不过我们通常会用一个类来定义所有的帔RQ这是允许的。不q必M证这些字D要么是基本数据cd要么引用指向的对象是不可修改的。不然他们将可能被修攏V例如下面的定义中data是不合理的Q后面两个没有问题?BR>public class Con
{
      public static final int[] data = {1,2,3};// it is bad
      public static final String hello = "world";
      public static final int i = 1;
}
Item 13:不可修改的类更受青睐
    不可修改的类意思是他们一l创建就不会改变Q例如StringcR他们的设计、实现都很方便,安全性高——它们是U程安全的。设计不可修改类有几点规则:
不要提供M可以修改对象的方?
保没有Ҏ(gu)能够被覆盖,可以通过把它声明为final
所有字D设计成final
所有字D设计成private
保外部不能讉K到类的可修改的组?BR>不可修改cM有个~点是创徏不同值得cȝ时候要创徏不同的对象,String是q样的。通常有个解决的办法就是提供一个帮助类来I补,例如StringBuffercR?/DIV>
Item 14:化合(合成Q比l承更值得考虑
      实现代码重用最重要的办法就是承,但是l承破坏了封装,D软g的键壮性不뀂如果子cȝ承了父类Q那么它从父cȝ承的Ҏ(gu)׃赖父cȝ实现Q一旦他改变了会D不可预测的结果。作者介l了InstrumentedHashSet作ؓ反例q行说明Q原因就是没有明白父cȝҎ(gu)实现。作者给出的解决办法是通过化合来代替承,用包装类和{发方法来解决问题。把x展的cM为本cȝ一个private final得成员变量。把Ҏ(gu)参数传递给q个成员变量q得到返回倹{这样做的缺Ҏ(gu)q样的类不适合回掉框架。承虽然好Q我们却不应该滥用,只有我们能确定它们之间是is-a得关pȝ时候才使用?/DIV>
Item 15:如果要用l承那么设计以及文档都要有质量保证,否则׃要用?/DIV>
    Z避免l承带来的问题,你必L供精的文档来说明覆盖相x法可能出现的问题。在构造器内千万不要调用可以被覆盖的方法,因ؓ子类覆盖Ҏ(gu)的时候会出现问题?BR>import java.util.*;
public class SubClass extends SuperClass
{
 private final Date date;
 
 public SubClass()
 {
  date = new Date();
 }
 
 public void m()
 {
  System.out.println(date);
 }
 
 public static void main(String[] args)
 {
  SubClass s = new SubClass();
  s.m();
 }
 
}
class SuperClass
{
 public SuperClass()
 {
  m();
 }
 
 public void m()
 {
 
 }
}
׃在date被初始化之前superQ)已经被调用了Q所以第一ơ输出null而不是当前的旉?BR>׃在Clone()或者序列化的时候非常类似构造器的功能,因此readObject()和cloneQ)Ҏ(gu)内最好也不要包括能被覆盖的方法?/DIV>
Item 16:在接口和抽象cM间优先选择前?BR>      接口和抽象类都用来实现多态,不过我们应该优先考虑用接口。知道吗QJames说过如果要让他重新设计java的话他会把所有都设计成接口的。抽象类的优Ҏ(gu)方便扩展Q因为它是被l承的,q且Ҏ(gu)可以在抽象类内实玎ͼ接口则不行?/DIV>
Item 17Q接口只应该用来定义cd
      接口可以q样用的 Collection c = new xxxx();q是我们最常用的。不要把接口用来做其他的事情Q比如常量的定义。你应该定义一个类Q里面包含public final static 得字Dc?/DIV>
Item 18: 在静态和非静态内部类之间选择前?BR>      如果一个类被定义在其他的类内部那么它就是嵌套类Q可以分为静态内部类、非静态内部类和匿名类?BR>   static member class 得目的是为enclosing class服务Q如果还有其他的目的Q就应该把它设计成top-level class。nonstatic member class是和enclosing class instance兌的,如果不需要访问enclosing class instance的话应该把它设计成static得,不然会浪Ҏ(gu)间和I间。anonymous class是声明和初始化同时进行的。可以放在代码的L位置。典型应用是Listener 和process object例如Thread?/DIV>
    ׃以前学过C语言Q所以对Cq是蛮有感情Q而JAVA和C又有很多怼之处Q很多从C转过来学习JAVA的兄弟,可能一开始都不是很适应Q因为很多在C里面的结构在JAVA里面都不能用了Q所以下面我们来介绍一下C语言l构的替代?/DIV>
Item 19:用类代替l构
      JAVA刚面世的时候,很多CE序员都认ؓ用类来代替结构现在太复杂Q代价太大了Q但是实际上Q如果一个JAVA的类退化到只包含一个数据域的话Q这LcMC语言的结构大致是{h(hun)的?BR>      比方说下面两个程序片D:
      class Point
      {
       private float x;
       private float y;
      }
      实际上这D代码和C语言的结构基本上没什么区别,但是q段代码恐怕是众多OO设计Fans所不的,因ؓ它没有体现封装的优异性,没有体现面向对象设计的优点,当一个域被修改的时候,你不可能再采取Q何辅助的措施了,那我们再来看一看采用包含私有域和共有访问方法的OO设计代码D:
      class Point
      {
       private float x;
       private float y;
       public Point(float x,float y)
       {
             this.x=x;
             this.y=y;
       }
        public float getX(){retrun x;}
        public float getY(){return y;}
        public void setX(float x){this.x=x;}
        public void setY(float y){this.y=y;}
      }
        单从表面上看Q这D代码比上面那个多了很多行,q多了很多函敎ͼ但是仔细想一下,q样的OO设计Q似乎更人性化Q我们可以方面的对值域q行提取Q修改等操作Q而不直接和值域发生关系Q这L代码不仅让hҎ(gu)LQ而且很安全,q吸取了面向对象E序设计的灵zL,试想一下,如果一个共有类暴露它的值域Q那么想要在来的版本中q行修改是impossible的,因ؓ共有cȝ客户代码已经遍布各处了?BR>需要提醒一点的是,如果一个类是包U私有的Q或者是一个私有的嵌套c,则直接暴露其值域q无不妥之处?/DIV>
Item 20Q用cdơ来代替联合
我们在用C语言来进行开发的时候,l常会用到联合这个概念,比如Q?BR>       typedef struct{
     double length;
     double width;    
}rectangleDimensions_t;
那我们在JAVA里面没有联合q个概念Q那我们用什么呢Q对Q用l承Q这也是JAVA最吸引我的地方之一Q它可以使用更好的机制来定义耽搁数据cdQ在Bruce Eckel的Thinking in java里面也多ơ提C一个和形状有关的例子,我们可以先笼l的定义一个抽象类Q即我们通常所指的类Q每个操作定义一个抽象的Ҏ(gu)Q其行ؓ取决于标{|如果q有其他的操作不依赖于标{|则把操作变成根类Q承的c)中的具体Ҏ(gu)?BR>q样做的最重要的优Ҏ(gu)Q类层次提供了类型的安全性?BR>其次代码非常明了Q这也是OO设计的优炏V?BR>而且它很Ҏ(gu)扩展Q即使是面向多个斚w的工作,能够同样胜Q?BR>最后它可以反映q些cd之间本质上的层次关系Q从而允许更强的灉|性,以便~译时类型检查?/DIV>
Item 21Q用cL代替enuml构
JavaE序设计语言提出了类型安全枚丄模式来替代enuml构Q它的基本思想很简单:定义一个类来代表枚丄型的单个元素Qƈ且不提供M公有的构造函敎ͼ相反Q提供公有静态finalc,使枚丄型中的每一个常量都对应一个域?BR>cd安全枚Dcd的一个缺Ҏ(gu)Q装载枚丄的和构造常量对象时Q需要一定的旉和空间开销Q除非是在资源很受限制的讑֤比如蜂窝?sh)哈和烤面包ZQ否则在实际中这个问题不会被考虑?BR> MQ类型安全枚丄型明显优于intcdQ除非实在一个枚丄型主要被用做一个集合元素,或者主要用在一个资源非怸受限的环境下Q否则类型安全枚丄型的~点都不成问题,依次Q在要求使用一个枚丄型的环境下,我们首先应考虑cd安全枚Dcd模式?/DIV>
Item 22Q用cd接口来代替函数指?BR> class StringLengthComprator{
public int compare(String s1,String s2)
{
return s1.length()-s2.length();
}
}
q个cdZ个带两个字符串的Ҏ(gu)Q它是一个用于字W串比较的具体策略。它是无状态的Q没有域Q所以,q个cȝ所有实例在功能上都是等LQ可以节省不必要的对象创建开销。但是我们不好直接把q个cM递给可户使用Q因为可h法传递Q何其他的比较{略。相反,我们可以定义一个接口,x们在设计具体{略cȝ时候还需要定义一个策略接口:
      public interface Comparator{
           public int compare(Object o1,Object o2);
}
  我们完全可以依照自己的需要来定义它?BR>在JAVA中,我们Z实现指针的模式,声明一个接口来表示该策略,q且为每个具体策略声明一个实C该接口的c,如果一个具体策略只被用一ơ的话,那么通常使用匿名cL声明和实例化q个具体{略c,如果一个策略类反复使用Q那么它的类通常是一个私有的的静态成员类?
下面我们来讨Z下有x法设计的几个斚wQ下面说的几个要点大多数都是应用在构造函CQ当然也使用于普通方法,我们q求的依然是E序的可用性,健壮性和灉|性?/DIV>
Item 23Q检查参数的有效?BR>非公有的Ҏ(gu)我们应该用断a的方法来查它的参敎ͼ而不是用通常大家所熟?zhn)的检查语句来。如果我们用的开发^台是JDK1.4或者更高的^収ͼ我们可以使用assertl构Q否则我们应该用一U时的断言机制?BR>有些参数在用过E中是先保存hQ然后在使用的时候再q行调用Q构造函数正是这U类型的一U体玎ͼ所以我们通常Ҏ(gu)造函数参数的有效性检查是非常仔细的?/DIV>
Item 24Q需要时使用保护性拷?BR>众所周知QJAVA在代码安全性方面较C/C++有显著的提高Q缓冲区溢出Q数l越界,非法指针{等Q我们的JAVA都有一个很完善的机制来q行免疫Q但是这q不代表我们不必去考虑JAVA的安全性,即便在安全的语言Q如果不采取措施Q还是无法自己与其他类隔开。假讄的客户会一切手D|破坏q个cȝU束条gQ在q样的前提下Q你必须从保护性的斚w来考虑设计E序。通过大量的程序代码研I我们得Ll论Q对于构造性函数的每个可变参数q行保护性拷贝是必要的。需要注意的是,保护性拷贝是在检查参数的有效性之?q行的,q且有效性检查是针对拯之后的对象,而不是原始的对象。对于“参数类型可以被不可信方子类化”的情况Q不要用cloneҎ(gu)来进行参数的保护性拷贝?BR>对于参数的保护性拷贝ƈ不仅仅在于非可变c,当我们编写一个函数或者一个构造函数的时候,如果它要接受客户提供的对象,允许该对象进入到内部数据l构中,则有必要考虑一下,客户提供的对象是否是可变的,如果是,则要考虑其变化的范围是否在你的程序所能容U的范围内,如果不是Q则要对对象q行保护性拷贝,q且让拷贝之后的对象而不是原始对象进入到数据l构中去。当然最好的解决Ҏ(gu)是用非可变的对象作Z的对象内部见,q样你就可以不必兛_保护性拷贝问题了。)Q?/DIV>
Item 25Q}慎用设计方法的原型
Q?Q}慎的选择Ҏ(gu)的名字:卌注意首先要是易于理解的,其次q要与该包中的其他方法的命名风格怸_最后当然要注意取一个大众所认可的名字?BR>Q?Q不要追求提供便利的Ҏ(gu)Q每一个方法都应该提供其应具备的功能点Q对于接口和cLҎ(gu)不要q多Q否则会对学习用维护等{方面带来许多不必要的麻烦,对于每一个类型所支持的每一个动作,都提供一个功能完全的Ҏ(gu)Q只有一个方法过于频J的使用Ӟ才考虑为它提供一个快h法?BR>Q?Q避免过长的参数列表Q通常在实践中Q我们以三个参数作ؓ最大|参数少好Q类型相同的长参数列其影响客户的用,两个Ҏ(gu)可以避免q长的参数这L情况发生Q一是把一个方法分解成多个Q每一个方法只要求使用q些参数的一个子集;二是创徏辅助c,用来保存参数的聚集,q些辅助cȝ状态通常是静态的?BR>对于参数cdQ优先用接口而不是类?BR>q样做的目的是避免媄响效能的拯操作?BR>谨慎的用函数对象?BR>创徏函数对象最Ҏ(gu)的方法莫q于使用匿名c,但是那样会带来语法上混ؕQƈ且与内联的控制结构相比,q样也会D功能上的局限性?/DIV>
Item 26Q}慎的使用重蝲
到底是什么造成了重载机制的h法Q这是个争论的话题,一个安全而保守的Ҏ(gu)是,永远不要导出两个h相同参数数目的重载方法。而对于构造函数来_一个类的多个构造函数L重蝲的,在某些情况下Q我们可以选择静态工厂,但是对于构造函数来说这样做q不L切合实际的?BR>当涉及到构造函数时Q遵循这条徏议也许是不可能的Q但我们应该极力避免下面的情形:
同一l参数只需要经q类型的转换可以传递给不同的重载方法。如果这样做也不能避免的话,我们臛_要保证一点:当传递同L参数Ӟ所有的重蝲Ҏ(gu)行ؓ一致。如果不能做到这一点,E序员就不能有效的用方法或者构造函数?/DIV>
Item 27Q返回零长度的数l而不是null
因ؓq样做的原因是编写客L序的E序员可能忘记写q种专门的代码来处理nullq回倹{没有理׃一个取数组值的Ҏ(gu)中返回nullQ而不是返回一个零长度数组?/DIV>
Item 28Qؓ所有导出的API元素~写文档注释
不爱写注释可能是大多数程序员新手的通病Q包括偶哈~Q,但是如果惌一个API真正可用Q就必须写一个文档来说明它,保持代码和文档的同步是一件比较烦琐的事情QJAVA语言环境提供了javadoc工具Q从而ɘq个烦琐的过E变得容易,q个工具可以Ҏ(gu)源代码自动生API文档?BR>Z正确得编写API文档Q我们必L一个被导出的类Q接口,构造函敎ͼҎ(gu)和域声明之前加一个文档注释?BR>每一个方法的文档注释应该见解的描q它和客户之间的U定?BR>我们接下来讨Z下Java语言的细节,包括局部变量的处理Q库的用,以及两种不是语言本n提供的机制的使用{等一些大家^时可能忽略的问题?/DIV>
Item 29:局部变量的作用域最化
和C语言要求局部变量必被生命在代码的开始处相比QJavaE序设计语言宽松得多Q它允许你在代码的Q何位|声明。要想一个局部变量的作用域最化Q最高小的技术是在第一ơ需要用它的地方声明,变量的作用域是从声明它的地方开始到q个声明做在的代码块的结束位止,如果我们把变量的声明和代码的使用位置分开的过大,那么对于读这D代码的人来_是很不幸的?BR>我们几乎都是在一个局部变量声明的地方同时l它初始化,注意q是很重要的Q甚x时候,如果我们的初始化应该推迟C一个代码的位置Q我们同时应该把声明也往后gq。这条规则唯一的例外是try-catchq个语句Q因为如果一个变量被Ҏ(gu)初始化,那么q个Ҏ(gu)很有可能抛出一个异常,那我们最常用的方法就是把它置于try块的内部去进行初始化。由此我们可以得出,for循环优于while循环Q我们在能用for循环的地方尽量用for而不使用whileQ因为for循环是完全独立的Q所以重用@环变量名字不会有M伤害?BR>最后我们要C的是量把我们的函数写的而集中,q样才能真正l做到”最化局部变量的作用域”这一要旨?/DIV>
Item 30Q了解和使用?BR>使用标准库,我们可以充分利用~写q些库的Java专家的知识,以及在你之前其他人的使用l验Q这是所谓站在巨人的肩膀上看世界吧~
在每一个Javaq_的发行版本里面,都会有许多新的包的加入,和这些更C持一直是值得的,比如说我们J2ME的开发,在MIDP 1.0的时代,我们要写个Gameq要自己动手写工LQ现在MIDP2.0推出之后Q大多数写游戏的人都觉得方便了很多,因ؓ在这个版本里面加入了游戏包,为我们的开发节省了大量的h力物力?/DIV>
Item 31Q如果想要知道精的{案Q就要避免用double和float
     对于金融行业来说Q对数据的严整性要求是很高的,不容半点马虎Q那大家都知道再我们的Java语言里面有两个QҎ(gu)cd的变量float和doubleQ可能大家会认ؓ他们的精度对于金融行业这样对数字敏感的行业来_已经够用了,但是在开发当中,我们要尽量少使用double和floatQ因他们_的表?.1是不可能的。那我们如何解决q个问题呢,{案是用BigDecimal,int或者longq行货币计算。在q里对大家的忠告是:对于商务q算Q我们尽量用BigDecimalQ对于性能要求较高的地方,我们有能力自己处理十q制的小数点Q数g太大的时候,我们可以使用int或者longQ根据自q需要来判定具体使用哪一个,如果范围过?8位数Q那我们必须使用BigDecimal?/DIV>
Item 32Q如果其他类型更适合Q则量避免使用字符?BR>     在偶看到q条之前Q我很喜欢用字W串Q不在什么场合下Q先String了再_但是实际上很多情况下Q我们要Ҏ(gu)实际情况来判定到底用什么类型,而且字符串不适合替代枚DcdQ类型安全枚丄型和int值都比字W串更适合用来表示枚Dcd的常量。字W串也不适合替代聚集cdQ有一个更好的Ҏ(gu)是单的写一个类来描q这个数据集Q通常是一个私有的静态成员类最好。字W串也不适合代替能力表,总而言之,如果可以适合更加适合的数据类型,或者可以编写更加适当的数据类型,那么应该避免使用字符串来表示对象?/DIV>
Item 33Q了解字W串的连接功?BR>我们l常在用System.out.println()的时候,往括号里写一串用?”连接v来的字符Ԍq是我们最常见的,但是q个Ҏ(gu)q不适合规模较大的情形,接N个字W串而重复地使用字符串连接操作符Q要求N的^方的时_q是因ؓ字符串是非可变的Q这导致了在字W串q行q接的时候,前后两者都要拷贝,q个时候我们就提倡用StingBuffer替代String?/DIV>
Item 34Q通过接口引用对象
通俗的说是量优先使用接口而不是类来引用对象,如果有合适的接口存在那么对用参敎ͼq回|变量域都应该使用接口cdL使用接口作ؓ对象的习惯,会ɽE序变得更加灉|?BR>如果没有合适的接口Q那么,用类而不是接口来引用一个对象,是完全合适的?/DIV>
Item 35Q接口优先于映像机制
java.lang.relect提供了“通过E序来访问关于已装蝲的类的信息”,由此Q我们可以通过一个给定的Class实例Q获得Constructor,Method和Field实例?BR>映像机制允许一个类使用另一个类Q即使当前编译的时候后者还不存在,但是q种能力也要付出代h(hun)Q?BR>我们损失了了~译时类型检查的好处Q而且要求执行映像讉K的代码非常笨拙和冗长Qƈ且在性能上大大损失?BR>通常Q普通应用在q行时刻不应以映像方式访问对象?/DIV>
Item 36Q}慎的使用本地Ҏ(gu)
JNI允许Java应用E序调用本地Ҏ(gu)Q所谓本地方法是指用本地E序设计语言Q如CQC++Q来~写的特D方法,本地Ҏ(gu)可以在本地语a执行M计算dQ然后返回到JavaE序设计语言中。但是随着JDK1.3及后l版本的推出q种通过使用本地Ҏ(gu)来提高性能的方法已不值得提倡,因ؓ现在的JVM来快了,而且使用本地Ҏ(gu)有一些严重的~点Q比如Java原本引以为傲的安全性荡然无存,M在用本地方法的时候要三思?/DIV>
Item 37Q}慎用优?BR>不要因ؓ性能而牺牲合理的代码l构Q努力编写好的程序而不是快的程序,但是避免那些限制性能的设计决定,同时考虑自己设计的API军_的性能后果Qؓ了获得更好的性能而对APIq行修改q也是一个非怸好的xQ通常我们在做优化之后Q都应该对优化的E度q行一些测量?/DIV>
Item 38Q遵守普遍接受的命名惯例
Java有一套比较完善的命名惯例机制Q大部分包含在《The Java Language Specification》,严格得讲q些惯例分成两类Q字面的和语法的?BR>字面涉及包,c,接口Q方法和域,语法的命名惯例比较灵z,所以争议更大,字面惯例是非常直接和明确的,而语法惯例则相对复杂Q也很松散。但是有一个公认的做法是:“如果长期养成的习惯用法与此不同的话Q请不要盲目遵从


落花飞雪 2005-09-25 15:24 发表评论
]]>《Practical Java》笔?/title><link>http://www.tkk7.com/gufen/archive/2005/09/25/13992.html</link><dc:creator>落花飞雪</dc:creator><author>落花飞雪</author><pubDate>Sun, 25 Sep 2005 07:22:00 GMT</pubDate><guid>http://www.tkk7.com/gufen/archive/2005/09/25/13992.html</guid><wfw:comment>http://www.tkk7.com/gufen/comments/13992.html</wfw:comment><comments>http://www.tkk7.com/gufen/archive/2005/09/25/13992.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.tkk7.com/gufen/comments/commentRss/13992.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/gufen/services/trackbacks/13992.html</trackback:ping><description><![CDATA[<P>1. 声明是什?<BR>String s = "Hello world!";</P> <P>许多人都做过q样的事情,但是Q我们到底声明了什么?回答通常是:一个StringQ内Ҏ(gu)“Hello world!”。这hp的回答通常是概念不清的Ҏ(gu)。如果要准确的回{,一半的人大概会回答错误?BR>q个语句声明的是一个指向对象的引用Q名为“s”,可以指向cd为String的Q何对象,目前?/P> <P>1. 声明是什?<BR>String s = "Hello world!";</P> <P>许多人都做过q样的事情,但是Q我们到底声明了什么?回答通常是:一个StringQ内Ҏ(gu)“Hello world!”。这hp的回答通常是概念不清的Ҏ(gu)。如果要准确的回{,一半的人大概会回答错误?BR>q个语句声明的是一个指向对象的引用Q名为“s”,可以指向cd为String的Q何对象,目前指向"Hello world!"q个Stringcd的对象。这是真正发生的事情。我们ƈ没有声明一个String对象Q我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:</P> <P>String string = s;</P> <P>我们是声明了另外一个只能指向String对象的引用,名ؓstringQƈ没有W二个对象生,stringq是指向原来那个对象Q也是Q和s指向同一个对象?BR>2. StringcȝҎ(gu)?BR>1) String s1 = “Hello?  //产生一个String ”Hello”对?q生该对象的一个别名s1来引用该对象<BR>String s2 = “Hello?  //又生一个别名s2来引用上面的”Hello”对?BR>s1 == s2 = true;   //׃是同一个对象所以?=”返回ؓtrue<BR>s1 = “World?  //产生一个String ”World”对? s1的引用不再指向“Hello”而是指向对象”World?BR>s1 == s2 = false;   //׃不是同一个对象所以?=”返回ؓfalse<BR>s1 = “Hello?  //同上面的String s2 = “Hello? 现在s1又指向对象”Hello? 因ؓJVM会自动根据栈中数据的实际情况来决定是否有必要创徏新对象?BR>s1 == s2 = true;   //׃是同一个对象所以?=”又q回为true?BR>s1 = s1 + “World?  //q时又生一个对象”HelloWord?s1不再指向”Hello”而是指向”HelloWord?BR>s1 == s2 = false;  //不是一个对象当然是false?BR>s1 = s1+ "a"+"b"+"c"+?  // String不停的创建对?影响性能Q这U易变的String用StringBuffer会得到更好的性能<BR>StringBuffer s3 = new StringBuffer(“Hello?; <BR>s3.append(“a?; //没有生成新的对象Q而是s3引用的对象内Ҏ(gu)为”Helloa?/P> <P>//说明: Stringcȝ来表C那些创建后׃会再改变的字W串Q它是immutable的。而StringBuffercȝ来表C内容可变的字符Ԍq提供了修改底层字符串的Ҏ(gu)?BR>StingBuffer是一个可变的字符Ԍ它可以被更改。同时StringBuffer是Thread safe的, 你可以放心的使用.</P> <P>因ؓString被设计成一U安全的字符Ԍ 避免了C/C++中的尬。因此在内部操作的时候会频繁的进行对象的交换Q?因此它的效率不如StringBuffer?如果需要频J的q行字符串的增删操作的话最好用StringBuffer?比如拼SQL文, 写共函?另: ~绎器对String?操作q行了一定的优化?<BR>x = "a" + 4 + "c"<BR>会被~绎?BR>x = new StringBuffer().append("a").append(4).append("c").toString()<BR>但:<BR>x = “a?<BR>x = x + 4;<BR>x = x + “c?<BR>则不会被优化?可以看出如果在一个表辑ּ里面q行String的多?操作会被优化Q?而多个表辑ּ?操作不会被优化?BR>摘自Q《Java API Using, Tips And Performance Tuning?BR><FONT color=#000000>2) Integer、Boolean{wrappercM及BigInteger、BigDecimal是immutable的,所以也有与StringcM的地方,不过没有IntegerBuffer之类的东ѝ不qFloat, Double比较Ҏ(gu)。如<BR>T a1 = 10; //T代指Byte,Integer,Short,Long,Boolean?注:应用了JDK5的AUTOBOXING<BR>T a2 = 10;<BR>if (a1 == a2)<BR> System.out.println(true);<BR>else<BR> System.out.println(false);<BR>q时Ltrue,和String有点cM</FONT></P> <P><FONT color=#000000>//Float?BR>Float i1 =  (float)10.0;<BR>Float i2 =  (float)10.0;<BR>if (i1==i2)<BR>   System.out.println(true);<BR>else<BR>   System.out.println(false);<BR>q时Lfalse<BR><BR>//Double?BR>Double i1 =  10.0;<BR>Double i2 =  10.0;<BR>if (i1==i2)<BR>   System.out.println(true);<BR>else<BR>   System.out.println(false);<BR>q时Lfalse<BR></FONT></P> <P><FONT color=#000000>M如果比较两个Wrappercȝ值用equalsQ以免不必要的麻?BR></FONT>3) 再看<BR>String s1 = new String(“Hello?;<BR>String s2 = new String(“Hello?;<BR>s1 == s2 = false;<BR>//因ؓnew的时候JVM不管heap中有没有”Hello”对象都会生一个新的”Hello”对?BR>String s3 = “Hello? //重新创徏对象”Hello? qos3指向对象”Hello?BR>s3 == s1 = false; //不同对象当然false<BR>String s4 = “Hello? <BR>s3 == s4 = true;  //故伎重演Qjvm清楚的知道哪些用了newQ哪些没用new<BR><BR>3. Ҏ(gu)的参C递中都是以reference传递,而primitive传递的是副本,但如果传递的是Integer、Boolean{wrappercdStringcȝObject则是以immutable方式传递。示例:<BR>import java.awt.Point;<BR>class HelloWorld<BR>{<BR>  public static void modifyPoint(Point pt, String j, int k, Integer m, Boolean b)<BR>  {<BR>    pt.setLocation(5,5);                                      <BR>    j = "15";<BR>    k = 25;<BR>    m = 35;<BR>    b = true;<BR>    System.out.println("During modifyPoint " + "pt = " + pt +<BR>                       " and j = " + j+ " and k = "+ k+ <BR>                       " and m = "+ m+ " and b = "+ b);<BR>  }</P> <P>  public static void main(String args[])<BR>  {<BR>    Point p = new Point(0,0);                                 <BR>    String i = "10";<BR>    int k = 20;<BR>    Integer m = 30;<BR>    Boolean b = false;<BR>    System.out.println("Before modifyPoint " + "p = " + p +<BR>                       " and i = " + i+ " and k = "+ k+ <BR>                       " and m = "+ m+ " and b = "+ b);<BR>    modifyPoint(p, i, k, m, b);                                        <BR>    System.out.println("After modifyPoint " + "p = " + p +<BR>                       " and i = " + i+ " and k = "+ k+ <BR>                       " and m = "+ m+ " and b = "+ b);<BR>  }<BR>}<BR>输出l果Q?BR>Before modifyPoint p = java.awt.Point[x=0,y=0] and i = 10 and k = 20 and m = 30 and b = false<BR>During modifyPoint pt = java.awt.Point[x=5,y=5] and j = 15 and k = 25 and m = 35 and b = true<BR>After modifyPoint p = java.awt.Point[x=5,y=5] and i = 10 and k = 20 and m = 30 and b = false<BR>4. final作用于基本类型变量则该变量ؓ恒常量;final作用于对象类型变量则该对象reference为恒量;final作用于方法则该方法不能被覆盖Qfinal作用于class则该class不能被ѝ?BR>final使得被修饰的变量"不变"Q但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义Q引用本w的不变Q和引用指向的对象不变?/P> <P>引用本n的不变:<BR>final StringBuffer a=new StringBuffer("immutable");<BR>final StringBuffer b=new StringBuffer("not immutable");<BR>a=b;//~译期错?/P> <P>引用指向的对象不变:<BR>final StringBuffer a=new StringBuffer("immutable");<BR>a.append(" broken!"); //~译通过</P> <P>可见Qfinal只对引用的“值?也即它所指向的那个对象的内存地址)有效Q它q引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化Qfinal是不负责的。这很类?=操作W:==操作W只负责引用的“值”相{,至于q个地址所指向的对象内Ҏ(gu)否相{,==操作W是不管的?/P> <P>理解final问题有很重要的含义。许多程序漏z都Z?---final只能保证引用永远指向固定对象Q不能保证那个对象的状态不变。在多线E的操作?一个对象会被多个线E共享或修改Q一个线E对对象无意识的修改可能会导致另一个用此对象的线E崩溃。一个错误的解决Ҏ(gu)是在此对象新徏的时候把它声明ؓfinalQ意图得它“永q不变”。其实那是徒劳的?BR>5. 怎样初始?BR>本问题讨论变量的初始化,所以先来看一下Java中有哪些U类的变量?BR>1). cȝ属性,或者叫值域<BR>2). Ҏ(gu)里的局部变?BR>3). Ҏ(gu)的参?/P> <P>对于W一U变量,Java虚拟Z自动q行初始化。如果给Z初始|则初始化初始倹{如果没有给出,则把它初始化cd变量的默认初始倹{?/P> <P>primitivecd默认?BR>boolean: false<BR>char: '\u0000'  对于未初始化的char c, c == ‘\u0000?= true<BR>byte: 0<BR>short: 0<BR>int: 0<BR>long: 0<BR>float: 0.0<BR>double: 0.0<BR>object reference: null<BR>array: null<BR>注意数组本n也是对象Q所以没有初始化的数l引用在自动初始化后其g是null?/P> <P>对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创徏实例的时候初始化Qstatic属性在cd载,也就是第一ơ用到这个类的时候初始化Q对于后来的实例的创建,不再ơ进行初始化?/P> <P>对于W二U变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,~译器会抗议。如果初始化的语句在try块中或if块中Q也必须要让它在W一ơ用前一定能够得到赋倹{也是_把初始化语句攑֜只有if块的条g判断语句中编译器也会抗议Q因为执行的时候可能不W合if后面的判断条Ӟ如此一来初始化语句׃会被执行了,q就q反了局部变量用前必须初始化的规定。但如果在else块中也有初始化语句,可以通过~译Q因为无论如何,L臛_一条初始化语句会被执行Q不会发生用前未被初始化的事情。对于try-catch也是一P如果只有在try块里才有初始化语句,~译部通过。如果在 catch或finally里也有,则可以通过~译。MQ要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要Z化成什么值好Q就用上面的默认值吧Q?/P> <P>其实W三U变量和W二U本质上是一LQ都是方法中的局部变量。只不过作ؓ参数Q肯定是被初始化q的Q传入的值就是初始|所以不需要初始化?BR>6. 量使用多?polymorphism)Ҏ(gu)而不是instanceof<BR>7. 一旦不需要对象,量昑ּ的之ؓnull<BR>8. 对象之间的?”赋值操作乃是赋值的reference, 卛_边的对象也指向右边的对象Q只是该reference多了一个别名而已?BR>9. ?=”和equals()的区?BR>==操作W专门用来比较变量的值是否相{。比较好理解的一Ҏ(gu)Q?BR>int a=10;<BR>int b=10;<BR>则a==b是true?BR>但不好理解的地方是:<BR>String a=new String("foo");<BR>String b=new String("foo");<BR>则a==b返回false?/P> <P>Ҏ(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)做的事?/P> <P>看一下Object对象的equalsҎ(gu)是如何实现的Q?BR>boolean equals(Object o){</P> <P>return this==o;</P> <P>}<BR>Object 对象默认使用?=操作W。所以如果你自创的类没有覆盖equalsҎ(gu)Q那你的cM用equals和?=会得到同Ll果。同样也可以看出Q?Object的equalsҎ(gu)没有辑ֈequalsҎ(gu)应该辑ֈ的目标:比较两个对象内容是否相等。因为答案应该由cȝ创徏者决定,所以Object把这个Q务留l了cȝ创徏者?/P> <P>看一下一个极端的c:<BR>Class Monster{<BR>private String content;<BR>...<BR>boolean equals(Object another){ return true;}</P> <P>}<BR>我覆盖了equalsҎ(gu)。这个实CD无论Monster实例内容如何Q它们之间的比较永远q回true?/P> <P>所以当你是用equalsҎ(gu)判断对象的内Ҏ(gu)否相{,请不要想当然。因为可能你认ؓ相等Q而这个类的作者不q样认ؓQ而类的equalsҎ(gu)的实现是׃掌握的。如果你需要用equalsҎ(gu)Q或者用Q何基于散列码的集合(HashSet,HashMap,HashTableQ,请察看一下java doc以确认这个类的equals逻辑是如何实现的?BR>10. 不要依赖equals()的缺省实?BR>11. 一个equals()的实现模?BR>class Golfball<BR>{<BR>  private String brand;<BR>  private String make;<BR>  private int compression;</P> <P>  public boolean equals(Object obj)<BR>  {</P> <P>    if (this == obj)<BR>      return true;</P> <P>    if (obj != null && getClass() == obj.getClass())<BR>    {<BR>      Golfball gb = (Golfball)obj;  //Classes are equal, downcast.<BR>      if (brand.equals(gb.brand()) &&  //Compare attributes.<BR>          make.equals(gb.make()) &&<BR>          compression == gb.compression())<BR>      {<BR>        return true;<BR>      }<BR>    }<BR>    return false;<BR>  }<BR>}<BR>注意getClass() == obj.getClass()的限Ӟ如果判断必须相等则无法比较基cd子类是否相等,完全不同的类不用考虑Q完全没有可比性,除了Ҏ(gu)需要或很糟p的E序?BR>12. 实现equals()应优先考虑使用getClass()<BR>13. 如果某个基类我们自己实现了equals()Q在它的子类中要覆盖此方法,最好调用super.equals()唤vbase class的相兌?然后再实现子cd的比较?BR>Example:<BR>  public boolean equals(Object obj)<BR>  {<BR>    if (this == obj)                                          //1<BR>      return true;</P> <P>    if (obj != null && getClass() == obj.getClass() &&        //2<BR>        super.equals(obj))                                    //3<BR>    {<BR>      MyGolfball gb = (MyGolfball)obj;  //Classes equal, downcast.<BR>      if (ballConstruction == gb.construction())  //Compare attrs.<BR>        return true;<BR>    }<BR>    return false;<BR>  }<BR>14. 如果要在base class与derived class之间应运equals(),可以考虑instanceof来代替getClass()。对此论题的详细讨论参见:Practical Java, Practice 14<BR>15. instanceof什么东西?<BR>instanceof是Java的一个二元操作符Q和==Q?gt;Q?lt;是同一cM东。由于它是由字母l成的,所以也是Java的保留关键字。它的作用是试它左边的对象是否是它双的类的实例,q回booleancd的数据。D个例子:</P> <P>String s = "I AM an Object!";<BR>boolean isObject = s instanceof Object;</P> <P>我们声明了一个String对象引用Q指向一个String对象Q然后用instancof来测试它所指向的对象是否是Objectcȝ一个实例,昄Q这是真的,所以返回trueQ也是isObject的gؓTrue?BR>instanceof有一些用处。比如我们写了一个处理̎单的pȝQ其中有q样三个c:</P> <P>public class Bill {//省略l节}<BR>public class PhoneBill extends Bill {//省略l节}<BR>public class GasBill extends Bill {//省略l节}</P> <P>在处理程序里有一个方法,接受一个Billcd的对象,计算金额。假设两U̎单计方法不同,而传入的Bill对象可能是两U中的Q何一U,所以要用instanceof来判断:</P> <P>public double calculate(Bill bill) {<BR>if (bill instanceof PhoneBill) {<BR>//计算?sh)话账?BR>}<BR>if (bill instanceof GasBill) {<BR>//计算燃气账单<BR>}<BR>...<BR>}<BR>q样可以用一个方法处理两U子cR?/P> <P>然而,q种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实玎ͼq是面向对象变成应有的做法,避免回到l构化编E模式。只要提供两个名字和q回值都相同Q接受参数类型不同的Ҏ(gu)可以了Q?/P> <P>public double calculate(PhoneBill bill) {<BR>//计算?sh)话账?BR>}</P> <P>public double calculate(GasBill bill) {<BR>//计算燃气账单<BR>}</P> <P>所以,使用instanceof在绝大多数情况下q不是推荐的做法Q应当好好利用多态?BR>16. 认真对待异常?BR>1).在方法体用throws子句抛出异常时尽量包括所有出现的异常Q而不是仅仅抛出base exception.<BR>2).在super class中定义的Ҏ(gu)抛出某个异常Q如果在deriver class中要override该方法,那么overriding method必须Q?BR>a. 不抛ZQ何异?BR>b. 抛出和super class 中同L异常<BR>c. 抛出和super class 中异常的deriver class<BR>如果super class中定义的Ҏ(gu)没有抛出异常Q但deriver class中的override的方法会产生异常Q必自己内部解?BR> 3).好好利用finally功能。一般只要有finallyQ它L会被执行Q除非在try中用System.exit(0)或者在try块执行期间强行拔掉电(sh)源。finally被执行有三种情况Q?BR>a. 抛出异常<BR>b. try正常l束<BR>c. 在try中执行了return, break, continue而引L开try的操?BR>其注意c.如果Ҏ(gu)中在try块return 1,而在finally块return 2,则最l永q是2Q因此尽量避免在try中用return, break, continueQ要么确保在finally中不会改变返回?BR> 4).不要在@环体中用try,因ؓ在无JIT的JVM中将大大降低性能Q而且q也是良好的~程习惯<BR> 5).不要异常用于控制流E,而是仅仅用于会发生错误的地方<BR> 6).不要每逢出错就使用异常Q尽量用传l的Ҏ(gu)判断变量的有效?BR>17. 关于不可变类(Immutable class),如String、Byte、Integer、Short、Long、Float、Double、BigInteger、BigDecimal{,它们之所以能同一D动地指向同一引用Q实际上是它们实C静态工厂方法?/P><img src ="http://www.tkk7.com/gufen/aggbug/13992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/gufen/" target="_blank">落花飞雪</a> 2005-09-25 15:22 <a href="http://www.tkk7.com/gufen/archive/2005/09/25/13992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://qmoread.com" target="_blank">һѹۿ</a>| <a href="http://b2b-chinese.com" target="_blank">޾Ʒ˳߲va</a>| <a href="http://cnkaiertong.com" target="_blank">ձxxxx</a>| <a href="http://cqkalai.com" target="_blank">ۺ</a>| <a href="http://shyangpuks.com" target="_blank">޾ƷĻþò</a>| <a href="http://shunfk.com" target="_blank">һ</a>| <a href="http://ulihix.com" target="_blank">ѹۿվ</a>| <a href="http://blbkl.com" target="_blank">¶ѿ</a>| <a href="http://taiyu18.com" target="_blank">ѾþþƷ</a>| <a href="http://www79909c.com" target="_blank">վѹۿ</a>| <a href="http://13813855.com" target="_blank">ۺһ</a>| <a href="http://mottool.com" target="_blank">޾ñĻ</a>| <a href="http://see13.com" target="_blank">߹ۿƵվ</a>| <a href="http://guoyit.com" target="_blank">պһ</a>| <a href="http://wxxwy.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://tjbdyx.com" target="_blank">޾ƷŮƵ</a>| <a href="http://5aa6.com" target="_blank">˾Ʒ޾Ʒ</a>| <a href="http://www026qqcom.com" target="_blank">߾Ʒһ</a>| <a href="http://aabbcc567.com" target="_blank">Ʒһ </a>| <a href="http://yctbhb.com" target="_blank">˳վ߲</a>| <a href="http://41xjj.com" target="_blank">˾þóۺӰԺ</a>| <a href="http://www5g9.com" target="_blank">ëƬȫһ</a>| <a href="http://023439.com" target="_blank">þһ</a>| <a href="http://hcdigi.com" target="_blank">͵޾Ʒ</a>| <a href="http://17soco.com" target="_blank">޹ۺ</a>| <a href="http://wangquanai.com" target="_blank">޾Ʒ㶮߹ۿ</a>| <a href="http://gdfcjzx.com" target="_blank">Ʒ鶹Ѱ</a>| <a href="http://caicpa.com" target="_blank">޸߹ۿ</a>| <a href="http://yuntao360.com" target="_blank">ĻƬ</a>| <a href="http://ddm88888.com" target="_blank">AVר߹ۿ </a>| <a href="http://jisuanq.com" target="_blank">aƵ߹ۿ</a>| <a href="http://2023852.com" target="_blank">ްv</a>| <a href="http://gs168sz.com" target="_blank"> ר</a>| <a href="http://xy167.com" target="_blank">ѾƷԲ </a>| <a href="http://cin17.com" target="_blank">mm1313޾Ʒִִ</a>| <a href="http://html5text.com" target="_blank">һѹۿƵİ </a>| <a href="http://wwwee2.com" target="_blank">˳վ߹ۿŶ</a>| <a href="http://ahbbht.com" target="_blank">av뾫Ʒվ</a>| <a href="http://hzsprfm.com" target="_blank">˳ɾƷþþþ</a>| <a href="http://by9277.com" target="_blank">޹ۺһ</a>| <a href="http://0755haoma.com" target="_blank">µĻ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>