﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Scott@JAVA</title><link>http://www.blogjava.net/cisco/</link><description>Java, 一杯浓浓的咖啡伴你到深夜</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 16:53:04 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 16:53:04 GMT</pubDate><ttl>60</ttl><item><title>A Glossary of Name Reuse</title><link>http://www.blogjava.net/cisco/archive/2007/07/25/132390.html</link><dc:creator>Scott@JAVA</dc:creator><author>Scott@JAVA</author><pubDate>Wed, 25 Jul 2007 13:26:00 GMT</pubDate><guid>http://www.blogjava.net/cisco/archive/2007/07/25/132390.html</guid><wfw:comment>http://www.blogjava.net/cisco/comments/132390.html</wfw:comment><comments>http://www.blogjava.net/cisco/archive/2007/07/25/132390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cisco/comments/commentRss/132390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cisco/services/trackbacks/132390.html</trackback:ping><description><![CDATA[From &lt;&lt;Java Puzzlers&gt;&gt;, Chapter 8. Classier Puzzlers<br><img height=240 alt="" src="http://ec1.images-amazon.com/images/I/51R5GN5BJML._AA240_.jpg" width=240 border=0><br><br>
<h3 class=docSection1Title>A Glossary of Name Reuse</h3>
<p class=docText>Most of the puzzles in this chapter were based on name reuse. This section summarizes the various forms of name reuse.</p>
<h4 class=docSection2Title>Overriding</h4>
<p class=docText>An instance method <span class=docEmphasis>overrides</span> all accessible instance methods with the same signature in superclasses [JLS 8.4.8.1], enabling <span class=docEmphasis>dynamic dispatch;</span> in other words, the VM chooses which overriding to invoke based on an instance's run-time type [JLS 15.12.4.4]. Overriding is fundamental to object-oriented programming and is the only form of name reuse that is not generally discouraged:</p>
<pre>class Base {
public void f() { }
}
class Derived extends Base {
<span class=docEmphStrong>public void f() { } // overrrides Base.f()</span>
}
</pre>
<br>
<h5 class=docSection3Title>Hiding</h5>
<p class=docText>A field, static method, or member type <span class=docEmphasis>hides</span> all accessible fields, static methods, or member types, respectively, with the same name (or, for methods, signature) in supertypes. Hiding a member prevents it from being inherited [JLS 8.3, 8.4.8.2, 8.5]:</p>
<pre>class Base {
public static void f() { }
}
class Derived extends Base {
<span class=docEmphStrong>public static void f() { } // hides Base.f()</span>
}
</pre>
<br>
<h5 class=docSection3Title>Overloading</h5>
<p class=docText>Methods in a class <span class=docEmphasis>overload</span> one another if they have the same name and different signatures. The overloaded method designated by an invocation is selected at compile time [JLS 8.4.9, 15.12.2]:</p>
<pre>class CircuitBreaker {
<span class=docEmphStrong>public void f(int i)    { } // int overloading</span>
<span class=docEmphStrong>public void f(String s) { } // String overloading</span>
}
</pre>
<br>
<h5 class=docSection3Title>Shadowing</h5>
<p class=docText>A variable, method, or type <span class=docEmphasis>shadows</span> all variables, methods, or types, respectively, with the same name in a textually enclosing scope. If an entity is shadowed, you cannot refer to it by its simple name; depending on the entity, you cannot refer to it at all [JLS 6.3.1]:</p>
<pre>class WhoKnows {
static String sentence = "I don't know.";
public static void main(String[] args) {
<span class=docEmphStrong>String sentence = "I know!";   // shadows static field</span>
System.out.println(sentence);  // prints local variable
}
}
</pre>
<br>
<p class=docText>Although shadowing is generally discouraged, one common idiom does involve shadowing. Constructors often reuse a field name from their class as a parameter name to pass the value of the named field. This idiom is not without risk, but most Java programmers have decided that the stylistic benefits outweigh the risks:</p>
<pre>class Belt {
private final int size;
<span class=docEmphStrong>public Belt(int size) { // Parameter shadows Belt.size</span>
this.size = size;
}
}
</pre>
<br>
<h5 class=docSection3Title>Obscuring</h5>
<p class=docText>A variable <span class=docEmphasis>obscures</span> a type with the same name if both are in scope: If the name is used where variables and types are permitted, it refers to the variable. Similarly, a variable or a type can obscure a package. Obscuring is the only kind of name reuse where the two names are in different namespaces: variables, packages, methods, or types. If a type or a package is obscured, you cannot refer to it by its simple name except in a context where the syntax allows only a name from its namespace. Adhering to the naming conventions largely eliminates obscuring [JLS 6.3.2, 6.5]:</p>
<pre>public class Obscure {
<span class=docEmphStrong>static String System; // Obscures type java.lang.System</span>
public static void main(String[] args) {
// Next line won't compile: System refers to static field
System.out.println("hello, obscure world!");
}
}
</pre>
<img src ="http://www.blogjava.net/cisco/aggbug/132390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cisco/" target="_blank">Scott@JAVA</a> 2007-07-25 21:26 <a href="http://www.blogjava.net/cisco/archive/2007/07/25/132390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>护照歧视... </title><link>http://www.blogjava.net/cisco/archive/2007/07/09/129136.html</link><dc:creator>Scott@JAVA</dc:creator><author>Scott@JAVA</author><pubDate>Mon, 09 Jul 2007 13:09:00 GMT</pubDate><guid>http://www.blogjava.net/cisco/archive/2007/07/09/129136.html</guid><wfw:comment>http://www.blogjava.net/cisco/comments/129136.html</wfw:comment><comments>http://www.blogjava.net/cisco/archive/2007/07/09/129136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cisco/comments/commentRss/129136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cisco/services/trackbacks/129136.html</trackback:ping><description><![CDATA[<p>之前都没很仔细考虑过这个问题，直到前段时间了解了申根协议(<a href="http://en.wikipedia.org/wiki/Schengen_Agreement">Schengen Agreement</a>)后，突然想看看中国大陆护照在国际上地位如何。搜索了一下...</p>
<p>目前，就因私护照(比如你出国旅游，留学，探亲等等)，全世界只有20个左右的国家对中国护照免签，和巴基斯坦和孟加拉护照的待遇差不多。护照是一个国家公民在国外的身份证件，免签或者落地签从一定程度上体现了国家的地位，国民素质和在别国群众眼里你的形象。现在虽然满报纸，电视的"中国崛起"论，但在普通民众国际事务上还是地道的三流待遇，这和中国现在的国际地位实在是有点不符，尴尬至极...值得注意的是，香港护照自从回归后却一直没受影响，现在全球120+国家对香港护照免签或落地签。一个"行政区"的护照居然比其所在国家的护照好使，这也算是够让国内汗颜的了...</p>
<p><br>全球最好用的几个国家(地区)护照，国名后头是对该国护照免签或落地签国家数目...</p>
<p><br>1 Finland 130<br>1 Denmark 130<br>1 United States 130<br>2 Ireland 129<br>2 Sweden 129<br>2 Germany 129<br>3 United Kingdom 128<br>3 Italy 128<br>3 France 128<br>3 Japan 128<br>4 Spain 127<br>4 Norway 127<br>4 Switzerland 127<br>4 Belgium 127<br>5 Netherlands 126</p>
<p>HK有124的....<br><br>对中国大陆护照免签的国家:</p>
<p>安道尔 (国家太小，要从法国或西班牙入境)<br>阿鲁巴 (对全世界免签...除了孟加拉和阿富汗的公民或者难民)<br>贝宁 库克群岛 (和中国无直航) 多米尼加 (和中国无直航)<br>澳门 马尔代夫 毛里求斯 米克罗尼西亚<br>尼泊尔 萨摩亚 塞舌尔 所罗门群岛 斯里兰卡<br>叙利亚 特科斯和开科斯 图瓦卢 瓦纽图<br>埃及 (从西奈半岛入境才行)<br>俄罗斯 (团队)<br><br>就不评论上头这些国家了，有些还得先拿放大镜去地图上找找在哪里。还几个落地签国家，也基本集中在太平洋和非洲...有些国家甚至你落地签交的钱越多给的居留时间越长...ft~~~...赚外汇也不需要这样啊...</p>
<img src ="http://www.blogjava.net/cisco/aggbug/129136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cisco/" target="_blank">Scott@JAVA</a> 2007-07-09 21:09 <a href="http://www.blogjava.net/cisco/archive/2007/07/09/129136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Last Milestone Of NetBeans 6.0 Is Available</title><link>http://www.blogjava.net/cisco/archive/2007/07/03/127725.html</link><dc:creator>Scott@JAVA</dc:creator><author>Scott@JAVA</author><pubDate>Mon, 02 Jul 2007 22:56:00 GMT</pubDate><guid>http://www.blogjava.net/cisco/archive/2007/07/03/127725.html</guid><wfw:comment>http://www.blogjava.net/cisco/comments/127725.html</wfw:comment><comments>http://www.blogjava.net/cisco/archive/2007/07/03/127725.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/cisco/comments/commentRss/127725.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cisco/services/trackbacks/127725.html</trackback:ping><description><![CDATA[<p>Milestone 10 of NetBeans 6.0 (M10) is now available for download at <br><a class=moz-txt-link-freetext href="http://dlc.sun.com/netbeans/download/6.0/milestones/m10/"><u><font color=#810081>http://dlc.sun.com/netbeans/download/6.0/milestones/m10</font></u></a><br></p>
<p>Some of the highlights: <br><br>* New default color scheme and syntax coloring <br>* Ruby Debugger enhancements (global vars, watch view, locals view) <br>* Redesigned Find / Replace dialog <br>* Plugin Manager allows you to distribute groups of IDE components (for example Ruby, SOA) <br>* Integrated Visual Design for Web Applications <br>* New, Integrated UI for CLDC/MIDP and CDC development<br>* Limited refactoring of GUI forms<br>* New keyboard shortcuts (they're supposed to be more logical now)<br>* New refactorings - 16 refactorings now available out of the box<br>* New directory chooser - easier to use for new NetBeans users<br><br>Of course there's much more available: <br><a class=moz-txt-link-freetext href="http://wiki.netbeans.org/wiki/view/NewAndNoteWorthyMilestone10"><u><font color=#810081>http://wiki.netbeans.org/wiki/view/NewAndNoteWorthyMilestone10</font></u></a> <br><br>M10 was the last milestone, we will now be slowly approaching the betas (two betas are planned), rcs and ultimately the final release of NetBeans 6.0. If you want to see what all will be available in 6.0, here's <a href="http://wiki.netbeans.org/wiki/view/NewAndNoteWorthy"><u><font color=#810081>full list of the features in previous milestones</font></u></a>.<br></p>
<img src ="http://www.blogjava.net/cisco/aggbug/127725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cisco/" target="_blank">Scott@JAVA</a> 2007-07-03 06:56 <a href="http://www.blogjava.net/cisco/archive/2007/07/03/127725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Album Updated</title><link>http://www.blogjava.net/cisco/archive/2007/06/27/126443.html</link><dc:creator>Scott@JAVA</dc:creator><author>Scott@JAVA</author><pubDate>Tue, 26 Jun 2007 21:18:00 GMT</pubDate><guid>http://www.blogjava.net/cisco/archive/2007/06/27/126443.html</guid><wfw:comment>http://www.blogjava.net/cisco/comments/126443.html</wfw:comment><comments>http://www.blogjava.net/cisco/archive/2007/06/27/126443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cisco/comments/commentRss/126443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cisco/services/trackbacks/126443.html</trackback:ping><description><![CDATA[更新了下blog里的照片<br><br>放一张这里让大家瞅瞅吧，完整的请看<a href="http://www.blogjava.net/cisco/gallery/23584.html">http://www.blogjava.net/cisco/gallery/23584.html</a><br>或者<a href="http://bbs.fengniao.com/forum/showthread.php?p=9950531&amp;posted=1">http://bbs.fengniao.com/forum/showthread.php?p=9950531&amp;posted=1</a><br><img height=414 alt="" src="http://www.blogjava.net/images/blogjava_net/cisco/23584/r_Midsummer.jpg" width=640 border=0><br><br>更多照片就在<a href="http://www.flickr.com/photos/sike_huang/">http://www.flickr.com/photos/sike_huang/</a><br>以及<a href="http://sikehuang.spaces.live.com/">http://sikehuang.spaces.live.com/</a><br>
<img src ="http://www.blogjava.net/cisco/aggbug/126443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cisco/" target="_blank">Scott@JAVA</a> 2007-06-27 05:18 <a href="http://www.blogjava.net/cisco/archive/2007/06/27/126443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java冷笑话</title><link>http://www.blogjava.net/cisco/archive/2007/05/28/120552.html</link><dc:creator>Scott@JAVA</dc:creator><author>Scott@JAVA</author><pubDate>Mon, 28 May 2007 12:47:00 GMT</pubDate><guid>http://www.blogjava.net/cisco/archive/2007/05/28/120552.html</guid><wfw:comment>http://www.blogjava.net/cisco/comments/120552.html</wfw:comment><comments>http://www.blogjava.net/cisco/archive/2007/05/28/120552.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/cisco/comments/commentRss/120552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cisco/services/trackbacks/120552.html</trackback:ping><description><![CDATA[面试官：知道什么叫类么<br>应聘者：我这人实在，工作努力，不知道什么叫累<br>面试官：知道什么是包?<br>应聘者：我这人实在&nbsp;&nbsp; 平常不带包 也不用公司准备了<br>面试官：知道什么是接口吗?<br>应聘者：我这个人工作认真。从来不找借口偷懒<br>M：知道什么是继承么<br>Y：我是孤儿没什么可以继承的<br>M:知道什么叫对象么？<br>M:知道，不过我工作努力，上进心强，暂时还没有打算找对象。<br>M：知道多态么？<br>Y：知道，我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为！请问这和Java有什么关系？？&nbsp; 
<img src ="http://www.blogjava.net/cisco/aggbug/120552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cisco/" target="_blank">Scott@JAVA</a> 2007-05-28 20:47 <a href="http://www.blogjava.net/cisco/archive/2007/05/28/120552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CS@UU的老师还蛮可爱的</title><link>http://www.blogjava.net/cisco/archive/2007/05/28/120370.html</link><dc:creator>Scott@JAVA</dc:creator><author>Scott@JAVA</author><pubDate>Sun, 27 May 2007 21:17:00 GMT</pubDate><guid>http://www.blogjava.net/cisco/archive/2007/05/28/120370.html</guid><wfw:comment>http://www.blogjava.net/cisco/comments/120370.html</wfw:comment><comments>http://www.blogjava.net/cisco/archive/2007/05/28/120370.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/cisco/comments/commentRss/120370.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cisco/services/trackbacks/120370.html</trackback:ping><description><![CDATA[<p>想当初申请了四所学校，瑞典的<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#115;&#64;&#117;&#117;">cs@uu</a>, <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#101;&#100;&#115;&#64;&#107;&#116;&#104;">seds@kth</a>, <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#110;&#100;&#115;&#64;&#99;&#116;&#104;">nds@cth</a>和芬兰的<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#100;&#64;&#117;&#116;&#97;">sd@uta</a>，都被录取了，最后决定去<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#101;&#100;&#115;&#64;&#107;&#116;&#104;">seds@kth</a>，然后给uta和uu发了"拒信", (cth还没到答复的时间，可以拖拖-_-#)。<br><br><br>芬兰的收到后，言简意赅：<br>Dear Sike Huang,</p>
<p>I'm so sorry to hear about your decision, but thank you very much for letting us know!</p>
<p>With best wishes,</p>
<p>Kirsi</p>
<p><br>瑞典的收到后，还跟我聊了起来，我还得想想怎么"对付"这小子-_-#(一个senior lecturer，看照片挺年轻的)：<br><br>Citerar Sike Huang &lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#120;&#120;&#64;&#120;&#120;&#46;&#99;&#111;&#109;">xx@xx.com</a>&gt;:</p>
<p>&gt; Hi, Ivan,<br>&gt; <br>&gt; I've chosen the Software Engineering of Distributed Systems program in <br>&gt; Royal Institute of Technology, I prefer software engineering (project <br>&gt; management and design) than computer science (theoretical/mathematical studies).</p>
<p>:) ... thanks! Word of advice: the title of an education really does not mean so much (ie you can tailor a profile with us which will have more SE than the one you have chosen at KTH). In any case - good luck with your studies!!<br>&gt; <br>&gt; By the way, is there any academic cooperation between UU and KTH?</p>
<p>Yes, there is. In fact you can take any relevant course at Uppsala and count it towards your degree at KTH (and vice versa). Also you can chose to do your MSc thesis at UU (or at any other swedish school for that matter).<br>Note: You are awarded your degree from the school where you take you LAST course... </p>
<p>all the best,</p>
<p>ivan</p>
<p>PS You should come visit us once you get to Sweden (just to see what you are missing ... just kidding ;)</p>
<p>&gt; <br>&gt; Best wishes,<br>&gt; Sike Huang<br>&gt; <br>&gt; -----Original Message-----<br>&gt; From: Ivan Christoff [mailto:xx@xx.uu.se]<br>&gt; Sent: 2007&#229;&#185;&#180;5&#230;&#339;&#710;26&#230;—&#165; 23:35<br>&gt; To: Sike Huang<br>&gt; Subject: RE: MSc in CS at Uppsala<br>&gt; <br>&gt; Citerar Sike Huang &lt;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#120;&#120;&#64;&#120;&#120;&#46;&#99;&#111;&#109;">xx@xx.com</a>&gt;:<br>&gt; <br>&gt; &gt; Hi, Ivan,<br>&gt; &gt; <br>&gt; &gt; I've sent an email on May 4th to Elin Carlsson <br>&gt; &gt; [mailto:xx@xx.uu.se], explaining that I'm not going to<br>&gt; Uppsala.<br>&gt; &gt; <br>&gt; &gt; Anyway, thanks for your offer and sincere help again.<br>&gt; <br>&gt; Ok, thanks for letting me know.<br>&gt; <br>&gt; Good luck with your studies!<br>&gt; <br>&gt; ivan<br>&gt; <br>&gt; PS Which school did you chose? (just curious :)<br>&gt; <br>&gt; &gt; <br>&gt; &gt; Best wishes,<br>&gt; &gt; <br>&gt; &gt; Sike Huang<br>&gt; &gt; <br>&gt; &gt;<br>&gt; ----------------------------------------------------------------------<br>&gt; ------<br>&gt; &gt; Hi, Elin Carlsson,<br>&gt; &gt; <br>&gt; &gt; It&#194;&#161;&#194;&#175;s a great honor that I&#194;&#161;&#194;&#175;ve been accepted to Uppsala University.<br>&gt; However<br>&gt; &gt; due to some personal preferences, I decide to go to another <br>&gt; &gt; university instead.<br>&gt; &gt; <br>&gt; &gt; Thanks for your offer and sincere help, and wish to have a chance to <br>&gt; &gt; visit Uppsala someday.<br>&gt; &gt; <br>&gt; &gt; Best Regards,<br>&gt; &gt; <br>&gt; &gt; Sike Huang<br>&gt; &gt;<br>&gt; ----------------------------------------------------------------------<br>&gt; ------<br>&gt; &gt; <br>&gt; &gt; <br>&gt; &gt; <br>&gt; &gt; -----Original Message-----<br>&gt; &gt; From: Ivan Christoff [mailto:xx@xx.uu.se]<br>&gt; &gt; Sent: 2007&#195;&#8222;&#195;&#170;5&#195;&#8221;&#195;&#8218;25&#195;&#710;&#195;&#8226; 12:52<br>&gt; &gt; To: <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#120;&#120;&#64;&#120;&#120;&#46;&#99;&#111;&#109;">xx@xx.com</a><br>&gt; &gt; Subject: MSc in CS at Uppsala<br>&gt; &gt; <br>&gt; &gt; <br>&gt; &gt; <br>&gt; &gt; Dear Mr. Huang,<br>&gt; &gt; <br>&gt; &gt; Are you still interested in joining the MSc Program in Computer <br>&gt; &gt; Science at Uppsala University?<br>&gt; &gt; <br>&gt; &gt; Our records show that you have not answered an address confirmation <br>&gt; &gt; mail which was sent a while ago.<br>&gt; &gt; <br>&gt; &gt; If you are still interested, please send me your correct mailing <br>&gt; &gt; address so that the admission letter can be sent.<br>&gt; &gt; <br>&gt; &gt; Best regards,<br>&gt; &gt; <br>&gt; &gt; Ivan Christoff<br>&gt; &gt; <br>&gt; &gt; <br>&gt; <br>&gt; <br>&gt; <br>&gt;&nbsp;</p>
<img src ="http://www.blogjava.net/cisco/aggbug/120370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cisco/" target="_blank">Scott@JAVA</a> 2007-05-28 05:17 <a href="http://www.blogjava.net/cisco/archive/2007/05/28/120370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java IDE继续飘香</title><link>http://www.blogjava.net/cisco/archive/2007/04/29/114461.html</link><dc:creator>Scott@JAVA</dc:creator><author>Scott@JAVA</author><pubDate>Sat, 28 Apr 2007 22:45:00 GMT</pubDate><guid>http://www.blogjava.net/cisco/archive/2007/04/29/114461.html</guid><wfw:comment>http://www.blogjava.net/cisco/comments/114461.html</wfw:comment><comments>http://www.blogjava.net/cisco/archive/2007/04/29/114461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cisco/comments/commentRss/114461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cisco/services/trackbacks/114461.html</trackback:ping><description><![CDATA[<p class=a14><strong>即使在微软开发平台大行其道的今天，Java IDE仍是企业开发人员用得最多的应用开发工具之一。可是，在实际使用中应该选择哪一种IDE呢？本文为开发者提供了一些选型的依据。</strong>
<p class=a14>Borland JBuilder、IBM Rational以及Sun NetBeans这三款著名的Java开发工具曾经分别获得美国《InfoWorld》2005、2006、2007年度的Java IDE产品类别&#8220;年度技术&#8221;奖，是目前市面上应用最多、性能最强大的开发工具之一。在过去的几年里，这些工具都成熟了很多，特别是在静态代码分析、单元测试和版本管理等方面取得了巨大进步。本文对这三款开发工具进行了详细评测，以期为开发人员提供一些选型的依据。
<p class=a14>IBM RAD 7： 不支持Java EE 5、Java SE 6
<p class=a14>IBM Rational Application Developer for WebSphere Software 7.0（简称RAD 7）基于Eclipse——Borland/CodeGear的JBuilder产品系列也基于这个开源软件框架。Eclipse原先就是一种Java IDE，不过近几年它重新定位，作为可以往上面添加多种插件的框架，因而可以构建各种各样的工具（许多工具与Java开发没有关系）。Eclipse新的框架定位引起了一些人的担忧，生怕原先的Java IDE概念已被淡化。这种担心也许不无道理，不过好就好在Eclipse目前拥有最大的Java插件社区。
<p class=a14>RAD 7为改动后的Eclipse库添加了几个组件，其中不少组件面向企业应用开发，它们包括门户组件和门户开发工具，还有广泛的数据库支持。数据库支持（尤其支持IBM的DB2）包括了编写用户自定义函数（UDF）、存储过程和SQLJ代码的功能，而这些都是本次测评的三款产品中特有的功能。
<p class=a14>不过，RAD 7的图解和建模功能比较有限，它只支持两种UML图（NetBeans和JBuilder分别支持八种和九种）。要从IBM获得更全面的图表支持功能，就得购买价格更昂贵的IBM Rational Software Architect。
<p class=a14>有了RAD 7，就可以开发Web服务和Web服务客户程序，生成Web服务描述语言（WSDL），甚至对专有的通用描述发现集成（UDDI）服务进行单元测试。另外，它还支持IBM的DADX，这是Web服务使用的DB2 XML扩展。遗憾的是，该产品以IBM为中心的特性还影响到了UDDI测试：它只支持使用基于IBM技术的专有注册库。
<p class=a14>在编码方面，RAD 7提供了静态分析工具，集成了IBM开发的200多项规则，适用于处理可能存在的Java缺陷和编码错误。尽管本次测评的其他IDE提供了更多规则，但IBM的解决方案可以把这些产品无法发现的错误标记出来，并详细说明使用规则的原因以及解决问题的示例代码。这种全面的帮助体现了IBM一贯以来的传统：说明文档翔实、完备。RAD可链接到广泛的教程。以丰富的文章数量而在开发社区中享有盛名的IBM网站也提供了另外一些资源。
<p class=a14>如果应用程序需要脚本语言来把各部分&#8220;粘合&#8221;起来，RAD 7还提供了内部支持基于Java的Python（Jython）的功能。遗憾的是，该IDE无法自动区别什么是Jython、什么是Java，尽管这两门语言的语法全然不同。这会导致有些操作使得IDE无法正常工作。
<p class=a14>尽管这个缺点很小，但表明了我在使用RAD 7时经常遇到的问题：许多特性没有实施好。譬如说，软件安装起来非常困难。得到IBM有关人员的支持后，笔者才正确安装上了该产品，不过原先的一些问题的原因根本就没有找出来。
<p class=a14>问题还不止这些。检查注释和文字拼写的选项（一项有用功能）没法使用，因为IBM没有发布词典。要是这项特性被启用，它会把所有单词标记为拼写有误。代码检查工具指定的纠正操作偶尔会无效。对话框里面的动态帮助经常把用户带到错误的地方，所以只好重新回到特定的上下文。
<p class=a14>一段时间后，这些问题堆积起来使得这个原本不错的产品用起来让人沮丧。另外，还有一个地方要抱怨：IBM在支持现有的Java标准方面落后于其他厂商。它是这次测评中惟一不支持Java EE 5和Java SE 6的一种IDE。
<p class=a14>因此，本文推荐已经在大量使用IBM产品的站点使用RAD 7，因为该产品特别支持这些产品，尤其是DB2和WebSphere。另外，要是站点希望许多国家的开发人员使用同一种IDE，应当会喜欢RAD 7，因为它的外文版本比其他任何一种IDE都要多得多。不过，价格比较高，加上其他方面的一些不足可能会促使站点在斥资购买之前会考察所有方案。
<p>
<center><img src="http://www2.ccw.com.cn/07/0714/b/pic/b10_3t2.jpg"></center>
<p class=a14>JBuilder 2007：相当出色的IDE
<p class=a14>Borland/CodeGear JBuilder 2007 Enterprise Edition在这次测评中荣登榜首。这个版本是自该产品移植到Eclipse平台以来的第一个版本。它由专门开发IDE工具的Borland旗下的CodeGear发布。由于Borland的产品用起来历来有难度，加上这是新平台上的第一个版本，所以我以为这个优秀产品会有些不尽如人意的地方。结果出乎所料，这个非常顺畅而稳定的IDE有许多创新的特性。可以这么说，CodeGear肯定为这个版本耗尽了心血，事实上确实也取得了辉煌成功。
<p>
<center><img src="http://www2.ccw.com.cn/07/0714/b/pic/b10_3t3.jpg"></center>
<center><img src="http://www2.ccw.com.cn/07/0714/b/pic/b10_3t4.jpg"></center>
<center><img src="http://www2.ccw.com.cn/07/0714/b/pic/b10_3t5.jpg"></center>
<p class=a14>至于Java编码，JBuilder有三个不同系列的代码审查器和分析器：开源PMD、Findbugs和Borland自己的代码检查工具。这些工具可以很好地协同工作（实际上，它们带来的众多标记项可能让开发人员招架不住），不过它们对出现的问题没有解释应采取什么措施，也没有IBM的RAD 7产品那样全面的问题解决建议办法。
<p class=a14>JBuilder捆绑了一个度量包（metrics package），它比任何IDE的度量包都来得全面。它可以生成80多种不同的度量，并且以图解或者电子表格的方式显示。用户可以关闭没有兴趣的度量，为确实想要跟踪的那些度量设定阈值。JBuilder还能保存度量快照，那样就可以将代码库的当前状态和前几次执行的状态进行比较，确保数字往正确的方向发展。
<p class=a14>CodeGear集成了JBuilder的OptimizeIt工具套件，多年来Borland把它作为独立产品来提供。OptimizeIt提供了众多的高清晰视图，可以了解软件的性能和内存使用情况。它包括代码覆盖分析（但只能分析类覆盖百分比，而不是逐行分析）及其他可见性，从而可以了解底层发生的情况，包括每个线程的数据。
<p class=a14>JBuilder还提供出众的协作特性。它拥有面向开发人员的消息传送系统，这有助于代码检查以及开发人员的通信。它使用对等设计模式，遗憾的是，只能与同一个网段上的伙伴协同工作。JBuilder为团队协作方面提供了TeamInsight，这个易于配置的门户服务器包括以下几个重要的开源工具：Subversion、Bugzilla、Continuum和XPlanner。该门户可以通过Web接口或者通过JBuilder访问，包含众多的项目报告和度量。其他两种IDE都没法与这种团队合作的紧密性相提并论。
<p class=a14>JBuilder整体上让人觉得可靠、稳定：考虑到它只是Eclipse平台上的第一个版本，取得这样的成绩实属不易。遇到的惟一错误就是经常出现不管用的帮助图标。需要抱怨的地方集中在没有实施的特性上，譬如缺少面向JSP或者JSF的可视化设计器（不过这些设计器很快就会出现）。该产品还无法为使用DB2的应用程序生成部署文件。最后，它目前只有Windows版本。Linux和Mac版本定于5月推出。
<p class=a14>截至测评时的版本价格为1999美元，所以JBuilder并不便宜，但完全物有所值。对不需要所有高端特性的开发人员来说，还可以使用专业版和开发人员版的JBuilder，价格分别为799美元和399美元。
<p class=a14>NetBeans 5.5：可免费下载
<p class=a14>Sun的NetBeans产品是这次测评产品中惟一完全开放源码的产品，可从netbeans.org免费获得。不像其他软件包，NetBeans需要一些组合。可以从核心NetBeans平台着手，添加几个&#8220;包&#8221;（pack），具体取决于开发者的需求。
<p class=a14>目前，Sun提供企业包和Visual Web包（两个都用于这次测评）、用于J2ME编程的移动包以及C/C++包。性能分析包（也用于这次测评）是一个独立的包。这些包包含常用的IDE插件，通常提供了大量新功能。一旦下载了这些包，安装起来就轻而易举。
<p class=a14>几年前，NetBeans更像是有一些优秀特性，但在后面跟随的IDE，难以与其他Java IDE产品真正平分秋色。但现在不再是这样，NetBeans为企业计算环境提供了几项实用特性，包括通过Sun的GlassFish项目这一形式支持Java EE 5。该IDE拥有面向基于服务的企业开发的优秀工具，无论是面向服务的架构（SOA），还是普通的Web服务。譬如说，NetBeans是本次测评中惟一拥有业务流程执行语言（BPEL）所需的全部图解和建模功能的产品。
<p class=a14>不过，该企业服务产品的不足是缺少支持常用产品的功能。NetBeans不支持IBM的WebSphere应用服务器，并且缺少支持JavaDB之外的其他任何数据库的集成功能。不过，后一点需要澄清一下：NetBeans能够识别可通过Java数据库连接性（JDBC）访问的任何数据库，但它只能为JavaDB生成配置文件、充分利用数据库管理系统（DBMS）特定的特性。
<p class=a14>NetBeans的协作特性非常好，拥有内置工具，可用于开发人员之间的实时协作，包括聊天和代码共享功能。不像JBuilder中的这些特性，NetBeans的设计基于服务器。可以构建自己的服务器用于这种通信，也可以免费使用Sun提供的服务器。只要登录到Sun的服务器，所在小组的任何开发人员都会连同他们的登录状态信息显示出来，这种设计类似IM产品中的在线感知（presence awareness）。；
<p class=a14>至于GUI设计，NetBeans捆绑了Matisse，这是同类中最出色的GUI布局工具。把窗口组件拖放到窗格和对话框上时，它们会正确地自动排列。最佳和可选位置排列方面的准则会在拖放操作过程中弹出来。Matisse然后利用这种设计来生成代码。
<p class=a14>如果站点大量开发基于Swing的接口，单单这个工具就让NetBeans成为它们的首选IDE，因为Matisse只与Swing协同工作。幸好，由于Swing的性能和外观感觉得到了稳定发展，这个局限不像以前那样来得严重。
<p class=a14>虽然本次测评的其他Java IDE都使用自己的专有格式来存放项目元数据，但NetBeans巧妙地依赖Ant文件来存放项目的配置数据（其实，它使用相当于make的开源Java工具Ant帮助构建代码）。这具有一大优势：在使用多种Java IDE的开发小组中，其他任何IDE都可以装入及运行NetBeans项目，不必手工转换或者分批导入。
<p class=a14>但使用Ant文件也有一个缺点：NetBeans只支持单一运行时配置。其他IDE大多数可以想编写多少运行时配置，就能编写多少，NetBeans却不是这样。要是每次想改变传递给应用程序的参数，就得手动改变一个配置（即将推出的6.0版本IDE解决了这个问题）。
<p class=a14>显然，NetBeans拥有不同寻常的特性组合——有些特性实施得很好，但另一些完全没有。它不但免费，而且比基于Eclipse的产品响应更迅即、操作更容易，因为它丢弃了Eclipse采用的&#8220;视图&#8221;设计，而是单单使用窗口。另外，NetBeans经常得到改进，拥有非常活跃的开发社区，得益于仅次于Eclipse的庞大插件库。
<p class=a14>事实上，NetBeans的新版本可以解决上述许多抱怨。如果你在考虑NetBeans，不妨在做出决定之前，看一下目前可以获得的版本6测试版。
<p class=a14>链接:其他的Java IDE工具
<p class=a14>挑选IDE的关键是选择既确保工作效率、又便于使用的一种IDE。下面简要介绍一下本文所讨论的产品之外的三个选择。
<p class=a14>Eclipse：如果不需要RAD 7或者JBuilder的高级特性，不妨考虑普通版本的Eclipse，可以从eclipse.org免费下载。如果需要几项高级特性，不妨考虑Genuitec的MyEclipse，它把许多开源工具（包括NetBeans的Matisse）集成到Eclipse里面，费用是每个用户每年54美元。
<p class=a14>JetBrains IntelliJ: 许多开发人员认为这款Java IDE是最有效率、最让人喜欢的纯编码环境。IntelliJ的界面比IBM、Borland或者Sun IDE来得直观，因而博得了美誉。它还有一些独特的特性，譬如说，代码规则在后台运行，所以在编码过程中出现的错误或者错误样式会实时显示；问题被纠正后，就会从屏幕上立马消失。这些规则比本次测评的三款产品都要来得多，对编写大量Java代码、又不需要建模工具的站点而言，IntelliJ是非常可靠、非常低廉的选择。
<p class=a14>Oracle JDeveloper: JDeveloper是一种特性丰富、免费（但不是开源）的Java IDE，可从Oracle网站获得。与NetBeans一样，它也不是基于Eclipse。它支持一些企业特性，包括SOA和Web服务，当然也支持与Oracle数据库技术和OC4J Java应用服务器之间的特殊集成。 </p>
<img src ="http://www.blogjava.net/cisco/aggbug/114461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cisco/" target="_blank">Scott@JAVA</a> 2007-04-29 06:45 <a href="http://www.blogjava.net/cisco/archive/2007/04/29/114461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>I'm 活动</title><link>http://www.blogjava.net/cisco/archive/2007/03/14/103676.html</link><dc:creator>Scott@JAVA</dc:creator><author>Scott@JAVA</author><pubDate>Tue, 13 Mar 2007 17:15:00 GMT</pubDate><guid>http://www.blogjava.net/cisco/archive/2007/03/14/103676.html</guid><wfw:comment>http://www.blogjava.net/cisco/comments/103676.html</wfw:comment><comments>http://www.blogjava.net/cisco/archive/2007/03/14/103676.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/cisco/comments/commentRss/103676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cisco/services/trackbacks/103676.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#000080" size="2">微软最新启动了一个 I'm 活动。I'm，是微软的一个资助慈善组织的活动。你可以在你的 Windows Live Messenger 的昵称前加上一串特殊代码，以表示你支持九个慈善组织中的其中一个，而你的昵称前也会出现一个 I'm 的标志。所有参加此活动的慈善组织都将在此活动的第一年获得最低10万美元的捐款，最高不限上额。而最高能达到多少，则取决于有多少人愿意在自己的昵称前加上该组织的代码。 </font>
		</p>
		<div>
				<font color="#000080" size="2">     </font>
		</div>
		<div>
				<font color="#000080" size="2">以下是参加活动的组织： <br />American Red Cross —— I'm 准备提供帮助，代码 = *red+u <br />Boys and Girls Clubs of America —— I'm 为孩子提供理想的环境，代码 = *bgca <br />National AIDS Fund —— I'm 与艾滋病（AIDS）抗争，代码 = *naf <br />National MS Society —— I'm 参与到解决多发性硬化症（MS）的运动，代码 = *mssoc <br />ninemillion.org —— I'm 帮助9百万流离失所的孩子，代码 = *9mil <br />Sierra Club —— I'm 探索和保护这个星球，代码 = *sierra <br />StopGlobalWarming.org —— I'm 阻止全球变暖，代码 = *help <br />Susan G. Komen for the Cure —— I'm 寻找乳腺癌的治愈方法, 代码 = *komen <br />UNICEF —— I'm 救助生死边缘徘徊的孩子，代码 = *unicef</font>
		</div>
<img src ="http://www.blogjava.net/cisco/aggbug/103676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cisco/" target="_blank">Scott@JAVA</a> 2007-03-14 01:15 <a href="http://www.blogjava.net/cisco/archive/2007/03/14/103676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初始化</title><link>http://www.blogjava.net/cisco/archive/2007/01/25/95827.html</link><dc:creator>Scott@JAVA</dc:creator><author>Scott@JAVA</author><pubDate>Wed, 24 Jan 2007 17:29:00 GMT</pubDate><guid>http://www.blogjava.net/cisco/archive/2007/01/25/95827.html</guid><wfw:comment>http://www.blogjava.net/cisco/comments/95827.html</wfw:comment><comments>http://www.blogjava.net/cisco/archive/2007/01/25/95827.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/cisco/comments/commentRss/95827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cisco/services/trackbacks/95827.html</trackback:ping><description><![CDATA[当Java程序运行时，需要某一个类，但该类还没有载入内存，则Java程序将该类装入内存，然后立即执行类中定义的类初始化块，执行次序就是类初始化定义的次序，然后执行对象初始化块，执行次序是定义的次序，最后执行类的构造函数，继续对对象进行初始化。<br /><br />例：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_8_184_Open_Image" onclick="this.style.display='none'; Codehighlighter1_8_184_Open_Text.style.display='none'; Codehighlighter1_8_184_Closed_Image.style.display='inline'; Codehighlighter1_8_184_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_8_184_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_8_184_Closed_Text.style.display='none'; Codehighlighter1_8_184_Open_Image.style.display='inline'; Codehighlighter1_8_184_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> A </span><span id="Codehighlighter1_8_184_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_8_184_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_25_69_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_69_Open_Text.style.display='none'; Codehighlighter1_25_69_Closed_Image.style.display='inline'; Codehighlighter1_25_69_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_25_69_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_25_69_Closed_Text.style.display='none'; Codehighlighter1_25_69_Open_Image.style.display='inline'; Codehighlighter1_25_69_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> A() </span><span id="Codehighlighter1_25_69_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_25_69_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">A的构造函数</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_76_122_Open_Image" onclick="this.style.display='none'; Codehighlighter1_76_122_Open_Text.style.display='none'; Codehighlighter1_76_122_Closed_Image.style.display='inline'; Codehighlighter1_76_122_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_76_122_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_76_122_Closed_Text.style.display='none'; Codehighlighter1_76_122_Open_Image.style.display='inline'; Codehighlighter1_76_122_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_76_122_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_76_122_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">A的动态初始化块</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_136_182_Open_Image" onclick="this.style.display='none'; Codehighlighter1_136_182_Open_Text.style.display='none'; Codehighlighter1_136_182_Closed_Image.style.display='inline'; Codehighlighter1_136_182_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_136_182_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_136_182_Closed_Text.style.display='none'; Codehighlighter1_136_182_Open_Image.style.display='inline'; Codehighlighter1_136_182_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_136_182_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_136_182_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">A的静态初始化块</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_205_381_Open_Image" onclick="this.style.display='none'; Codehighlighter1_205_381_Open_Text.style.display='none'; Codehighlighter1_205_381_Closed_Image.style.display='inline'; Codehighlighter1_205_381_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_205_381_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_205_381_Closed_Text.style.display='none'; Codehighlighter1_205_381_Open_Image.style.display='inline'; Codehighlighter1_205_381_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> B </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> A </span><span id="Codehighlighter1_205_381_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_205_381_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_222_266_Open_Image" onclick="this.style.display='none'; Codehighlighter1_222_266_Open_Text.style.display='none'; Codehighlighter1_222_266_Closed_Image.style.display='inline'; Codehighlighter1_222_266_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_222_266_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_222_266_Closed_Text.style.display='none'; Codehighlighter1_222_266_Open_Image.style.display='inline'; Codehighlighter1_222_266_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> B() </span><span id="Codehighlighter1_222_266_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_222_266_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">B的构造函数</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_273_319_Open_Image" onclick="this.style.display='none'; Codehighlighter1_273_319_Open_Text.style.display='none'; Codehighlighter1_273_319_Closed_Image.style.display='inline'; Codehighlighter1_273_319_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_273_319_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_273_319_Closed_Text.style.display='none'; Codehighlighter1_273_319_Open_Image.style.display='inline'; Codehighlighter1_273_319_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_273_319_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_273_319_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">B的动态初始化块</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_333_379_Open_Image" onclick="this.style.display='none'; Codehighlighter1_333_379_Open_Text.style.display='none'; Codehighlighter1_333_379_Closed_Image.style.display='inline'; Codehighlighter1_333_379_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_333_379_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_333_379_Closed_Text.style.display='none'; Codehighlighter1_333_379_Open_Image.style.display='inline'; Codehighlighter1_333_379_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_333_379_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_333_379_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">B的静态初始化块</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_402_579_Open_Image" onclick="this.style.display='none'; Codehighlighter1_402_579_Open_Text.style.display='none'; Codehighlighter1_402_579_Closed_Image.style.display='inline'; Codehighlighter1_402_579_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_402_579_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_402_579_Closed_Text.style.display='none'; Codehighlighter1_402_579_Open_Image.style.display='inline'; Codehighlighter1_402_579_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Test </span><span id="Codehighlighter1_402_579_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_402_579_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_447_577_Open_Image" onclick="this.style.display='none'; Codehighlighter1_447_577_Open_Text.style.display='none'; Codehighlighter1_447_577_Closed_Image.style.display='inline'; Codehighlighter1_447_577_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_447_577_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_447_577_Closed_Text.style.display='none'; Codehighlighter1_447_577_Open_Image.style.display='inline'; Codehighlighter1_447_577_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main(String[] args) </span><span id="Codehighlighter1_447_577_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_447_577_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">第一次生成类B的对象时输出</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> B();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">第二次生成类B的对象时输出</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> B();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><br />程序运行结果如下：<br /><br />第一次生成类B的对象时输出<br />A的静态初始化块<br />B的静态初始化块<br />A的动态初始化块<br />A的构造函数<br />B的动态初始化块<br />B的构造函数<br />第二次生成类B的对象时输出<br />A的动态初始化块<br />A的构造函数<br />B的动态初始化块<br />B的构造函数<img src ="http://www.blogjava.net/cisco/aggbug/95827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cisco/" target="_blank">Scott@JAVA</a> 2007-01-25 01:29 <a href="http://www.blogjava.net/cisco/archive/2007/01/25/95827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>运行时多态</title><link>http://www.blogjava.net/cisco/archive/2007/01/23/95574.html</link><dc:creator>Scott@JAVA</dc:creator><author>Scott@JAVA</author><pubDate>Tue, 23 Jan 2007 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/cisco/archive/2007/01/23/95574.html</guid><wfw:comment>http://www.blogjava.net/cisco/comments/95574.html</wfw:comment><comments>http://www.blogjava.net/cisco/archive/2007/01/23/95574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cisco/comments/commentRss/95574.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cisco/services/trackbacks/95574.html</trackback:ping><description><![CDATA[
		<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_8_116_Open_Image" onclick="this.style.display='none'; Codehighlighter1_8_116_Open_Text.style.display='none'; Codehighlighter1_8_116_Closed_Image.style.display='inline'; Codehighlighter1_8_116_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_8_116_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_8_116_Closed_Text.style.display='none'; Codehighlighter1_8_116_Open_Image.style.display='inline'; Codehighlighter1_8_116_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> A </span>
				<span id="Codehighlighter1_8_116_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_8_116_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> i </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_39_65_Open_Image" onclick="this.style.display='none'; Codehighlighter1_39_65_Open_Text.style.display='none'; Codehighlighter1_39_65_Closed_Image.style.display='inline'; Codehighlighter1_39_65_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_39_65_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_65_Closed_Text.style.display='none'; Codehighlighter1_39_65_Open_Image.style.display='inline'; Codehighlighter1_39_65_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">char</span>
						<span style="COLOR: #000000"> f() </span>
						<span id="Codehighlighter1_39_65_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_39_65_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">'</span>
								<span style="COLOR: #000000">A</span>
								<span style="COLOR: #000000">'</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img id="Codehighlighter1_88_114_Open_Image" onclick="this.style.display='none'; Codehighlighter1_88_114_Open_Text.style.display='none'; Codehighlighter1_88_114_Closed_Image.style.display='inline'; Codehighlighter1_88_114_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_88_114_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_88_114_Closed_Text.style.display='none'; Codehighlighter1_88_114_Open_Image.style.display='inline'; Codehighlighter1_88_114_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">char</span>
						<span style="COLOR: #000000"> g() </span>
						<span id="Codehighlighter1_88_114_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_88_114_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">'</span>
								<span style="COLOR: #000000">A</span>
								<span style="COLOR: #000000">'</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img id="Codehighlighter1_137_327_Open_Image" onclick="this.style.display='none'; Codehighlighter1_137_327_Open_Text.style.display='none'; Codehighlighter1_137_327_Closed_Image.style.display='inline'; Codehighlighter1_137_327_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_137_327_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_137_327_Closed_Text.style.display='none'; Codehighlighter1_137_327_Open_Image.style.display='inline'; Codehighlighter1_137_327_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> B </span>
				<span style="COLOR: #0000ff">extends</span>
				<span style="COLOR: #000000"> A </span>
				<span id="Codehighlighter1_137_327_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_137_327_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> i </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">;                   </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">变量重名</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">
								<br />
								<img id="Codehighlighter1_193_244_Open_Image" onclick="this.style.display='none'; Codehighlighter1_193_244_Open_Text.style.display='none'; Codehighlighter1_193_244_Closed_Image.style.display='inline'; Codehighlighter1_193_244_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_193_244_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_193_244_Closed_Text.style.display='none'; Codehighlighter1_193_244_Open_Image.style.display='inline'; Codehighlighter1_193_244_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">char</span>
						<span style="COLOR: #000000"> f() </span>
						<span id="Codehighlighter1_193_244_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_193_244_Open_Text">
								<span style="COLOR: #000000">{                   </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">方法重写</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">'</span>
								<span style="COLOR: #000000">B</span>
								<span style="COLOR: #000000">'</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img id="Codehighlighter1_267_325_Open_Image" onclick="this.style.display='none'; Codehighlighter1_267_325_Open_Text.style.display='none'; Codehighlighter1_267_325_Closed_Image.style.display='inline'; Codehighlighter1_267_325_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_267_325_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_267_325_Closed_Text.style.display='none'; Codehighlighter1_267_325_Open_Image.style.display='inline'; Codehighlighter1_267_325_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">char</span>
						<span style="COLOR: #000000"> g() </span>
						<span id="Codehighlighter1_267_325_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_267_325_Open_Text">
								<span style="COLOR: #000000">{           </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">这种重写不具有多态性。多态性指实例方法</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">        </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">'</span>
								<span style="COLOR: #000000">B</span>
								<span style="COLOR: #000000">'</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img id="Codehighlighter1_348_749_Open_Image" onclick="this.style.display='none'; Codehighlighter1_348_749_Open_Text.style.display='none'; Codehighlighter1_348_749_Closed_Image.style.display='inline'; Codehighlighter1_348_749_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_348_749_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_348_749_Closed_Text.style.display='none'; Codehighlighter1_348_749_Open_Image.style.display='inline'; Codehighlighter1_348_749_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> Test </span>
				<span id="Codehighlighter1_348_749_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_348_749_Open_Text">
						<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_393_747_Open_Image" onclick="this.style.display='none'; Codehighlighter1_393_747_Open_Text.style.display='none'; Codehighlighter1_393_747_Closed_Image.style.display='inline'; Codehighlighter1_393_747_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_393_747_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_393_747_Closed_Text.style.display='none'; Codehighlighter1_393_747_Open_Image.style.display='inline'; Codehighlighter1_393_747_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> main(String[] args) </span>
						<span id="Codehighlighter1_393_747_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_393_747_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        B b </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> B();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(b.i);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(b.f());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(b.g());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(B.g());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        A a </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> b;                  </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">子类对象当作父类对象使用</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">        System.out.println(a.i);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(a.f());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(a.g());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(A.g());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>
				<br />
				<br />程序运行结果：<br />2<br />B<br />B<br />B<br />1<br />B<br />A<br />A<br /><br />程序分析：在该示例程序中，变量i产生数据成员变量隐藏；实例方法f()是方法重写，对实例方法的重写会产生运行时多态性。static方法g()也是方法重写，但这种方法重写不具有运行时多态的特征，多态特征是针对实例方法而言。因此当子类对象作为父类对象使用时，在输出结果中看到，只有f()发生了运行时多态。</p>
<img src ="http://www.blogjava.net/cisco/aggbug/95574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cisco/" target="_blank">Scott@JAVA</a> 2007-01-23 17:20 <a href="http://www.blogjava.net/cisco/archive/2007/01/23/95574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>