<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>阿布的天空</title>
<link>http://blogger.org.cn/blog/blog.asp?name=pudding009</link>
<description>阿布的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[成为编程高手的八大奥秘]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13198</link>
<author>pudding009</author>
<pubDate>2006/4/5 12:42:24</pubDate>
<description><![CDATA[不知不觉做软件已经做了十年，有成功的喜悦，也有失败的痛苦，但总不敢称自己是高手，因为和我心目中真正的高手们比起来，还差的太远。世界上并没有成为高手的捷径，但一些基本原则是可以遵循的。 <BR>　　1. 扎实的基础。数据结构、离散数学、编译原理，这些是所有计算机科学的基础，如果不掌握他们，很难写出高水平的程序。据我的观察，学计算机专业的人比学其他专业的人更能写出高质量的软件。程序人人都会写，但当你发现写到一定程度很难再提高的时候，就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP，即使你再精通OOP，遇到一些基本算法的时候可能也会束手无策。 <BR>　　2. 丰富的想象力。不要拘泥于固定的思维方式，遇到问题的时候要多想几种解决问题的方案，试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上，除计算机以外，多涉猎其他的学科，比如天文、物理、数学等等。另外，多看科幻电影也是一个很好的途径。 <BR>　　3. 最简单的是最好的。这也许是所有科学都遵循的一条准则，如此复杂的质能互换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式：E=mc2。简单的方法更容易被人理解，更容易实现，也更容易维护。遇到问题时要优先考虑最简单的方案，只有简单方案不能满足要求时再考虑复杂的方案。 <BR>　　4. 不钻牛角尖。当你遇到障碍的时候，不妨暂时远离电脑，看看窗外的风景，听听轻音乐，和朋友聊聊天。当我遇到难题的时候会去玩游戏，而且是那种极暴力的打斗类游戏，当负责游戏的那部分大脑细胞极度亢奋的时候，负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候，我会发现那些难题现在竟然可以迎刃而解。 <BR>　　5. 对答案的渴求。人类自然科学的发展史就是一个渴求得到答案的过程，即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念，一定要找到问题的答案，你才会付出精力去探索，即使最后没有得到答案，在过程中你也会学到很多东西。 <BR>　　6. 多与别人交流。三人行必有我师，也许在一次和别人不经意的谈话中，就可以迸出灵感的火花。多上上网，看看别人对同一问题的看法，会给你很大的启发。 <BR>　　7. 良好的编程风格。注意养成良好的习惯，代码的缩进编排，变量的命名规则要始终保持一致。大家都知道如何排除代码中错误，却往往忽视了对注释的排错。注释是程序的一个重要组成部分，它可以使你的代码更容易理解，而如果代码已经清楚地表达了你的思想，就不必再加注释了，如果注释和代码不一致，那就更加糟糕。 <BR>　　8. 韧性和毅力。这也许是"高手"和一般程序员最大的区别。A good programming is 99 weat and 1ffee。高手们并不是天才，他们是在无数个日日夜夜中磨练出来的。成功能给我们带来无比的喜悦，但过程却是无比的枯燥乏味。你不妨做个测试，找个 10000以内的素数表，把它们全都抄下来，然后再检查三遍，如果能够不间断地完成这一工作，你就可以满足这一条。 <BR>　　这些是我这几年程序员生涯的一点体会，希望能够给大家有所帮助。]]></description>
</item><item>
<title><![CDATA[软件项目经理必备素质]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13197</link>
<author>pudding009</author>
<pubDate>2006/4/5 12:24:01</pubDate>
<description><![CDATA[<P>注：转载本文已征得作者同意，作者和本网站对内容不负任何责任。<BR>出处：http://www.mypm.net/articles/show_article_content.asp?articleID=7972<BR><BR>许多人都以为项目经理总是与“理想与光荣”相伴的，其实作为一个有志于改进中国软件开发流程的项目经理来说，他们承担的更多的是“艰辛与痛苦”。<BR>在这里，我通过我担任项目经理期间所遇到的种种现象，来总结项目经理所必需具备的素质，当这些素质您不具备的话，就需要花费多年的努力来培养他，如果无法培养成功，那么请您转换岗位，因为项目经理不适合您，您难以在这个方面获的成功。 
<P>一、执着 
<P>可以这么说，在中国如果不执着是做不成任何事情的，因为在软件开发流程中推行各种规范和管理制度的时候，你可能遇到各种各样的阻力和障碍，如果没有应付挫折的思想和准备，你是很难推行成功的。要知道这样一个基本事实，项目管理成败的关键是：如果你不坚持，谁也不会坚持下去的。指望领导的扶持和群众的自觉是不可能的。只有坚定信念，努力打动别人，才能成功。<BR>坚持到成功为止。只要决定上管理流程了，就不要后悔，唯有坚持，因为你拼命努力而实现了99%,你却不知，最后当你决定放弃的时候也许就是你要成功之时。要知道你准备放弃的时候可能正是对方也准备放弃之时，唯有坚持，你才能成功。 
<P>二、亲和力 
<P>亲和力是指你和团队相互依赖，相互信任能力的大小。亲和力是你领导团队走向成功的基础，如果一个团队的向心力不够，各自为政，那么失败就会在身边陪伴你。要团队的每个成员都信任你，你必须要做到关心下属，主动与下属沟通，为下属争取合法权利等。关心下属就是在日常工作中对下属的工作状况，发展方向进行指导，避免其走弯路；在生活中也对其身体状况进行关心，促进身体和心理健康的恢复。 
<P>多找下属沟通是消除误会的润滑剂，同时也是了解下属内心真实想法唯一捷径。做项目经理的人，在某些事情上的处理的确会与人不同，也难以令人理解。这个时候只有多与下属沟通，逐步达成共识，争取大家的理解和支持。记住，没有下属的理解和支持，你永远无法实现项目管理的规范化。这个环节很重要，我在这个方面曾经用时太少，走了许多弯路。另外就是了解下属的真实想法，经常了解一下下属的真实想法有利于我们不断改进和调整流程，使生产流程更加符合本团队的实际。切记一点，做领导的一定要多尊重下属的想法，并且与之沟通，若一味等下属找自己，那么是一般下属与之水火不容要摊牌时，才会与你沟通，这样悔之晚矣。 
<P>为下属争取合法权利是项目经理的一项重要职责。敢负责任是项目经理基本素质，如果你不经常研究工作数据保障下属的合法权益时，你就很难让你的团队保持高效率。曾经有一次，我们测试工程师的工作业绩突然下降了一半，我与之沟通后发现公司不讲效率只讲工作时间，他有一天特殊没上班，结果公司扣了一天的工资；但是他其实超额完成了月计划的120％。了解情况后，我与公司协调，顺利补回工资，生产效率就大幅上扬。 
<P>三、品德高尚 
<P>“一撇一捺是个人，世世代代学做人。”在这个世界上最难做的就是做个品德高尚的人。试想一个思想猥亵的人很难取得成功，即使靠钻营取得也只是暂时的，他不可能取得长久的成功。只有品德高尚的人才能感染周围的人，使团队具有向心力，从成功走向成功。 
<P>人有三种，一种是仗势欺人，一种是持才压人，最后一种是以德服人。仗势欺人的人自持地位高而指三道四，自然是不可能团结人，更不可能获得成功；持才压人的人自持学识高而盛气凌人，或咄咄逼人。殊不知“闻到有先后，术业有专攻”，“尺有所长，寸有所短”，难以学到更高的知识，也就难以取得更大的成功。只有以德服人的人以自己的修养和品德感染人，勇于吃亏，乐于助人，以德报怨，只有这样才能使你对立面德人都不忍心伤害你，团结到一切可以团结到的人，拥有这样的环境，你怎么可能不成功。 
<P>勇于吃亏，首先要放下私心，如果一个人始终 围着自己转的人是不可能做到的。“人不为己，天诛地灭”是八十年代后出生的人心灵普遍反应；但是要记住人首先是社会中的人，如果脱离了社会，人恐怕已不会成其为人了。因此只有当你抛弃私心，主动为人，别人才会反过来支持你，帮助你。<BR>乐于助人，是人类的一个良好品质，就象一首歌中所唱的“人字的结构就是相互支撑”。管理流程是不可能靠项目经理一个人维持的，必须要大家支持你。但是这却需要你多帮助别人，别人才会帮助你。不管团队成员发生什么事情，你要尽你所能去帮助他，这样团队才可能继续前进。<BR>以德报怨，可能是人最难做到的。中国人就强调“人若犯我，我必犯人”，其实在这回中不会有真正的仇敌，大家明争暗斗的结果如果过20年后再去看的时候，保准一大半的人都会觉得不值得，许多人赌得就是一口气，将自己成功的希望给湮灭了。当你能用宽容喝善良对待你对立面的人的时候，还有什么东西能阻挡你成功？ 
<P>“得道多助，失道寡助；多助之至，天下顺之，失道之至，亲戚叛之；以天下之所顺，攻亲戚之所叛；故君子有不战，战必胜矣。” 
<P>四、口才 
<P>良好的口才是项目经理打动项目成员的必备武器，当你拥有良好的口才将会使你无往不利。当年希特勒就是用他那天才般的口才征服了德国，使他的《我的奋斗》贯彻到每一个德国人的心中，从而成立了第三帝国。 
<P>要使自己的项目管理思想贯彻到每一个项目成员心中，就必须要做到以下的演讲原则：<BR>1.根据项目成员的共同目标象他们制定演讲内容，只有让他们信服你才有意义；<BR>2.调动听众的这种感官，诉之触觉、视觉、听觉，用黑板、姿势来辅助你的内容。<BR>3.不断的总结效果，改进自己演讲宣传的接受度，如果效果不理想，尝试换一个方式来表达和描述。<BR>4.让听众学以至用，只有他们积极反馈，才能更深入的听你的思想。 
<P>五、循序渐进 
<P>循序渐进，不急于求成是项目经理在项目管理中必需具备的品质，在中国CMM过程改进的热潮中，真正实现CMM管理的企业屈指可数，而以CMM改进过程实质性为企业带来质量提升和效益改进的公司更是寥落晨星。 
<P>为什么会出现这种情况？难道CMM真的不适应中国过情吗？不是，绝对不是。是这些企业的项目经理太心急，连CMM2还不知道怎么回事就直奔CMM3，他们忽视了事务发展的客观规律，凡事必须循序渐进。如果有一个企业在2年内通过了CMM4，我有十足的信心说，那是花钱买征；如果乐观一点，一个中小企业从CMM1走到CMM2大约要2年时间，大型企业只会更长，不会更短，因为他们需要在培训和沟通上付出更大的代价。 
<P>就以我所在公司来说，技术部原来只有10任，后来培训CVS版本管理到精通花费了1年，然后才上CVSTrac变更和过程管理，花费了3个多月，然后再实施Finabuild管理花费了3个月，最后改进CVSTrac成CVSProduce管理开发过程并统计花费了半年，其间成立了QA管理部门，并增加了项目专职管理人员，部门人数已经增加到16人，还在不断扩充中。我们的感觉管理越科学化、流程化，所需的分工就越细，人员也就越多。同事培训和做通这些人的思想工作的成本就越大。开发管理软件的成本也会随之上升。当所有人都能接受流程管理并持续改进时，大约2年光阴也就过去了。<BR>“循序渐进，循序渐进，再循序渐进。”这句巴斯德德经典名言同样适用于我们项目管理领域，他将逐步把我们带向成功。 
<P>六、持久求学 
<P>“书到用时方恨少，学至成时始知卑。”学无止境，我在生产实践中发现，整个项目管理过程改进就是“学习－培训－实施－发现问题－再学习”的循环过程，项目经理如果不学习将不能解决现实工作中出现的新问题，更不可能站在一个战略的角度来解决问题。 
<P>事实上，求学也不能没有目标，否则学到的知识太庞杂，而不能融会贯通，这样的知识对实际工作指导甚少，真正的知识是一个目标体系，严格按照流程来一步步的掌握我们所需要的知识。<BR>最后，我总结一下中国项目经理所必需掌握的知识：<BR>1.专业知识：数据结构、关系数据库、操作系统、软件工程、编译原理。（外国的项目经理可能不需要掌握）<BR>2.管理知识：项目计划、项目配置管理、成本核算、风险预估、绩效考核。这是项目经理必须掌握的内容。<BR>3.网络知识：服务器的架构、各种服务的配置。因为管理的大厦是基于软件的管理，没有一个服务管理的网络配合是不可以想象的。<BR>4.“越过高峰，另一峰却又现”，这是中国项目经理在持续求学中会不停的挑战自我，向更高的山峰迈进。 
<P>七、敢负责任 
<P>一个人因为有责任才有生存的意义。一个人随着年龄的增长，责任感也会愈来愈重。成年时，法律也会赋予一些年少时没有的责任。同时地位逐渐提高，责任也会相对加重。 
<P>一个人惟有负责，才能产生做人的价值。所负责任愈大，价值就愈高。换句话说，有责任，生命才有意义。如果没有感受到自己该负的责任，即使年龄超过20岁，也不算是一个成年人。 
<P>因此，经理就是要负责任，如果不负责任就可以不要经理了！项目经理关系到一个项目的成败；对于公司他必须要承担及时汇报项目进度、成本核算和质量系数的责任，同时也必须保证项目组成员绩效考核，政策落实，预留人才储备等责任，是整个项目中责任最大的人，如果没有良好的心理素质和应对能力是无法担负责任的。 
<P>实际工作中项目经理主要要负责项目组的人员安排调度、工作分配、工作审核、工作跟踪、项目计划、项目汇报总结、成本核算、利润分配等职责。 
<P>八、以身作则 
<P>项目管理的一个重要工作就是定义各种规范和制定，但是这些规范和制度的执行除了靠项目经理的执着推行，口才宣传，力主培训、惩戒得当之外，关键还是在于项目经理的以身作则。如果项目经理自己都违反自己定义的条款的话，那么就别指望团队会自觉遵守这些规定。 
<P>作为一个管理者以身作则是最基本的素质，千万不要为自己违反规范和制度找各种借口，例如我我是公司只属考核，我因为某某更重要的事情而不得不违反。“只许周宫放火，不许百姓点灯”的话，是无法将规范和制度推入人心的。项目经理如果违反了规范，只有当众加重处罚，别无他法。<BR>说个真实的事例。我从事项目经理工作之前经常迟到，结果不久全技术部人隔三岔五的迟到。我当项目经理后执行晨会制度，早上到公司头半个小时总结一下昨天工作，探讨一下今天的工作，但是因为习惯，有人总是迟到。而我开始从不迟到，有一点为了赶时间我长跑去买早餐以在晨会规定时间之前到公司，被许多团队成员看见。以后就再没人迟到，直至项目结束。 
<P>因此，鉴于规范制度的权威性主要还是靠项目经理自己，只有坚持以身作则，才能将自己优秀的管理思想贯穿下去，取得开发过程改进的成功。 
<P>九、要有威信 
<P>一个项目经理说话有没有人听，必须要靠威信，这种威信是靠自身的素质，而不是狐假虎威。靠高层领导的支持来强迫团队执行项目制度过程的话，是注定会失败的。因为团队成员不信任你，表面服从，实际消极怠工，就足以让流程实质瘫痪。 
<P>做事要有信用，说一不二，不能因为朋友关心就讲情面。公是公，私是私。平时可以稀稀拉拉，关键问题决不手软，不因为朋友关系妥协，这样才能树立威信，便于工作。<BR>威信除了必要的威信之外，最主要的还是信用，项目经理在做事没有绝对把握的时候千万不要承诺，一旦承诺就无论如何一定要实现。否则，当实现不成功而丢失信用之后，再想让团队相信你，信任你就是非常困难的事情了。 
<P>十、善于总结 
<P>项目经理要善于总结，只有不断的总结才能不停的完善自己，成功的事情总结经验，失败的事情要总结教训，总结的过程就是不断改进的过程，这也是CMM规范所必需的素质。 
<P>总结的过程要多吸取别人的意见，不要武断自己的结论。博人所长，综合起来才算趋于完美。这个原因有二：其一，项目经理不是孤立的一个人，而是必须融于团队之中，一个流程合不合理，不是由项目经理说了算，而是要由团队的成员说了算，注意倾听团队成员的真实感受，不断改进流程才能成功。中国的许多CMM改进失败，并不是项目经理知识能力不够，而是他们没有一起与团队总结，经多年经验，我们发现大多数规范，必须要有一套合理的软件支持才能成功，否则无论你的理想多先进，想靠程序员工作来提高过程质量的改进是不现实的。其二，“闻道有先后，术业有专攻”，项目经理不可能是全才，什么都懂。因此要和哪些与专攻方向不同的人一起总结。比如项目经理可能精通软件开发流程的改进，但是却不知道测试流程、网络管理流程、品质保证流程的改进，而这些流程又直接作用于软件开发流程。这个时候必须与测试人员、网管人员、质量保证人员共同探讨，找出一条切实可行的改进方案。 
<P>项目经理除了必须具备以上素质外，还必须要有珍惜时间、要有勇气、善于倾听等基本素质，我就不一一描述了，只有寄希望于大家在做项目经理的时候不断的培养完善自己，让软件开发流程不断获得改进。</P>]]></description>
</item><item>
<title><![CDATA[[推荐]偷懒的时候，不想看书的时候就看看这段话吧]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13111</link>
<author>pudding009</author>
<pubDate>2006/4/2 16:27:29</pubDate>
<description><![CDATA[<STRONG>[推荐]偷懒的时候，不想看书的时候就看看这段话吧。<BR><BR></STRONG>有些文章总有很感人的话语……以前记录的一些片断，每当偷懒时就拿出来看看，激励下自己～与大家分享～一起受益～具体也忘记什么文章的了～冒犯之处请多多见谅～但真的很鞭策～<BR>……<BR><BR>&nbsp; &nbsp; 我的信心多数是来自于当年在上大学时学习外语的经历，我是在大学二年级时立志要学好外语的，记得在那一年的那个冬天，当时的我英语并不突出，连看范读的文章都要查很多生词，那时我坐在阶梯教室里在想，我到底什么时候能学好外语，而经过一年的魔鬼般训练，转年的同一个时间，我已经能流利的阅读数本英文小说。<BR>&nbsp; &nbsp; 记得那时候学英语的材料没有现在来源方便，我都是寻便任何渠道去寻找学习英语的资源，看遍所有的泛读材料，就会自己去买小说。作遍图书馆里的托福题，却买不起书店的书，没办法，我都是常常站在外文书店的书架前，作完一套又一套的托福题。只有一个小随身听，我就是只用两盘空磁带不断反复的在学校的听力室复习听力材料，包括从80年到92 年的托福听力，电影剪辑，小故事，几乎听便了学校里所以可以找到的资料。那时每天早起的第一件事情就是打开收音机去听***，记得那时宿舍里收不到信号，所以我都是在操场上听，即使数九寒天的冬季我也不例外，就是这样，在转年的十月份，我就以630分通过了托福，而且听力是满分。<BR>&nbsp; &nbsp; 考完托福我就一股作气，决心向GRE 冲刺，当时在整个长春市买不到GRE的复习资料，我就一个人只身第一次来到北京，也见到了初具雏形的新东方， 94年的北京到处都是丑陋的***面的。而新东方还在中关村极不起眼的小胡同里，也并不是很有名气，我在那里买了一些模拟试题，埋头花了3 个月的时间终于以2100的成绩通过了GRE。<BR>&nbsp; &nbsp; 那时我还不到二十岁，九三年末，九四年初，我的大多数同学还在忙着四六级，不少人还根本没有听说过什么是GRE。<BR>&nbsp; &nbsp; 虽然最终我并没有凭TOFEL 和GRE的成绩如愿到美国就读博士，但是这段经历却奠定了我一生拼搏的基础。所以我坚信，无论你是在校的本科生，研究生，还已经踏入社会的住院医，主治医生，无论你有什么样的英文基础，只要有恒心，你都有可能通过USMLE。当你回首所走过的路的时候，往往并不光是所取得的成绩让你感到自豪，这个过程却更会让你拥有一个新的高度，去选择你的人生。<BR>当我回顾以前自己所写的日记，处处可以找到勉励我自己前进的话语，我坚信，相信你也相信 “ 天生我材必有用” <BR><BR>……<BR><BR>&nbsp; &nbsp; 有了考USMLE的决心，下一步重要的就是如何安排自己的时间了。大话西游中孙悟空说到“ 如果给一个期限，那就是一万年”，可是我当年已经年近30，再也没有时间，也没有理由在十字路口彷徨。身负养家立业的责任，还要有买房生子的理想，也不允许我再象十年前那样舍弃一切的为自己的目标奋斗。为了赚钱，为了不影响工作经历，我的学习时间仅限于晚上和早起，一天疲惫的工作后当拿起USMLE 的复习书籍时我反而不知疲倦。那时我的妻子从中国来到新加坡，在她刚来的几个月中我们还是同那两个菲律宾的medical officer 共租一处公寓。为了不影响她休息，我都是在露天的阳台上看书，灯光虽暗，还有月光，困睠了，虫子会将我咬清醒，一月份的天气渐凉，但是还是很喜欢每到深夜只属于我自己的游泳池，在冰冷的水中可以舒缓我一天的疲惫，迎接新的一天。就是这样业以继日， 当复习8 个月通过step 1 时，我才发现一些白发爬上了的鬓角，我已经不再轻了！ <BR>……<BR><BR>看后感慨良多～喜欢就收藏巴～]]></description>
</item><item>
<title><![CDATA[9种食物延缓衰老(组图)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13109</link>
<author>pudding009</author>
<pubDate>2006/4/2 16:15:51</pubDate>
<description><![CDATA[<FONT color=#0000ff>美国《时代周刊》近期刊登了一篇美国营养学家的文章，文中指出，身体内氧自由基不断增多是导致衰老的重要原因，在我们的日常食物中，有9种对抗氧自由基的能力特别强，可以起到延缓衰老的作用。</FONT> 
<P align=center><A href="http://photocdn.sohu.com/20050531/Img225774133.jpg" target=_blank><IMG onmousewheel="return bbimg(this)" title=点击在新窗口查看原始图片 alt=9种食物延缓衰老(组图) src="http://photocdn.sohu.com/20050531/Img225774133.jpg" onload="java_script_:if(this.width>500)this.width=500" border=1></A>&nbsp;<A href="http://post.pic.sohu.com/view/picrecommend.do?abc=check&amp;picurls=http://photocdn.sohu.com/20050531/Img225774133.jpg&amp;topicSubject=9%D6%D6%CA%B3%CE%EF%D1%D3%BB%BA%CB%A5%C0%CF%28%D7%E9%CD%BC%29&amp;domainName=health.sohu.com&amp;keyWord=%BD%A1%BF%B5%D2%FB%CA%B3%3B%B1%A3%BD%A1%B3%A3%CA%B6&amp;sourcePageUrl=http://health.sohu.com/20050601/n225765720.shtml&amp;media=%BB%B7%C7%F2%CA%B1%B1%A8-%C9%FA%C3%FC%D6%DC%BF%AF&amp;author=" target=_blank><A href="http://photocdn.sohu.com/20050413/Img225167000.gif" target=_blank></A></A><BR><FONT color=#000000 size=2><A class=black href="http://photocdn.sohu.com/20050531/Img225774133.jpg" target=_blank>番茄</A></FONT></P>
<P>　　<STRONG>番茄：</STRONG>很多研究都表明，烹制过的番茄可以降低人类患前列腺癌和其他癌症的危险。这都要归功于番茄里含有的番茄红素，它是同类营养素中最强有力的抗氧化剂。除此之外，其中的茁胡萝卜素在消灭氧自由基方面也很出色。</P>
<P>　　因此，别看西红柿小，其实它给我们带来的益处还大着呢！据研究测定：每人每天食用50克-100克鲜西红柿，即可满足人体对几种维生素和矿物质的需要。<A href="http://health.sohu.com/33/51/article213165133.shtml" target=_blank><FONT color=#0000ff>详细阅读&gt;&gt;&gt;&gt;</FONT></A></P>
<P align=center><A href="http://photocdn.sohu.com/20050531/Img225774134.jpg" target=_blank><IMG onmousewheel="return bbimg(this)" title=点击在新窗口查看原始图片 alt=9种食物延缓衰老(组图) src="http://photocdn.sohu.com/20050531/Img225774134.jpg" onload="java_script_:if(this.width>500)this.width=500" border=1></A>&nbsp;<A href="http://post.pic.sohu.com/view/picrecommend.do?abc=check&amp;picurls=http://photocdn.sohu.com/20050531/Img225774134.jpg&amp;topicSubject=9%D6%D6%CA%B3%CE%EF%D1%D3%BB%BA%CB%A5%C0%CF%28%D7%E9%CD%BC%29&amp;domainName=health.sohu.com&amp;keyWord=%BD%A1%BF%B5%D2%FB%CA%B3%3B%B1%A3%BD%A1%B3%A3%CA%B6&amp;sourcePageUrl=http://health.sohu.com/20050531/n225774161.shtml&amp;media=%BB%B7%C7%F2%CA%B1%B1%A8-%C9%FA%C3%FC%D6%DC%BF%AF&amp;author=" target=_blank><A href="http://photocdn.sohu.com/20050413/Img225167000.gif" target=_blank></A></A><BR><FONT color=#000000 size=2><A class=black href="http://photocdn.sohu.com/20050531/Img225774134.jpg" target=_blank>菠菜</A></FONT></P>
<P>　　<STRONG>菠菜：</STRONG>菠菜里富含铁和叶酸。叶酸不但可以预防小儿神经管缺失，还可以降低高半胱氨酸(一种可以刺激血管和导致心脏病的氨基酸)在血液中的浓度。此外，菠菜中含有叶黄素和玉米黄质，它们可以阻止失明的头号“杀手”——视网膜黄斑性病变。</P>
<P align=center><A href="http://photocdn.sohu.com/20050531/Img225774135.jpg" target=_blank><IMG onmousewheel="return bbimg(this)" title=点击在新窗口查看原始图片 alt=9种食物延缓衰老(组图) src="http://photocdn.sohu.com/20050531/Img225774135.jpg" onload="java_script_:if(this.width>500)this.width=500" border=1></A><BR><FONT color=#000000 size=2><A class=black href="http://photocdn.sohu.com/20050531/Img225774135.jpg" target=_blank>坚果</A></FONT></P>
<P>　　<STRONG>坚果：</STRONG>坚果像一个小型的营养发动机，其中含有对人体有益的脂肪酸和维生素E。</P>
<P><FONT color=#0000ff>　　<FONT color=#000000>坚果是植物的精华部分，一般都营养丰富，含蛋白质、油脂、矿物质、维生素较高，对人体生长发育、增强体质、预防疾病有极好的功效。</FONT><FONT color=#000000>&gt;&gt;&gt;&gt;</FONT><A href="http://cms3.sohu.com/cms/entity.jsp?ENTITYID=225701949&amp;mod=subdetail" target=mm>六种坚果对抗六种疾病</A></FONT></P>
<P>　<STRONG>　燕麦：</STRONG>每天吃点燕麦可以起到降低胆固醇的作用，因为它含有茁葡聚糖，是一种海绵状可溶解的纤维素，可以让早期生成的胆固醇化于无形。&gt;&gt;&gt;&gt;<A href="http://cms3.sohu.com/cms/entity.jsp?ENTITYID=225765973&amp;mod=subdetail" target=mm>降胆固醇的食疗佳品</A></P>
<P align=center><A href="http://photocdn.sohu.com/20050531/Img225774136.jpg" target=_blank><IMG onmousewheel="return bbimg(this)" title=点击在新窗口查看原始图片 alt=9种食物延缓衰老(组图) src="http://photocdn.sohu.com/20050531/Img225774136.jpg" onload="java_script_:if(this.width>500)this.width=500" border=1></A>&nbsp;<A href="http://post.pic.sohu.com/view/picrecommend.do?abc=check&amp;picurls=http://photocdn.sohu.com/20050531/Img225774136.jpg&amp;topicSubject=9%D6%D6%CA%B3%CE%EF%D1%D3%BB%BA%CB%A5%C0%CF%28%D7%E9%CD%BC%29&amp;domainName=health.sohu.com&amp;keyWord=%BD%A1%BF%B5%D2%FB%CA%B3%3B%B1%A3%BD%A1%B3%A3%CA%B6&amp;sourcePageUrl=http://health.sohu.com/20050531/n225774163.shtml&amp;media=%BB%B7%C7%F2%CA%B1%B1%A8-%C9%FA%C3%FC%D6%DC%BF%AF&amp;author=" target=_blank><A href="http://photocdn.sohu.com/20050413/Img225167000.gif" target=_blank></A></A><BR><FONT color=#000000 size=2><A class=black href="http://photocdn.sohu.com/20050531/Img225774136.jpg" target=_blank>花椰菜</A></FONT></P>
<P>　　<STRONG>花椰菜：</STRONG>其中含有很多植物化学因子，可以在癌细胞形成之前将它们消灭掉。它还含有胡萝卜素、纤维素和维生素C。最好的吸收方法就是稍稍炒一下，吃时多咀嚼。类似的蔬菜还有甘蓝和卷心菜。&gt;&gt;&gt;&gt;<A href="http://health.sohu.com/20050509/n225465866.shtml" target=_blank>猪牛羊肉吃太多会致癌</A></P>
<P><STRONG>　　鲑鱼：</STRONG>这种鱼主要以吃海藻为生，而海藻可形成一种特别的脂肪，就是我们熟知的欧咪伽—3脂肪酸，对于心脏非常有益，还可以抑制与自身免疫系统相关的疾病。</P>
<P align=center><A href="http://photocdn.sohu.com/20050531/Img225774137.jpg" target=_blank><IMG onmousewheel="return bbimg(this)" title=点击在新窗口查看原始图片 alt=9种食物延缓衰老(组图) src="http://photocdn.sohu.com/20050531/Img225774137.jpg" onload="java_script_:if(this.width>500)this.width=500" border=1></A><BR><FONT color=#000000 size=2><A class=black href="http://photocdn.sohu.com/20050531/Img225774137.jpg" target=_blank>大蒜</A></FONT></P>
<P><STRONG>　　大蒜：</STRONG>大蒜里含有的植物化学因子对心脏有益。为了让它发挥最大的功效，最好把大蒜切碎或者捣碎食用，吃时不要长时间加热，否则会丧失它的有益成分。精彩推荐：<A href="http://cms3.sohu.com/cms/entity.jsp?ENTITYID=224743705&amp;mod=subdetail" target=mm>葱姜蒜绿色补品</A></P>
<P><STRONG>　　绿茶：</STRONG>绿茶内含有的多酚是一种健康作用百倍于维生素C的植物化学因子。日本研究表明，每天饮用10杯绿茶可以减低患心脏病的危险，用它做漱口水还可以抑制口腔细菌的生长。</P>
<P><STRONG>　　蔓越橘：</STRONG>蔓越橘中所含的抗氧化剂比任何水果和蔬菜都多，其中的花青素对心脏病和癌症的治疗很有帮助，还可以防止大肠杆菌附着在膀胱壁上，导致尿道炎。</P>]]></description>
</item><item>
<title><![CDATA[狼的十大哲学(你应当遵从的人生哲理)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13108</link>
<author>pudding009</author>
<pubDate>2006/4/2 16:12:42</pubDate>
<description><![CDATA[<P>1,卧薪尝胆&nbsp;<BR>狼不会为了所谓的尊严在自己弱小的时候去攻击比自己强大的东西&nbsp;<BR>2，众狼一心&nbsp;<BR>狼如果不得不去攻击比自己强大的东西，必群起而攻之&nbsp;<BR>3，自知之明&nbsp;<BR>狼也想当兽王，但狼知道自己是狼而不是老虎&nbsp;<BR>4，顺水推舟&nbsp;<BR>狼知道如何用最小的代价去换取最大的回报&nbsp;<BR>5，同进同退&nbsp;<BR>狼虽然通常独自活动，但狼却是最团结的动物，你不会发现有哪只狼在同伴受伤的时候独自逃走&nbsp;<BR>6，表里如一&nbsp;<BR>狼也很想当一个善良的动物，但狼也知道自己的胃只能消化肉，所以狼唯一能做的就是干干净净吃掉每次猎物，而某些自以为善良的动物却在酒店饭店里做一些不是"太善良"的事&nbsp;<BR>7，知己知彼&nbsp;<BR>狼尊重每一个对手，狼在每次攻击前都会去了解对手，而不会轻视它，所以狼一生的攻击很少失误&nbsp;<BR>8，狼亦钟情&nbsp;<BR>公狼会在母狼怀孕后，一直保护母狼，直到小狼有独立能力。而不像某些自认为"唯一有感情"的动物，在妻子怀孕后，在外花天酒地。所以狼很不满人把那些不钟情的人称之为狼心狗肺！因为这不公平！&nbsp;<BR>9，授狼以渔&nbsp;<BR>狼会在小狼有独立能力的时候坚决离开它，因为狼知道，如果当不成狼，就只能当羊了。&nbsp;<BR>10，自由可贵&nbsp;<BR>狼不会为了嗟来之食而不顾尊严的向主从摇头晃尾。因为狼知道，决不可有傲气，但不可无傲骨，所以狼有时也会独自哼哼自由歌。&nbsp;</P>
<P><BR>缘起</P>
<P>狼是一种大型哺乳动物，就哺乳动物而言最早的类群出现在大约1。5亿年前的侏罗纪晚期，而他们的直系祖先（最早的哺乳动物）则在2。2亿年前就生活在地球上。最高的犬科类鼠狗的出现也在4000万年前的北美大陆,当时是从树上来到陆地上奔跑,今天的美洲灰狐就可以上树.而就我们人类本身而言据最新资料表明最早的人类也不过在地球上生活了600万年。这听起来似乎是一个巨大的数字，但如果把它与哺乳动物的出现或与我们赖以生存的地球的年龄（46）作比较就会发现人类的幼小（菌藻38亿）。而狼这种被人类认为比自身低等的多动物则是在距今2000万年的更新世出现在地球上的，整整早于人类1400万年。当然，在这漫长的岁月里狼从最早个体娇小的新鲁狼进化到了今天个体较大的灰狼；虽然如此，2000万年来，它是地球上最厉害的犬科动物。人类也从600万年前的四肢辅助行走到学会茹毛饮血到今天的拥有高度的自主文明。当我们抛开所谓的地球主宰者的头衔时，面对同样是哺乳动物而年长人类千百万年的狼时，人类可能会发现有太多的东西值得向狼去学习。</P>
<P>&nbsp;</P>
<DIV>生物链中的狼 
<P></P>
<P>1、（狼体长1－1.6米／&nbsp;尾长1尺－1尺半左右／体重30－40公斤／善于奔跑／在布满荆棘、石块、坎坷不平的丘陵地带，它沿着45倾斜角向下奔跑，也能达到45公里的速度。如平地则可达56公里时速。／食肉每次可达10－15公斤／夜行性，怕光，昼伏夜出／善游泳。／狼的寿命一般为12－15年／&nbsp;每年繁殖一次，冬末春初，每胎产仔5－10个／&nbsp;）&nbsp;,多变的食物使犬科动物成为了机会主义者.&nbsp;</P>
<P>2、大自然的草（食物）多了（此前是驯鹿少了），吃草的驯鹿就自然的多了，当多的超过实物供应的饱和度时，草就少了，这时有些驯鹿就开始虚弱、受疾病的侵袭、不健康的个体就越来越多；这时狼来了，将老弱病残干掉，驯鹿的整体素质得到了提高，驯鹿群体健康了，数量也少了；这时草又多了。(西奥多罗斯福案例)&nbsp;</P>
<P>3、有了狼，才淘汰了所有不适合的角色，谁要想登上历史舞台，必须要有真功夫，否则必遭狼的吞食淘汰。由于有狼的存在，其他野生动物才得以淘汰老、弱、病、残的不良族群；也因为有狼的威胁存在，其他野生动物才被迫进化得更优秀，以免被狼淘汰，所以狼使生态处于一种平衡状态。故，狼是良兽，是社会的清道夫。</P>
<P>未完&nbsp;</P>
<P>4、早在很久以前爱斯基摩人和印第安人就注意到了，如果没有狼，他们赖以生存的大型动物就会变得体弱多病。他们珍视狼的存在。&nbsp;</P>
<P>5、由于人类的猎杀，狼群的数量也在急剧下降，现在国际IUCN（国际自然资源保护联盟）已经成立专门的狼研究专家小组，从事研究有关狼的保护问题。</P>
<P>6、另外金贝狼的皮毛价值也是非常昂贵的，约50万欧元，即＊＊＊元人民币。对眼穿的狼皮价值最高。&nbsp;</P>
<P>7、虽然如此，但大多数人对狼仍是敬而远之。我想这里的原因有很多……&nbsp;</P>
<P>调查表明：狼群的生存对鹿的种群的健康发展起着有益的作用。所以狼是GOOD&nbsp;ANIMAL。&nbsp;</P>
<P>思考：社会上如果没有狼，那么，在各行业中就会充满着不够职业水准的人，充满着“老弱病残”的投机者，充满着幼稚的初学者，乃至使整个行业水准低落。&nbsp;<BR>有了狼，“物竞天择，优胜劣汰”的自然法则才会在商业中正常运行，得以维护整体的利益。<BR></P>
<DIV>恶狼传说 
<P></P>
<P>早些时候开始，人们对狼几乎就有了偏执狂般的恐惧和憎恶，这是有许多缘由的……&nbsp;<BR>一种可能是羔羊乃是基督的象征，同时又是狼的美餐，因此狼变成了邪恶的化身。&nbsp;<BR>另一种可能是发生在中世纪欧洲大陆的某些事情导致的人们对狼普遍的存在恐惧。&nbsp;<BR>还有就是出于儒学的善缘人们编织着各种传说恶化了狼的品质。诸如《小红帽》之类流传甚广的故事。&nbsp;<BR>另外，我们还给狼赋予了战争和欺诈的象征意义。如二战时巡逻在大西洋中的纳粹“狼群”；臭名昭著的希特勒大本营被叫做“狼穴”；一个厚颜无耻、沉溺于女色的人被称为“色狼”；一个忘恩负义、以怨报德的人被称为“狼心狗肺”；一个外表讨人喜欢、和蔼可亲但内心险恶的人则被称做……&nbsp;不过今天，我们已经开始渐渐摆脱以上诸多的影响，并值得庆幸的是，我们正在像印第安人一样去认识狼。&nbsp;</P>
<P>1、狼狗出现在中世纪，当时的王公们都在宫廷中养有狼，狼被誉为高明的猎手和智勇双全的斗士。王公们喜欢这些美名与他们联系在一起，所以大量的饲养狼。当时欧洲狼的体型并不十分魁梧，看上去还不如大狗威风。因此，人们有了让狼与狗杂交的念头。这种做法的后果就是出现了性情变化无常、攻击性特别强的狼狗。这些狼狗逃窜到乡村袭击牲畜何人类，病传染着恐水症，而这些罪名最后都由狼来承担。在欧洲狼几乎被赶尽杀绝。&nbsp;</P>
<P>2、儒家学说中有一种结合人性弱点和欲望的理论已经根深蒂固的进入了人们的思想。如《六韬。三略》中黄石公所言：柔者德也，刚者贼也，弱者，人之所助，强者，怨之所攻。当狼与鹿对恃时，当狼与羊对恃时，人们会普遍同情弱者，而憎恶强者。在生活上也是如此，前天我上班时在小区停车场就见到这样一幕（民工踢帕萨特）。</P>
<P>3、巡逻在大西洋的纳粹狼群是指系统作战的纳粹潜艇群，他们常常给盟军造成不可估量的损失。&nbsp;</P>
<P>4、和蔼可亲但内心险恶&nbsp;的人被称做“披着羊皮的狼”&nbsp;5、印第安人尊重狼的勇气、智慧和惊人的技能，这些人经常披着带有狼头的整张狼皮，希望狼的魔力能进入他们的&nbsp;身体，让他们得到狼的智慧、技巧和能量。如今，我们知道我们并不需要一张狼皮——只需借鉴狼群的经验便可指导我们的生活。</P>
<DIV>狼与人 
<P></P>
<P>1、在很久以前，人与狼曾和平共处，彼此以敬畏而不是恐惧的目光看待对方。双方都尊敬对方的社会秩序和猎食技巧。他们是保持地球上综错复杂的生态平衡的一对伙伴。他们明白……&nbsp;然而，曾几何时人开始相信自己高出狼一筹，不再需要狼的陪伴。他们甚至不再尊重狼生存的权力……&nbsp;如今，人类社会秩序受到各种利益的冲击似有崩溃之势……&nbsp;而狼群仍保持着轻松愉快、默切配合、高效率行动和同甘共苦的生活模式。人们才发现普遍真理是不受环境约束的，它们的正确性已被时间的考验所证实。狼群的团体准则也得到了证明。&nbsp;因此，我们可以再一次向自己的老朋友——狼——学习。&nbsp;他们明白大自然并不是他们的一部分，恰恰相反，他们是大自然的一部分。</P>
<P>2、各地人们提供赏金鼓励猎人毒死、射杀及诱捕狼，而他们所作的这一切都是置狼给予人类最忠实的朋友和伙伴——狗——这一事实于不顾。无论是出于妒忌、恐惧还是无知，人们总是千方百计的想要消灭狼。</P>
<P>3、我们的各种团体及成员面对着失业、离婚、犯罪、人口过剩、改组、改制、裁员、下岗、待业等等现象而无所适从时。<BR></P>
<DIV>狼的社会秩序 
<P></P>
<P>狼群（家族）的实际规模往往差距较大，从3至20匹，通常以5到8匹居多，一般不会超过20匹。家族成员的个头和毛色也不尽相同，灰狼&nbsp;家族实际上是由许多不同颜色的毛皮的狼组成。他们中由保守的灰色、棕色、棕***到银灰色，甚至艳丽的***和红色。&nbsp;</P>
<P>狼群家族领地从40平方公里到&nbsp;240&nbsp;平方公里不等。不过在开阔地带其领地可以扩大到1600平方公里。它们用标记和嚎叫让其他狼群知晓它们的领地。和战争相比它们更喜欢和平的沟通。</P>
<P>1、首领时常会通过咆哮、嚎叫、追逐、厮咬和监督来显示他们的权威，绝对不让的狼存有“非分之想”或“不轨行为”。公狼把精力放在让公狼们安分守己上，母狼则控制其他母狼。&nbsp;</P>
<P>2、地位最低的狼是狼群中的“替罪羊”，它最后一个进食，一有差错都要算在它的头上，它是个常受欺负的受气包。首领在显示权威时，它总是惟命是从，不是毫无反抗的四脚朝天躺在地上，就是夹着尾巴灰溜溜的走着。&nbsp;</P>
<P>3、一匹狼在狼群中的地位通常可以从它的尾巴的姿态来判断。高翘—较低—夹尾。</P>
<P>4、那么，狼族能给予什麽能？狼身仔后，狼群便会离开旧居，接着豪猪或其他更小的动物就会把这个旧窝当成自己的家，小鸟会叼走遗留下来的狼毛去筑巢。狼群捕获猎物饱餐后，乌鸦、狐狸会来吃他们剩下的残渣。大自然真是物尽其用，没有丝毫浪费。&nbsp;</P>
<P>然而我们需要狼的最主要原因是为了保持心灵的健康。狼集美丽、尊严和智慧于一身，他们健康勇敢，在地球上除了猎枪、毒药、陷阱（人力）之外，几乎可以同一切抗衡。他们家族秩序无与伦比。狼把一切都奉献给了自己的家族，对族友有求必应，对家族忠心耿耿，对同伴全心全意关爱。我们一起来分享狼的品质吧！</P>
<DIV>狼的品质－－团队精神 
<P></P>
<P>正是一个人对集体的努力奉献，使一个团体运转、一家公司运转、一个社会运转、一种文明&nbsp;——文斯&nbsp;.&nbsp;隆巴迪&nbsp;</P>
<P>1、&nbsp;狼群在积雪中单列行进：在广阔无垠的旷野上，一群狼踏着积雪寻找猎物。他们最常用的一种行进方法是单列行进，一匹挨着一匹。领头狼消耗体力最大。最为开路先锋它率先冲开一条雪路，以便让后面狼保存体力。领头狼累了，便会让到一边，让紧跟身後的狼接替他的位置，这样他就可以跟到队尾，轻松一下，家精蓄锐，迎接新的挑战。&nbsp;</P>
<P>2、狼群共享幸福、共担责任：在一对首领的带领下，狼群中每一匹狼都要为群起的幸福承担一分责任。如：母头狼产下一窝幼仔后，通常会有一位“叔叔”但当起总保姆的工作。这样母头狼就可以暂时摆脱当他*的责任，和公头狼去进行“蜜月狩猎”。狼群中每一匹狼都不是关说不干的老板，倒是有些狼更喜欢做固定的猎手、阿姆或哨兵，&nbsp;不过，每一匹狼都扮演着至关重要的角色。狼群中的每一位成员都承担着对幼仔教导的责任，在与他们玩耍嬉闹时，耐心的训练他们本领。</P>
<P>3、与乌鸦整合资源、默契配合：狼不仅仅与同类密切合作，还可以与其它种类和睦相处，并整合资源共享利益。如:乌鸦富有动中观察的经验，但他们发现一个受伤或死掉的猎物时，通常会向报信者一样，把狼和其他乌鸦引到现场，狼可以撕开猎物的表皮，于是就为大家提供了足够享用几天的美食。（狼有时会闹着玩的扑向狡猾的乌鸦，乌鸦有时也会在狼进食时啄他的屁股。）&nbsp;</P>
<P>思考：</P>
<P>1.&nbsp;在你们的团体中，是否只有出现危机之后才能有效地团结合作呢？&nbsp;</P>
<P>2.&nbsp;如果不行言中，你将采取何种措施取代这种&nbsp;“尾肌综合症”呢？&nbsp;</P>
<P>3.&nbsp;你是否一向对那些与你生活的家人、与你共事的同事共荣呢？<BR></P>
<DIV>狼的品质－－耐心 
<P></P>
<P>耐心是在原本要大发雷霆时却保持心平气和的本领，忍耐是才能。<BR>——鲍勃&nbsp;.&nbsp;利维&nbsp;</P>
<P>1、当然，兽群中老弱病残是狼群的首选目标，但是狼的高明之处远不在于能却认出这些显而易见的牺牲品，它能观察到并记住猎物许多细微的个性特征和习惯，这时我们都难以做到的。某些独特个性特征会促使一只动物离代群体的庇护，成为一个靶子。所有的行为都被细心、耐心的狼记在心里。（驯鹿或麝牛在分娩时会离开群体）</P>
<P>2、狼和驯鹿经常生活在同一个地方，几乎看不出甚麽紧张气氛来。想像一个场景：一群狼在一群驯鹿旁散乱的休憩，突然，他们向驯鹿群集体冲去，驯鹿群为确保安全聚成一群奔跑。这时，狼群中一匹（剑手）斜刺里冲到鹿群中，抓破一头指定的驯鹿的腿（狼之所以选它，是因为发现它有某些特点易于攻击）。随后这头驯鹿又被放开归队（驯鹿个体比狼大得多，且属于有蹄类动物，蹄子厉害，踢上非伤即死）。这一幕被一遍一遍、一天一天的重演，狼群等待时机，受伤的驯鹿渐渐的失掉大量的血液、力气和反抗的意志。狼群定期更换剑手袭击，驯鹿旧伤未愈又添新创。最后，当这头驯鹿已极度虚弱，在也不会对狼群构成严重威胁时，狼群开始了致命的一击。<BR>是耐心保证了胜利，是耐心帮助狼群“兵不顿而利可全”。狼群谋求的不是眼前小利，而是长远的胜利。<BR>当然，应该说成功不仅于此，是狼那敏锐的观察力、专一的目标、默契的配合、好奇心、关注细节以及契而不舍的耐心共同使狼获得成功。</P>
<P>思考：</P>
<P>1.&nbsp;我们的生意伙伴会把“很有耐心”这一美德和我们联系在一起吗？</P>
<P>2.&nbsp;你上次对家人表示不耐烦是什么时候？你解释或道歉了吗？&nbsp;</P>
<P>3.&nbsp;要成为富有耐心的人需要如何去做呢？</P>
<P>狼的品质－－&nbsp;个整 </P>
<P></P>
<P>不要以你自己为模型去塑造下属。试都别试！<BR>——贝尔&nbsp;.&nbsp;布赖恩特</P>
<P>在深夜，没有哪一种声音比狼群异乎寻常的音乐般的嚎叫更阴森、凄楚、可怕而又动听的了。狼那极富乐感的嚎叫使露营者仿佛置身于数十匹狼的包围之中。事实上……</P>
<P>1、事实上，一个狼群通常也不过五至八匹狼。之所以声势浩大，奥秘在于狼很注意不模仿同伴的声音，不重复其它狼的声调，且乐此不疲的嚎叫。每匹狼都有一个独特的音调并尊重狼群成员的特色。有趣的是，这种对个体的尊重反而强调了整体的真正一致。他们是一个整体，又是各个不同的个体，个体的独特恰恰显示了整体的强大。</P>
<P>2、狼群奏出的交响乐使它们显得比所有狼发出同样的声音的情况更令人生畏。难怪露营者会觉得闯入了一大群狼的地盘。人类的组织和家庭更是如此，如果其中的每个个体的个性不是被扼杀而是被大加赞赏，那么他就更令人敬畏。通过表现个体的独特性以及尊重、鼓励其他成员表现自我，整个集体定会变得更强大而令人敬畏。</P>
<P>3、孩子们喜欢夏令营便也是这个道理：在其中去寻找成为集体中一员的归属感所带来的兴奋和激动的同时，还可以交在父母老师眼皮底下更能够发挥个性的创造力。</P>
<P>思考：</P>
<P>1.&nbsp;你能确保组织中所有成员的能力发挥到极致吗？</P>
<P>2.&nbsp;是不是大多数人对长子或长女态度严厉，对老二却优柔寡断，对最小的孩子最温和&nbsp;？你尊重并欣赏家庭成员的差异了吗？</P>
<P>3.&nbsp;你是把自身所长贡献与集体还是以此成为超然离群、削弱群体力量的障碍呢？</P>
<DIV>狼的品质－－好奇 
<P></P>
<P>好奇是一个充满活力的英才恒久固定的特性之一。<BR>——塞缪尔&nbsp;.&nbsp;约翰逊</P>
<P>1.&nbsp;对于狼而言，大千世界是让它们无穷无尽惊奇的源泉。他们对任何事物都不视之为理所当然，而是亲自去探究……自然界中任何无生命的东西都可以成为他们的玩具——骨头、鹿角、干牛粪、松果，甚至野营者的背包。他们：摔跤、躲在树后着迷藏等等。有一个故事也许能够说明对好奇的愿付出多大的代价或是艰辛。</P>
<P>2、阿拉斯加一位从事科研站点数据收集的工作人员在一个雪后的傍晚，驾驶着摩托雪橇开始到各个站点检索数据，但他到达第一个站点开始检索数据时，不由自主的感觉到那而绝不止他一个，他慢慢转过头去，顿时恐惧万分、浑身发抖、在零度以下的气温中冒了一身汗。透过树林盯着他的是六双冰冷的眼睛——六匹狼。我们可以想象当时的景色以及飘落的雪花交融在一起的那种骇人的美丽。他们一动不动，他也动弹不得。最后，他终于缓过劲来，跨上雪橇飞速离去。他回头发现他们还在盯着他。大约1小时后，他到了相距几英里的另一站点开始收集数据时，再次被不是他一个人独处的感觉吓呆了。果然，他向身后看去时见到了那群灰色的幽灵，整目不转睛的盯着他。那一晚上这种局面不断重复出现，直到他最后返回基地。他说他已经变得对狼习以为常。整整那一晚上狼群对他及雪橇表现出了极大的好奇。</P>
<P>3、他们没有侵犯他的意识，虽说每次停下来都发现了他们，然而骑着雪橇奔驰时他却一次也没有见着他们，这些狼的确只是好奇。那天他们学到了一些东西，他们总是在学习。</P>
<P>4、狼对他们的环境是如此好奇以至于不管他们追猎多远（他们算得上最不知疲倦的猎手之一了），我们不得不说他们追猎是为了生活（而不是生存），或者说他们工作是为了玩耍和交际。</P>
<P>5、哈利查平曾唱过一首歌，各种讲述了一个故事：男孩对事物充满好奇心，在课堂上试着用各种颜色画花朵和树叶，然而，老师训斥他“花儿是红的，年轻人，绿叶是绿的。没有必要用什么别出心裁的方法去看他”。终于，男孩被打败了，开始按老师指示行事。后来，全家搬到另一座城市，他的老师鼓励他发挥天生的好奇心，任何事物都不是绝对的，都存在可能性，可惜太晚了！他对老师说“花儿是红的，而绿叶是绿的。”。&nbsp;好奇的火花已经熄灭。</P>
<P>思考：</P>
<P>1.&nbsp;你是如何对待下属的创新&nbsp;、问题和挑战的呢&nbsp;？</P>
<P>2.&nbsp;真正好奇爱问的孩子有时很难管，累人；但是，你是相信好奇心培养创造力还是认为它只能让人“忧郁伤神”呢？</P>
<P>3.&nbsp;你是认为好奇多问会带来麻烦和风险而将它扼杀还是张扬这种好奇呢？</P>
<DIV>狼的品质－－态度 
<P></P>
<P>我要消灭我所有的敌人，把他们&nbsp;变成我的朋友。<BR>——亚伯拉罕&nbsp;.林肯</P>
<P>1.&nbsp;狼的态度可以简单地概括成一句话：对成功坚定不移的向往。虽说事实上狼群成功的机会只有十分之一，但它们的态度始终是成功一定会到来。</P>
<P>2.&nbsp;桑德斯上校的态度：既然肯德基家乡鸡是最棒的,那么成功只不过是时间的问题。</P>
<P>3.&nbsp;愚蠢的格言“组织中的每个人，若想成为有价值的成员，必须立志成为领导”。</P>
<P>1、多个世纪以来，狼群的集体智慧逐渐被编成遗传密码而成为它们体内基因的组成部分。狼群掌握了这样一门技艺：始终将自己的精力集中在那些能促成它们实现目标的行动上。狼群从来不漫无目的的围着他们的未来猎物乱跑，尖叫狂哮。它们会制定出战略，通过相互间不断的沟通将其付诸实施。关键时刻到来的时候，每匹狼都明白自己的作用并准确的领会集体对它的期望。狼从不靠运气。狼群的凝聚力、团队精神和训练有素成为他们存亡的决定性因素。</P>
<P>2、桑德斯上校在55岁高龄时曾经四处奔波，以他的汽车后座为家，那时“特许经营”还是个新概念，人们对上校意义深远的连锁饭店计划深表怀疑。许多人认为桑德斯这般年纪应该颐养天年了，而不是搞什么新生意。</P>
<P>3、这种观点是通过一些总经理在错误思想指导下讲出来的蠢话体现出来的，他们总是说自己肯雇佣那些声称要得到他的总经理位置的人。显然这是想用来证明这个人的诚实、勇敢、奋发图强、雄心壮志等等。可事实上，这样做所发出的另一种信号是：这个集体不契、没有忠诚、没有团队精神，甚至是在警告被面试者这个组织中总是在对抗和争抢。狼群可不是这样，不是所有的狼都正抢做领袖，他们中有技艺高超的猎手、风趣幽默的逗乐者、尽心尽责的保姆等等，但每匹狼都被它最称置的位置所吸引。这并不是说没有了对权威、地位的挑战（确实存在）。然而，每匹狼的作用，是从狼仔时就在玩耍中开始形成的，并在以后的岁月中逐渐完善。<BR>他们的态度一向都基于这样一个问题：什么对集体最有利？&nbsp;<BR>鲜明对比——人类：如果得不到我们想要的，就破坏搅乱它——并美名其曰“宁为玉碎，不为瓦全”。</P>
<P>4、对于个人而言，积极的态度需要的不仅仅是读启发性的书，或听“成功学”的演讲。还必须要有源于坚定不渝的个人信仰、信念和人生哲学的实质性东西。你的积极态度是什么样的？能把它讲给大家分享吗？<BR></P>
<DIV>狼的品质－－失败 
<P></P>
<P>失败既可以压垮一个生命也可以巩固、充实一个生命。<BR>——海仑&nbsp;.&nbsp;凯勒</P>
<P>据统计，狼群十次狩猎中只有一次成功的，而这次狩猎对狼群的生存极为重要，因为狼群早已饥肠辘辘。他们面对失败不是无精打采、放弃努力或者自认败北。他们继续运用历经时间考验的技能再加上刚刚从挫折中学到的知识，深信成功最后定会到来。<BR>2、对于狼群来说，9次未果的狩猎不会让他们气馁，因为他们知道还有第十次，第十一次，甚至第十二次，胜利终会属于他们。而猎人们却常常将一次“不成功的狩猎”视为他们生活失败的象征。其实失败只是一种心态……</P>
<P>1.&nbsp;狼群也许算得上是自然界中效率最高的狩猎机器，然而他们却有约90％的失败率&nbsp;。<BR>2.&nbsp;失败是一种心态，而不是现实；失败是一种感觉，成功则是一种理想。<BR>3.&nbsp;浮躁和焦虑的社会现状让更多的人梦想着“撞大运”，而不再尊重深谋远虑的重要性。</P>
<P>思考：</P>
<P>1.&nbsp;面对生意上的倒退，你的反应是为自己开脱干系而指责别人呢，还是勇于面对挫折而承担责任，分析未达目标的原因并为最终取得成功做必要的调整呢？</P>
<P>2.&nbsp;你能至少指出一位遭受了巨大损失而你曾助其一臂之力的朋友吗？</P>
<DIV>狼的品质－－交流 
<P></P>
<P>交流中最大的问题就是错误地认为交流已经完成了。<BR>——乔治&nbsp;.&nbsp;萧伯纳</P>
<P>1.&nbsp;对于狼来说，交流的艺术在于密切注视各种各样的交流方式，尤其是身体语言。正是狼与狼之间复杂精细的交流系统使他们在进攻时得以不断调整战略和战术已获得成功。狼是最善于交际的食肉动物之一，他们交流方式颇多：嚎叫、用鼻尖相互挨擦、用舌头舔、采取支配或从属的身体姿态，使用包括唇、眼、面部表情以及尾巴位置在内的复杂精细的身体语言或利用气味来传递信息。<BR>狼眼部肌肉系统及其微小的运动以及瞳孔大小的变化都在表达惊奇、恐惧、快乐、认出同伴。目不转睛地凝视可以理解为威胁，目光下盯或移开表示友好。</P>
<P>2.&nbsp;狼与狼高效而清楚的交流，致使它们极少内讧搏斗到真正置对方于死地的地步。如果人类像狼一样努力培养并运用有效的交流技能，我们能避免多少暴力、误解和失败？！</P>
<P>3.&nbsp;蒙哥马利元帅&nbsp;“亲熟生狎侮”。蒙哥马利元帅与部队缺乏融洽的关系一事对蒙哥马利提出建议并敦促增进与部下的沟通。一向反感别人劝告的蒙哥马利据说这样回答了丘吉尔“首相先生，亲熟生狎侮。”&nbsp;意思是说，太熟了，就会产生轻曼、不尊重。&nbsp;此时，丘吉尔则吸了一口雪茄，抿了一口白兰地，微笑着回答道“我亲爱的元帅，不轻不熟可什么也生不出来。”</P>
<P>思考：</P>
<P>1.&nbsp;绝大多数高级管理人员都同意与雇员经常沟通能改善雇员对工作的满意程度并增加效益。然而，这些人当中只有不到1／4的人说自己的确进行了这样的沟通。你也是这样言行不一致的吗？</P>
<P>2.&nbsp;在家中是什么影响了你与爱人的沟通能？是生意？电视？还是？？？<BR></P>
<DIV>狼的品质－－永锲 
<P></P>
<P>最大的荣耀并非永不失败而是屡败屡战。<BR>——孔子</P>
<P>1.&nbsp;狼是不需要人类施舍的动物，他们只渴望不被打扰，能够按造物主当初允许的方式生存下去。狼在地球上已经游荡了2000万年，人类对狼的追捕似乎也有千年以上的历史了。人们毁坏狼的栖息地，下毒、设陷阱甚至用火力武器来射杀它们。要知道，在人类繁荣昌盛之前，他们是地球上分布最广的野生动物。面对严酷的生存环境，今天的狼仍锲而不舍，自由的游荡在我们世界上更为遥远的地方，追求着自己的生活方式繁衍生息。</P>
<P>2.&nbsp;孤狼的英雄不归路。狼群中通常都有一匹地为最低的公狼，一般可能是幼仔中最弱小的一个，我们可能会痛心的看到狼群其他成员对它的虐待，特别是在进食时。然而，这种行为常常发生匪夷所思的现象，它一旦生存下来，往往会成为非常强壮的家伙，在向家族显示自己的生存能力之后，便开始了独自冒险的经历，于是在相当长的一段时间里便成了总所周知的“孤狼”，这匹孤狼最终会加入别的狼群或者找到一个配偶并建立一个新的狼群，正是他锲而不舍的历险追求，对狼的发展起到了积极的作用。加入狼群将会为这个狼群注入新鲜血液，减轻近亲繁殖的影响。如成为一个新的领袖，那么这个新狼群的成员们就有了一个历尽艰难险阻成功的存活下来的优秀“领导”。<BR>这样类似的故事似乎在我们人类中不断演义：冒失的新兵成为优秀的军官，矮小的球员最终成为伟大的球星，一个学习成绩近似糟糕的孩子10年后却成为一位成功的企业家。这些都是锲而不舍精神的最好例证。</P>
<P>思考：</P>
<P>有的人带着目的和决心锲而不舍，而有的人则是不折不扣的固执。你明白其中的区别吗？<BR></P>
<DIV>狼的品质－－战略 
<P></P>
<P>一个重要战略就是了解在当今的世界中你处在那个位置，不是你希望自己曾经在哪儿或向往自己将来在哪儿，而是现在在哪儿&nbsp;。是努力去了解五年之后你想在哪儿，是估计达到目的的实现可行的机会。<BR>——韦尔奇</P>
<P>1.&nbsp;狼之战略——麝牛。<BR>用几天的时间观察，在麝牛群周围漫不经心地游荡，这一天，与往常一样，几分钟前还在漫无目的的游荡，突然，四匹狼开始了联合攻击，把这群麝牛赶上了一个缓坡。当麝牛到达坡顶时，面对它们的是两匹纹丝不动地狼，这两匹狼挡住麝牛的去路，面无表情一动不动地站在那儿。麝牛们惊慌失措（狼知道它们会这样），四处逃窜，于是也就失掉了群体提供给他们的保护。麝牛群在慌乱中狂奔的时候六匹狼都向一头年老、有些虚弱、再也得不到群体保护的麝牛包抄过去，一匹狼咬住这只麝牛的下颌，另一匹狼咬住它的前额，把它掀翻在地，这时另外四匹狼活生生的把它四条腿撕下来。战斗很快就结束了。<BR>狼在整个过程中都明确地知道自己的职责和整体战略的意图，而我们由很多企业中的员工很难描述出置身其中的企业的目标是什么？不清楚他们集体的使命和战略意图。</P>
<P>3.&nbsp;泰勒诺事件的启示。<BR>目光短浅的经理往往会制定短期的决策。有长远目标的经理则能做到让短期的“意外之事”适合本组织的战略计划，将两者融为一体而不是废此逐彼。也许很多人还记得泰勒诺公司的那场灾难，一个疯子往泰勒诺公司药品的包装盒里投毒，致使700人死亡，这场悲剧正面的教训是泰勒诺公司对此作出的反应，没有否认、撒谎或推卸责任。他们诚实面对公众，主动回收产品，重新设计了包装。许多人都认为这家公司生存不下去了，然而它继续存在着，泰勒诺公司的人坚守自己的生意和产品，他们做对了，他们相信优质的产品和售后服务一定会创造利润，他们坚守长期战略，同时作出必要的短期调整，他们没有做错，泰勒诺公司仍然是一流的公司。而作为额外的收获，防撕扯包装目前已经成为食品和制药工业的标准包装。</P>
<P>思考：</P>
<P>1.&nbsp;贵公司有一个战略计划吗？你知道它的内容吗？雇员们理解这个战略吗？如果不理解，你需要做些什么来确保他们同心同德呢？</P>
<P>2.&nbsp;你是你自己的专家，那么你的战略是什么？<BR></P>
<DIV>狼的品质－－游戏 
<P></P>
<P>找不到时间娱乐的人迟早会找到时间生病。</P>
<P>1.&nbsp;人们总爱说“卖力工作，起劲玩乐”这句话，而这正是狼的生活方式。狼是爱交往的动物，能从彼此的身体接触中获得力量。游戏能改善他们交流、配合和狩猎的技能。然而游戏还有其他目的。它被证明是建立和不断重新估定狼群中的秩序（长幼尊卑制度）的老炼方法。通过带有实验意义的游戏狼学会了如何获得食物和生活资料。通过游戏他们便得身体更强壮，意志更坚强，因此对狼来说游戏并非只是玩耍而已。<BR>狼认识到玩耍并非仅仅是生活的一件副产品而是生活的一个理由。<BR>现在生活节奏加快，世界变得越来越小，在这种环境下，许多人认为游戏和他们的生活不相干；但时下风靡时尚的拓展训练公司却生意红火；以及香港、广东人提倡的“辛苦挣钱、自在花”的价值观，原因就是人们开始认识到游乐并非仅仅是生活的副产品，而是生活的一个理由。</P>
<P>2.空中小姐的滑稽游戏。美国西南航空公司是一家“廉价”航空公司，它连续三年赢得成为“三王冠”的大奖。这些荣誉是根据美国交通运输部公布的航空履行消费者报告提供的统计数据颁发的，西南航空公司在所有航空公司中一向在以下三个方面有接触表现：一、最佳正点运营&nbsp;二、最佳行李装卸&nbsp;三、最低乘客投诉率。西南公司经常有空姐为乘客精心安排滑稽可笑的游戏，在履行中，便会出现一位空中小姐突然从头顶的行李架上掉下来，吸引了所有乘客的注意力，由此来开始安全教育。<BR>显然工作中的快乐和极出色的服务相辅相成，齐头并进。</P>
<P>思考：</P>
<P>1.&nbsp;你是否存在一个很好的理由来解释为什么工作不能又是创造效益的游戏？<BR>2.&nbsp;你上次开怀大笑自己是什么时候？<BR></P>
<DIV>狼的品质－－死生 
<P></P>
<P>受人以鱼食之一日，受人以渔食之以世。<BR>——中国谚语</P>
<P>1.&nbsp;当一个睿智博学的人去世时，不论这个人是亚里士多德、孔子、海伦.凯勒、温斯顿.丘吉尔，还是一位给别人明智忠告的理发师，社会都会为此蒙受损失。这在狼的社会中并无差异。<BR>一匹成年狼的死亡能严重危及整个狼群，关于抚养幼仔的安全巢穴、猎物常走的路线以及可*水塘等方面的知识都会随着一匹年长的狼的死去而消失。减少关键的一匹狼意味着失去多年的经验、知识和领导能力。<BR>同样，没有适当的准备，失去一名关键的高级管理人员会使一家公司遭受巨大损失（客户、市场等资源流失）。一位家族家长的去世会使其家庭成员要么更团结紧密，要么就开始发生口角，走向解体（《四世同堂》）。<BR>幸运的是，狼群中年长的狼不断的教育和指导年幼的狼，给他们提供应付失败、学习和逐渐步入领导地位的机会。因此，一匹睿智的狼死亡，虽然造成了损失，但一般并没有对狼群造成致命的伤害，因为幼狼早已做好了充分准备，意味着新的领袖的诞生。（不断的培养人才，以备不时之需）</P>
<P>2.&nbsp;猎人法则。<BR>适者生存的自然法则继续在狼的世界中运行。最虚弱的驯鹿或年老的麝牛被狼捕杀，最虚弱的狼也会消失掉。但人类往往并不理解这条基本法则，特别是猎手，因为他们总是想杀死最大最强壮的动物以便登上大出风头、最引人瞩目的地位。显然，这与自然生存的规律背道而驰。我们似乎从来没有听到哪位猎人这样说“好吧，咱们出去把动物中老弱病残干掉，这样这个种族就不是减少数量而是提高素质了。”<BR>因此要成为更理性的人类，我们是不是还得向狼的所谓“原始”行为学习呢？</P>
<P>思考：</P>
<P>1.&nbsp;你的公司中运用何种机制来确保富有经验的管理人员有效地把他们的知识和经验传递给初来乍到的管理人员？<BR>2.&nbsp;你愿意抛开你对自己负去从借鉴他人经验中获益吗？<BR>3.&nbsp;你让别人知道你将因为能向他们学习而对他们万分感激吗？</P>
<DIV>狼的品质－－忠诚 
<P></P>
<P>忠诚并不意味着你说的我都同意或者我相信你总是对的。忠诚意味着我与你有共同的理想，而且求同存异，肩并肩为之奋斗，对对方的信念、信任、坚贞和友爱充满信心。<BR>——卡尔&nbsp;.&nbsp;门尼格</P>
<P>1.&nbsp;再也没有哪一种哺乳动物能比狼对它的家庭、团体或社会组织倾注更多的热情。<BR>狼群的成员们共同猎食以确保集体的存活，然而他们还玩耍、歌唱、睡觉、扭打并且相互保护。狼生存的目的就是要确保狼群的生存。狼群中总的来说只有占统治地位的那对狼才繁殖后代。但狼群中每一位成员都参与抚养和教育狼仔。每位成员都各司其职，为狼仔提供食物、栖息地、训练和保护。因此整个狼群都认识到年轻一代是他们的未来。</P>
<P>2.&nbsp;他们对“群体”的忠诚意味着“群体”中两个成员生于死的差别。<BR>阿拉斯加的一对夫妇住在偏远的山区，一次他们在山中伐木，发现了一只被猎杀的母狼，不远的地方有两只嗷嗷待哺的幼狼，于是他们就把它抱回了家。这两只狼和人一起生活，以他们为伴，这个家便是他们知道的唯一的家。家中还有两个小男孩一起生活。一次，夫妇两又去山中伐木，家里的小男孩不小心打翻了一盏煤油灯，小木屋顷刻间被大火所吞噬，烟熏火燎、连惊带吓这两小孩子呆住了，被困在里面；两匹狼立即向烈火肆虐的木屋冲去，两小男孩得救了，两匹狼都被大火严重烧伤了。<BR>如果一个团体——无论是家庭还是公司，领导不真正认识到它的成员的教育、人各和出事才能培养的重要性，那么其他人也不会认识到这一点。如果说培训费是一种“愚蠢的消耗”，这种态度我们绝对不能容忍。给人们机会和方法去完善自己，可以建立一种忠诚，忠诚对于组织来说是极其宝贵的财富。</P>
<P>3、要得到奉献和忠诚，我们必须首先对他人奉献和忠诚。</P>
<P>思考：</P>
<P>你是否在随时随地为你的员工们在各种经济潮流中生存下来做准备吗？如果是，你将能培养出一种全新的奉献、忠诚和优秀的员工。<BR></P>
<DIV>狼的品质－－变化 
<P></P>
<P>自然的伟大法则是变化。&nbsp;——&nbsp;罗伯特&nbsp;.&nbsp;彭斯<BR>天地之大德曰生。&nbsp;——《易传&nbsp;.&nbsp;系辞》&nbsp;</P>
<P>狼驾驭变化的能力是它们之所以能和人类一道成为世界上最成功、生命力最强的哺乳动物之一的主要原因。面对近200年来人类爆发性入侵极大改变动物类群数量的窘境，他们生存了下来。这类变化它们可以接受，但是如果它们不培养、教育、保护下一代并且始终将狼群的幸福放在首位，那它们就生存不到今天。这使它们的精髓，这一点它们拒绝改变。也就是我们所说到“以不变应万变”。</P>
<P>当我们去问一家公司的经理，你们对变化是欢迎还是回避时，压倒多数人都回答他们就是*变化获得事业成功的。与此矛盾的是，他们的总经理在对这个问题上的看法却迥然不同，认为那些经理们都是想要维持现有的秩序，喜欢搞老一套。这到底是存在什么问题呢？</P>
<P>罗伯特。彭斯——18实际苏格兰伟大的诗人，爱尔兰人，著名的诗《一朵红红的玫瑰》，魂断蓝桥中等《快乐时光》歌词。<BR>狼好像实行一种自然的数量控制，自动地根据可得到的猎物和空间削减或增加他们的繁殖速度。在我们乐而忘忧的对世界人口正在失控这一事实而不见时，狼则继续与自然和谐相处。如果人类愿意采用这一方法，世界发展的各种可能性会有多妙？</P>
<P>我们再从生物进化的角度来探讨一下变化的重要性……&nbsp;</P>
<P>1.&nbsp;恐龙在地球上生活了大约1.55亿年，可以说是地球出现以来生活的最成功的物种了，然而……<BR>2.&nbsp;哺乳动物（包括人类）的祖先也同样经历了那个巨变的阶段，而相反的是他们从此开始蓬勃发展……</P>
<P>而在今天这样一个巨变的时代，焦虑的年代，似乎唯一不变的就是变化的年代里，为了生存我们只能选择——变化。</P></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV>]]></description>
</item><item>
<title><![CDATA[安慰人的10大原则——当不知该说什么的时候]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13107</link>
<author>pudding009</author>
<pubDate>2006/4/2 15:50:40</pubDate>
<description><![CDATA[当朋友痛哭无语时，该如何按捺内心的不安与疑问，倾心聆听并安抚他的苦痛与焦虑？而当自己遭遇困难、濒临绝境时，该如何适时求援？我们具备坦然接受别人帮忙的能力吗？ 
<P>　　对许多人而言，目击别人的伤痛与不安，是件很痛苦的事，我们经常会想快速解决它、采取某些行动，或设法提供立即的解脱。有些人则为了避免说错话，宁愿选择什么都不说，而错失表达关心的时机。当别人需要支持，或是自己需要求援时，却往往言不由衷，或不着边际。该如何开启「发自内心」的深层对话？而不是仅止于「绞尽脑汁」的表面对话？该如何整合身、心、灵，以自然之姿来做最有效的对谈？</P>
<P>　　《Healing Conversation》作者南丝·格尔马丁，针对如何弥补人际沟通的鸿沟、适时适度表达关心，提供了「疗效对话」的10项原则。所谓「疗效对话」，是指将心比心、设身处地的对谈，让求援者获得适度纾解，进而自然地达到「治疗的效果」。</P>
<P>　　当你不确定「说什么？」和「如何说？」的时候，本书可以提供许多实用的参考。</P>
<P>　　疗效对话的10大原则：</P>
<P>　　<FONT color=#0080c0>1. 聆听</FONT></P>
<P>　　聆听不是保持沉默，而是仔细听听对方说了什么、没说什么，以及真正的涵意。所谓的聆听，应该是用我们的眼、耳和心去听对方的声音，同时不急着立刻知道事情的前因后果。我们必须愿意把自己的「内在对话」暂抛一边。所谓的「内在对话」，是指聆听的同时，在脑海中不自觉进行的对话，包括动脑筋想着该说什么、如何响应对方的话，或盘算着接下来的话题。</P>
<P>　　<FONT color=#0080c0>2. 停顿</FONT></P>
<P>　　在对话之间，有时说，有时听；我们还必须提醒自己，放慢不自觉产生的机械式反应，例如，想快速解决对方的不安，便直接跳到采取行动的阶段──说些或做些我们认为对对方有益的事。如果没有停顿，我们可能会在剎那间，说出稍后会反悔的话。安慰的艺术，在于「在适当的时机，说适当的话」，以及「不在一时冲动下，说出不该说的话」。</P>
<P>　　<FONT color=#0080c0>3. 当朋友不当英雄</FONT></P>
<P>　　帮助别人度过艰难岁月，不等同于将他们从痛苦的处境中「拯救」出来。我们应该认同他们的痛苦，让他们去感觉痛苦，并且不试着快速驱散痛苦。我们仅试着提供让他们越过「恐惧之河」的桥梁。当朋友、家人陷于情绪或身体的痛苦之中时，支持他们的最基本方法是：允许对方哭泣。哭泣是人体尝试将情绪毒素排出体外的一种方式，而掉泪则是疗伤的一种过程。所以，请别急着拿面纸给对方，只要让他知道你支持他的心意。 </P>
<P>　　<FONT color=#0080c0>4. 给予安慰</FONT></P>
<P>　　给予安慰并不是告诉别人：「你应该觉得……」或是「你不应该觉得……」。人们有权利保有其真正的感觉。安慰是指：不要对他们下判断，不要心想他们正在受苦、需要接受帮忙；安慰是指：给予他们空间去做自己、并认同自己的感觉。我们不需要透过「同意或反对」他们的选择或处理困境的方法，来表达关心。 </P>
<P>　　<FONT color=#0080c0>5. 感同身受</FONT></P>
<P>　　当我们忙着试图帮助他人时，可能会忘记人们会察觉到我们内心的波动──没有说出来的想法和感觉。尽管人们无法确知我们的想法，但通常可以察觉到我们是否惊慌、对他们下判断，或是为他们感到难过。面对面安慰别人，和我们内心真正的状态，有很大的关联。因为对他们的遭遇感同身受，我们不仅分担对方的痛苦，也需忍受自己内心的煎熬。不论面临的处境如何，善意的现身与安慰，即是给予对方的一项礼物。</P>
<P>　　<FONT color=#0080c0>6. 长期守候</FONT></P>
<P>　　改变会带来许多混乱。没有人可以迅速整顿那样的混乱。人们需要时间去调适、检讨、改变和询问：「假如……，会怎样？」的问题。在「疗效对话」中，我们学着接受以下事实：我们的家庭成员、同事或邻居，有时候仅需要我们当他们的「共鸣箱」，且能不厌其烦地供其反复使用。</P>
<P>　　<FONT color=#0080c0>7. 勇敢挺身而出</FONT></P>
<P>　　不论身处任何状况，对自己不知该说什么而感到困窘，是无妨的；让我们想帮助的人知道我们的感觉，也是无妨的。甚至可以老实地说：「我不知道你的感觉，也不知道自己该说什么，但是我真的很关心你。」即使自己对这样的表达觉得可笑，还是可以让对方知道，你不急着「现在」和他交谈。你或许可以选择用书写的方式，来表达感觉和想法。除了言语的表达之外，「疗效对话」尚有许多不同的形式。</P>
<P>　　<FONT color=#0080c0>8. 提供实用资源</FONT></P>
<P>　　不需帮别人找到所有问题的答案，但可以尽力提供可用资源──别的朋友、专家、朋友的朋友，来帮忙他们找到答案。可以为对方打几通电话，连结人脉；也可以找相关的书籍给他们阅读；或是干脆提供一个躲避的空间，让他们得以平静地寻找自己的答案。</P>
<P>　　<FONT color=#0080c0>9. 设身处地、主动帮忙</FONT></P>
<P>　　当我们问：「有没有我可以帮忙的地方？」有时候有答案，有时候他们也不知道需要什么样的帮忙。然而，人们有时会对自己真正的需要开不了口。设身处地去考量人们可能需要的协助，是有效助人的第一步。 </P>
<P>　　<FONT color=#0080c0>10. 善用同理心</FONT></P>
<P>　　即使我们遭遇过类似的经验，也无法百分之百了解别人的感受，但是我们可以善用同理心去关怀对方。切记需先耐心听完别人的故事，再考虑有没有必要分享自已的故事？而分享的结果是否对对方有益？</P>]]></description>
</item><item>
<title><![CDATA[比尔盖兹的十一项人生建议]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13106</link>
<author>pudding009</author>
<pubDate>2006/4/2 15:48:44</pubDate>
<description><![CDATA[<TABLE width="90%" align=center>
<TBODY>
<TR>
<TD>引用比尔盖兹在某个大学毕业典礼上的演讲中，对毕业生提出十一项极为睿智的人生建议，来与毕业同学共勉之：<BR>一、人生是不公平的，习惯接受吧。&nbsp;<BR><BR>二、这个世界并不在乎你的自尊，只在乎你做出来的成绩，然后再去强调你的感受。&nbsp;<BR><BR>三、你不会一离开学校就有百万年薪、你不会马上就是拥有公司配属手机的副总裁，二者你都必须靠努力赚来。&nbsp;<BR><BR>四、如果你觉得你的老板很凶，等你做了老板就知道，老板是没有工作任期保障的。&nbsp;<BR><BR>五、在快餐店打工并不可耻，你的祖父母对煎汉堡有不同的看法：机会。&nbsp;<BR><BR>六、如果你一事无成，不是你父母的错，所以不要对自己犯的错发牢骚，从错误中去学习。&nbsp;<BR><BR>七、在你出生前，你的父母并不像现在这般无趣，他们变成这样是因为忙着付你的开销、洗你的衣服、听你吹嘘你有多了不起。所以在你拯救被父母这代人破坏的热带雨林前，先整理一下自己的房间吧。&nbsp;<BR><BR>八、在学校里可能有赢家输家，在人生中却还言之过早。学校会不断给你机会找到正确答案，真实人生中却完全不是这么回事。&nbsp;<BR><BR>九、人生不是学期制，人生没有寒暑假，没有哪个雇主有兴趣帮你寻找自我。请用自己的时间来做这件事吧。&nbsp;<BR><BR>十、电视上演的并非真实人生。真实人生中每人都要离开咖啡馆去上班。&nbsp;<BR><BR>十一、对书呆子好一点，你未来很可能就为其中一个工作。&nbsp;</TD></TR></TBODY></TABLE>]]></description>
</item><item>
<title><![CDATA[C++编程中的四个调试小技巧]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13105</link>
<author>pudding009</author>
<pubDate>2006/4/2 15:38:16</pubDate>
<description><![CDATA[&nbsp;1.调试标记 <BR><BR>　　适用预处理#define定义一个或多个调试标记，在代码中把调试部分使用#ifdef 和#endif 进行管理。当程序最终调试完成后，只需要使用#undef标记，调试代码就会消失。常用的调试标记为DEBUG, 语句序列：<BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>#define DEBUG<BR><BR>#ifdef DEBUG<BR><BR>调试代码<BR><BR>#endif</TD></TR></TBODY></TABLE><BR>　　2.运行期间调试标记<BR><BR>　　在程序运行期间打开和关闭调试标记。通过设置一个调试bool标记可以实现。这对命令行运行的程序更为方便。<BR><BR>　　例如下面代码<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>#include&lt;iostream&gt;<BR>#include &lt;string&gt;<BR>using namespace std;<BR>bool debug =false;<BR>int main(int argc,char*argv[])<BR>{<BR>　for(int i=0;i&lt;argc;i++)<BR>　　if(string(argv[i])==“--debug=on“)<BR>　　debug = true;<BR>　　bool go=true;<BR>　　while(go)<BR>　　{<BR>　　　if(debug)<BR>　　　{<BR>　　　　调试代码<BR>　　　}else {}<BR>　　}<BR>}</TD></TR></TBODY></TABLE><BR>　　3.把变量和表达式转换成字符串<BR><BR>　　可是使用字符串运算符来实现转换输出定义<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>#define PR(x） cout&lt;&lt;#x”=”&lt;&lt;x&lt;&lt;'\n'</TD></TR></TBODY></TABLE><BR>　　4.c语言的assert()<BR><BR>　　该宏在&lt;assert&gt;中，，当使用assert时候，给他个参数，即一个判读为真的表达式。预处理器产生测试该断言的代码，如果断言不为真，则发出一个错误信息告诉断言是什么以及它失败一会，程序会终止。<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>#include&lt; assert&gt;<BR>using namsapce std;<BR>int main()<BR>{<BR>　int i=100;<BR>　assert(i!=100); //Fails<BR>}<BR>当调试完毕后在#include&lt;assert&gt;前加入#define NDEBUG即可消除红产生的代码<BR>}</TD></TR></TBODY></TABLE>]]></description>
</item><item>
<title><![CDATA[食物相克小常识（转自木已易）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13104</link>
<author>pudding009</author>
<pubDate>2006/4/2 15:29:03</pubDate>
<description><![CDATA[<P align=center><FONT size=5><STRONG>食物相克小常识</STRONG></FONT></P>
<TABLE borderColor=#cccccc cellSpacing=2 cellPadding=3 width="100%" bgColor=#ffffff border=1>
<TBODY>
<TR>
<TD><FONT size=2>&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;同时进食物</FONT></TD>
<TD><FONT size=2>&nbsp;导致后果</FONT></TD>
<TD><FONT size=2>&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;&nbsp;同时进食物</FONT></TD>
<TD><FONT size=2>&nbsp;&nbsp;导致后果</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;01</FONT></TD>
<TD><FONT size=2>&nbsp;猪肉+菱角</FONT></TD>
<TD><FONT size=2>&nbsp;肚子疼</FONT></TD>
<TD><FONT size=2>&nbsp;36</FONT></TD>
<TD><FONT size=2>&nbsp;虾子+金瓜&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;02</FONT></TD>
<TD><FONT size=2>&nbsp;猪肚+莲子(用白茄枝烧)</FONT></TD>
<TD><FONT size=2>&nbsp;中毒必死</FONT></TD>
<TD><FONT size=2>&nbsp;37</FONT></TD>
<TD><FONT size=2>&nbsp;虾子+青枣&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;03</FONT></TD>
<TD><FONT size=2>&nbsp;牛肉+栗子</FONT></TD>
<TD><FONT size=2>&nbsp;引起呕吐</FONT></TD>
<TD><FONT size=2>&nbsp;38</FONT></TD>
<TD><FONT size=2>&nbsp;鳖+芹菜</FONT></TD>
<TD><FONT size=2>&nbsp;剧毒</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;04</FONT></TD>
<TD><FONT size=2>&nbsp;牛肉+红糖</FONT></TD>
<TD><FONT size=2>&nbsp;胀死人</FONT></TD>
<TD><FONT size=2>&nbsp;39</FONT></TD>
<TD><FONT size=2>&nbsp;田螺+木耳</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;05</FONT></TD>
<TD><FONT size=2>&nbsp;牛肉+盐菜</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;40</FONT></TD>
<TD><FONT size=2>&nbsp;田螺+玉米</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;06</FONT></TD>
<TD><FONT size=2>&nbsp;牛肉+鲶鱼</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;41</FONT></TD>
<TD><FONT size=2>&nbsp;鸡蛋+糖精(片)</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒,重则死亡</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;07</FONT></TD>
<TD><FONT size=2>&nbsp;牛肉+田螺</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;42</FONT></TD>
<TD><FONT size=2>&nbsp;皮蛋+红糖</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒,发呕</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;08</FONT></TD>
<TD><FONT size=2>&nbsp;羊肉+西瓜</FONT></TD>
<TD><FONT size=2>&nbsp;伤元气</FONT></TD>
<TD><FONT size=2>&nbsp;43</FONT></TD>
<TD><FONT size=2>&nbsp;豆腐+蜂蜜&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;导致耳聋</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;09</FONT></TD>
<TD><FONT size=2>&nbsp;羊肉+田螺&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;腹胀</FONT></TD>
<TD><FONT size=2>&nbsp;44</FONT></TD>
<TD><FONT size=2>&nbsp;豆腐渣+蜂蜜&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会下痢</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;10</FONT></TD>
<TD><FONT size=2>&nbsp;狗肉+绿豆&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;45</FONT></TD>
<TD><FONT size=2>&nbsp;蒜头+蜂蜜&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会变疳积</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;11</FONT></TD>
<TD><FONT size=2>&nbsp;狗肉+黄鳝&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;46</FONT></TD>
<TD><FONT size=2>&nbsp;洋葱+蜂蜜&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;伤眼睛</FONT></TD>
<TR>
<TD>
<P><FONT size=2>&nbsp;12</FONT></P></TD>
<TD><FONT size=2>&nbsp;狗肉+葱&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;47</FONT></TD>
<TD><FONT size=2>&nbsp;葱+蜂蜜&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;13</FONT></TD>
<TD><FONT size=2>&nbsp;兔肉+芹菜&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;&nbsp;脱发</FONT></TD>
<TD><FONT size=2>&nbsp;48</FONT></TD>
<TD><FONT size=2>&nbsp;萝卜+人参&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;滞气</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;14</FONT></TD>
<TD><FONT size=2>&nbsp;兔肉+人参&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;49</FONT></TD>
<TD><FONT size=2>&nbsp;萝卜+木耳&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;导致皮炎</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;15</FONT></TD>
<TD><FONT size=2>&nbsp;兔肉+青姜&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;50</FONT></TD>
<TD><FONT size=2>&nbsp;蜂蜜+油炸物&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;16</FONT></TD>
<TD><FONT size=2>&nbsp;兔肉+红罗卜&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;51</FONT></TD>
<TD><FONT size=2>&nbsp;木瓜+油炸物&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会下痢</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;17</FONT></TD>
<TD><FONT size=2>&nbsp;鸡肉+芹菜&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;伤元气</FONT></TD>
<TD><FONT size=2>&nbsp;52</FONT></TD>
<TD><FONT size=2>&nbsp;西瓜+油炸物&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;&nbsp;会下痢</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;18</FONT></TD>
<TD><FONT size=2>&nbsp;鹅肉+鸡蛋&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;伤元气</FONT></TD>
<TD><FONT size=2>&nbsp;53</FONT></TD>
<TD><FONT size=2>&nbsp;西瓜+八宝丹&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;19</FONT></TD>
<TD><FONT size=2>&nbsp;鹅肉+鸭梨&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;伤肾脏</FONT></TD>
<TD><FONT size=2>&nbsp;54</FONT></TD>
<TD><FONT size=2>&nbsp;金瓜+八宝丹&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;20</FONT></TD>
<TD><FONT size=2>&nbsp;甲鱼+苋菜&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;55</FONT></TD>
<TD><FONT size=2>&nbsp;马铃薯+香蕉&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;面部生斑</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;21</FONT></TD>
<TD><FONT size=2>&nbsp;黑鱼+茄子&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;肚子疼</FONT></TD>
<TD><FONT size=2>&nbsp;56</FONT></TD>
<TD><FONT size=2>&nbsp;芋头+香蕉&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;引起腹涨,中毒</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;22</FONT></TD>
<TD><FONT size=2>&nbsp;鲤鱼+猪肉&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;57</FONT></TD>
<TD><FONT size=2>&nbsp;红薯+柿子&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会得结石</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;23</FONT></TD>
<TD><FONT size=2>&nbsp;鲤鱼+甘草&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;58</FONT></TD>
<TD><FONT size=2>&nbsp;树薯粉+麻油&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;24</FONT></TD>
<TD><FONT size=2>&nbsp;鲤鱼+辣椒&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;成痔疾</FONT></TD>
<TD><FONT size=2>&nbsp;59</FONT></TD>
<TD><FONT size=2>&nbsp;花生+黄瓜&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会伤身</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;25</FONT></TD>
<TD><FONT size=2>&nbsp;鲤鱼+芹菜&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;患痢疾</FONT></TD>
<TD><FONT size=2>&nbsp;60</FONT></TD>
<TD><FONT size=2>&nbsp;白酒+柿子&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;导致胸闷</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;26</FONT></TD>
<TD><FONT size=2>&nbsp;鲤鱼+黄瓜&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;成胎毒</FONT></TD>
<TD><FONT size=2>&nbsp;61</FONT></TD>
<TD><FONT size=2>&nbsp;热酒+红柿&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;27</FONT></TD>
<TD><FONT size=2>&nbsp;鲑鱼+河豚&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;有生命危险</FONT></TD>
<TD><FONT size=2>&nbsp;62</FONT></TD>
<TD><FONT size=2>&nbsp;牛奶+桔子+萝卜&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会伤身</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;28</FONT></TD>
<TD><FONT size=2>&nbsp;鲫鱼+树豆花&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;中毒必死</FONT></TD>
<TD><FONT size=2>&nbsp;63</FONT></TD>
<TD><FONT size=2>&nbsp;牛奶+醋&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;患痢疾</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;29</FONT></TD>
<TD><FONT size=2>&nbsp;鳗鱼+桔子&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;64</FONT></TD>
<TD><FONT size=2>&nbsp;牛奶+菠菜&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;患痢疾</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;30</FONT></TD>
<TD><FONT size=2>&nbsp;鱆鱼+螺肉&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;会中毒</FONT></TD>
<TD><FONT size=2>&nbsp;65</FONT></TD>
<TD><FONT size=2>&nbsp;葡萄+开水&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;引起腹泻</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;31</FONT></TD>
<TD><FONT size=2>&nbsp;河豚鱼+烟灰&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;中毒死亡</FONT></TD>
<TD><FONT size=2>&nbsp;66</FONT></TD>
<TD><FONT size=2>&nbsp;番茄+绿豆&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;伤元气</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;32</FONT></TD>
<TD><FONT size=2>&nbsp;生鲸肉+大面&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;中毒必死</FONT></TD>
<TD><FONT size=2>&nbsp;67</FONT></TD>
<TD><FONT size=2>&nbsp;海带+猪血&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;便秘</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;33</FONT></TD>
<TD><FONT size=2>&nbsp;螃蟹+柿子&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;引起腹泻</FONT></TD>
<TD><FONT size=2></FONT></TD>
<TD><FONT size=2>&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;34</FONT></TD>
<TD><FONT size=2>&nbsp;螃蟹给癞病人吃&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;必死</FONT></TD>
<TD><FONT size=2></FONT></TD>
<TD><FONT size=2>&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;35</FONT></TD>
<TD><FONT size=2>&nbsp;虾类+维生素C&nbsp;&nbsp;&nbsp;&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;必死(相当于砒霜)</FONT></TD>
<TD><FONT size=2>&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;</FONT></TD>
<TD>&nbsp;</TD></TR></TBODY></TABLE>
<P>注:&nbsp;&nbsp;&nbsp;&nbsp;以上每一组相克食物不能一起食用或在两小时内先后食用.</P>
<P align=center><FONT size=5><STRONG>饮食禁忌</STRONG></FONT></P>
<TABLE borderColor=#cccccc cellSpacing=2 cellPadding=3 width="100%" bgColor=#ffffff border=1>
<TBODY>
<TR>
<TD>&nbsp;<FONT size=2>①</FONT></TD>
<TD><FONT size=2>&nbsp;咳嗽病忌食咸鱼,韭菜,蒜,虾,葱,酒.&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;⑾</FONT></TD>
<TD><FONT size=2>&nbsp;皮肤痒忌食酸果,辣椒.&nbsp;</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;②</FONT></TD>
<TD><FONT size=2>&nbsp;腹痛病忌食番茄,毛薯,糯米点心.&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;⑿</FONT></TD>
<TD><FONT size=2>&nbsp;失眠症忌食酒.&nbsp;</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;③</FONT></TD>
<TD><FONT size=2>&nbsp;哮喘病忌食咸蛋,咸菜,腥物.&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;⒀</FONT></TD>
<TD><FONT size=2>&nbsp;肝炎忌食鸭,葱,椒,酒.&nbsp;</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;④</FONT></TD>
<TD><FONT size=2>&nbsp;头痛忌食酒,大葱.</FONT></TD>
<TD><FONT size=2>&nbsp;⒁</FONT></TD>
<TD><FONT size=2>&nbsp;黄疸病忌食糯米,白酒.</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;⑤</FONT></TD>
<TD><FONT size=2>&nbsp;鼻塞病忌食油腻,糖果.</FONT></TD>
<TD><FONT size=2>&nbsp;⒂</FONT></TD>
<TD><FONT size=2>&nbsp;胃痛忌食鸭蛋,豆,茨.</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;⑥</FONT></TD>
<TD><FONT size=2>&nbsp;眼痛忌食鸡,鸭蛋,咸鱼,虾,蟹,韭菜,蒜.</FONT></TD>
<TD><FONT size=2>&nbsp;⒃</FONT></TD>
<TD><FONT size=2>&nbsp;痢疾忌食鱼,虾,油,韭菜.</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;⑦</FONT></TD>
<TD><FONT size=2>&nbsp;牙痛忌食糖,酱油.&nbsp;</FONT></TD>
<TD><FONT size=2>&nbsp;⒄</FONT></TD>
<TD><FONT size=2>&nbsp;腰痛忌食葱.</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;⑧</FONT></TD>
<TD><FONT size=2>&nbsp;喉痛忌食生姜,胡椒,辣椒,肉桂.</FONT></TD>
<TD><FONT size=2>&nbsp;⒅</FONT></TD>
<TD><FONT size=2>&nbsp;盗汗忌食酒,姜,韭菜,蒜.</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;⑨</FONT></TD>
<TD><FONT size=2>&nbsp;呕吐病忌食糖,油,鱼腥.</FONT></TD>
<TD><FONT size=2>&nbsp;⒆</FONT></TD>
<TD><FONT size=2>&nbsp;耳烂忌食鱼,虾.</FONT></TD>
<TR>
<TD><FONT size=2>&nbsp;⑩</FONT></TD>
<TD><FONT size=2>&nbsp;泄泻忌食油,奶,豆腐,生冷,鱼虾.</FONT></TD>
<TD><FONT size=2>&nbsp;⒇</FONT></TD>
<TD><FONT size=2>&nbsp;浮肿忌食糯米,各种酒.</FONT> </TD></TR></TBODY></TABLE>]]></description>
</item><item>
<title><![CDATA[[转帖]人生致命的八个经典问题]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13103</link>
<author>pudding009</author>
<pubDate>2006/4/2 14:58:46</pubDate>
<description><![CDATA[<BR>问题一，&nbsp;<BR>　　如果你家附近有一家餐厅，东西又贵又难吃，桌上还爬着蟑螂，你会因为它很近&nbsp;<BR>　　很方便，就一而再、再而三地光临吗？&nbsp;<BR>　　回答：你一定会说，这是什么烂问题，谁那么笨，花钱买罪受？&nbsp;<BR>　　<BR>　　可同样的情况换个场合，自己或许就做类似的蠢事。&nbsp;<BR>　　不少男女都曾经抱怨过他们的情人或配偶品性不端，三心二意，不负责任。明知在一起没&nbsp;什么好的结果，怨恨已经比爱还多，但却“不知道为什么”还是要和他搅和下去，分不了手。说穿了，只是为了不甘，为了习惯，这不也和光临餐厅一样？&nbsp;<BR>　　<BR>　　——做人，为什么要过于执著？！&nbsp;<BR>　　<BR>　　问题二，&nbsp;<BR>　　如果你不小心丢掉100块钱，只知道它好像丢在某个你走过的地方，你会花200块&nbsp;<BR>　　钱的车费去把那100块找回来吗？&nbsp;<BR>　　回答：一个超级愚蠢的问题。&nbsp;<BR>　　<BR>　　可是，相似的事情却在人生中不断发生。做错了一件事，明知自己有问题，却*也不肯认&nbsp;错，反而花加倍的时间来找藉口，让别人对自己的印象大打折扣。被人骂了一句话，却花&nbsp;了无数时间难过，道理相同。为一件事情发火，不惜损人不利已，不惜血本，不惜时间，&nbsp;<BR>　　只为报复，不也一样无聊？&nbsp;<BR>　　失去一个人的感情，明知一切已无法挽回，却还是那么伤心，而且一伤心就是好几年，还&nbsp;要借酒浇愁，形销骨立。其实这样一点用也没有，只是损失更多。&nbsp;<BR>　　<BR>　　——做人，干吗为难自己？！&nbsp;<BR>　　<BR>　　问题三，&nbsp;<BR>　　你会因为打开报纸发现每天都有车祸，就不敢出门吗？&nbsp;<BR>　　回答：这是个什么烂问题？当然不会，那叫因噎废食。&nbsp;<BR>　　<BR>　　然而，有不少人却曾说：现在的离婚率那么高，让我都不敢谈恋爱了。说得还挺理所当然&nbsp;。也有不少女人看到有关的诸多报道，就对自己的另一半忧心忡忡，这不也是类似的反应&nbsp;？所谓乐观，就是得相信：虽然道路多艰险，我还是那个会平安过马路的人，只要我小心&nbsp;一点，不必害怕过马路。&nbsp;<BR>　　<BR>　　——做人，先要相信自己。&nbsp;<BR>　　<BR>　　问题四，&nbsp;<BR>　　你相信每个人随便都可以成功立业吗？&nbsp;<BR>　　回答：当然不会相信。&nbsp;<BR>　　<BR>　　但据观察，有人总是在听完成功人士绞尽脑汁的建议，比如说，多读书，多练习之后，问&nbsp;了另一个问题？那不是很难？&nbsp;<BR>　　我们都想在3分钟内学好英文，在5分钟内解决所有难题，难道成功是那么容易的吗？改变&nbsp;当然是难的。成功只因不怕困难，所以才能出类拔萃。&nbsp;<BR>　　有一次坐在出租车上，听见司机看到自己前后都是高档车，兀自感叹：“唉，为什么别人&nbsp;那么有钱，我的钱这么难赚？”&nbsp;<BR>　　我心血来潮，问他：“你认为世上有什么钱是好赚的？”他答不出来，过了半晌才说：好&nbsp;<BR>　　像都是别人的钱比较好赚。&nbsp;<BR>　　其实任何一个成功者都是艰辛取得。我们实在不该抱怨命运。&nbsp;<BR>　　<BR>　　——做人，依靠自己！&nbsp;<BR>　　<BR>　　问题五，&nbsp;<BR>　　你认为完全没有打过乒乓球的人，可以拿到奥林匹克单打冠军吗？&nbsp;<BR>　　回答：当然不可能，外行不可能领导内行。&nbsp;<BR>　　<BR>　　可是，有许多人，对某个行业完全不了解，只听到那个行业好**，就马上开起业来了&nbsp;<BR>　　我看过对穿着没有任何口味、或根本不在乎穿着的人，梦想却是开间服装店；不知道电脑&nbsp;怎么开机的人，却想在网上**，结果道听途说，却不反省自己是否专业能力不足，只抱怨时不我与。&nbsp;<BR>　　<BR>　　——做人，量力而行。&nbsp;<BR>　　<BR>　　问题六，&nbsp;<BR>　　相似但不相同的问题：你是否认为，篮球教练不上篮球场，闭着眼睛也可以主导&nbsp;<BR>　　一场完美的胜利？&nbsp;<BR>　　回答：有病啊，当然是不可能的。&nbsp;<BR>　　<BR>　　可是却有不少朋友，自己没有时间打理，却拼命投资去开咖啡馆，开餐厅，开自己根本不&nbsp;懂的公司，火烧屁股一样急着把辛苦积攒的积蓄花掉，去当一个稀里糊涂的投资人。亏的&nbsp;<BR>　　总是比赚的多，却觉得自己是因为运气不好，而不是想法出了问题。&nbsp;<BR>　　<BR>　　——做人，记得反省自己。&nbsp;<BR>　　<BR>　　问题七，】&nbsp;<BR>　　你宁可永远后悔，也不愿意试一试自己能否转败为胜？&nbsp;<BR>　　解答：恐怕没有人会说：“对，我就是这样的孬种”吧。&nbsp;<BR>　　<BR>　　然而，我们却常常在不该打退堂鼓时拼命打退堂鼓，为了恐惧失败而不敢尝试成功。&nbsp;<BR>　　以关颖珊赢得2000年世界花样滑冰冠军时的精彩表现为例：她一心想赢得第一名，然而在最后一场比赛前，她的总积分只排名第三位，在最后的自选曲项目上，她选择了突破，而&nbsp;不是少出错。在4分钟的长曲中，结合了最高难度的三周跳，并且还大胆地连跳了两次。她也可能会败得很难看，但是她毕竟成功了。&nbsp;<BR>　　她说：“因为我不想等到失败，才后悔自己还有潜力没发挥。”&nbsp;<BR>　　一个中国伟人曾说；胜利的希望和有利情况的恢复，往往产生于再坚持一下的努力之中。&nbsp;<BR>　　<BR>　　——做人，何妨放手一搏。&nbsp;<BR>　　<BR>　　问题八，&nbsp;<BR>　　你的时间无限，长生不老，所以最想做的事，应该无限延期？&nbsp;<BR>　　回答：不，傻瓜才会这样认为。&nbsp;<BR>　　<BR>　　然而我们却常说，等我老了，要去环游世界；等我退休，就要去做想做的事情；等孩子长大了，我就可以……&nbsp;<BR>　　我们都以为自己有无限的时间与精力。其实我们可以一步一步实现理想，不必在等待中徒&nbsp;耗生命。如果现在就能一步一步努力接近，我们就不会活了半生，却出现自己最不想看到的结局。&nbsp;<BR>　　<BR>　　——做人，要活在当下.&nbsp;<BR>]]></description>
</item><item>
<title><![CDATA[Singleton pattern, Double-checked Locking pattern]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13102</link>
<author>pudding009</author>
<pubDate>2006/4/2 14:42:09</pubDate>
<description><![CDATA[
<P><STRONG>koji</STRONG> </P>
<P><A href="http://www.jsptw.com/jute/post/view?bid=25&amp;id=3939&amp;sty=1&amp;tpg=2&amp;age=0">http://www.jsptw.com/jute/post/view?bid=25&amp;id=3939&amp;sty=1&amp;tpg=2&amp;age=0</A></P>
<P>double-checked locking範例n </P>
<P>
<TABLE class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
<TBODY>
<TR>
<TD vAlign=top align=left width=1 bgColor=#dddddd><PRE><FONT color=#555555>1<BR>2<BR>3<BR>4<BR>5<BR>6<BR>7<BR>8<BR>9<BR>10<BR>11<BR></FONT></PRE></TD>
<TD vAlign=top align=left bgColor=#ffffff><PRE><FONT class=java-reserved_word><B>public</B></FONT> <FONT class=java-reserved_word><B>static</B></FONT> Singleton getInstance()
<FONT class=java-bracket>{</FONT>
  <FONT class=java-reserved_word><B>if</B></FONT> (instance == <FONT class=java-reserved_word><B>null</B></FONT>)
  <FONT class=java-bracket>{</FONT>
    <FONT class=java-reserved_word><B>synchronized</B></FONT>(Singleton.class) <FONT class=java-bracket>{</FONT>  <FONT class=java-comment>//1</FONT>
      <FONT class=java-reserved_word><B>if</B></FONT> (instance == <FONT class=java-reserved_word><B>null</B></FONT>)          <FONT class=java-comment>//2</FONT>
        instance = <FONT class=java-reserved_word><B>new</B></FONT> Singleton();  <FONT class=java-comment>//3</FONT>
    <FONT class=java-bracket>}</FONT>
  <FONT class=java-bracket>}</FONT>
  <FONT class=java-reserved_word><B>return</B></FONT> instance;
<FONT class=java-bracket>}</FONT>
</PRE></TD></TR></TBODY></TABLE><BR><BR>表面上看來不會有問題 <BR>但是在實際上java環境下跑起來可能會如下的問題發生 <BR>這是因為現在的java環境下memory model的關係,允許out of order寫入(這邊中文不知這樣可不可以) <BR><BR>1.thread1 進入getInstance() <BR>2.instance是null,所以thread1進入synchronized block <BR>3.thread1執行到//3讓instance變成非null,但是此時並無執行constructor <BR>4.thread1切換到thread2 <BR>5.thread2檢查instance是否是null,但是因為instance並非null,所以thread2只把雖已建構,但並無完全出始化的Singleton物件,參考到instance並取得. <BR>6.thread2切換到thread1 <BR>7.thread1執行constructor並取得其參考,完成Singleton物件的初期化 <BR><BR>另外一種,試圖解決out of order的做法 <BR>
<TABLE class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
<TBODY>
<TR>
<TD vAlign=top align=left width=1 bgColor=#dddddd><PRE><FONT color=#555555>1<BR>2<BR>3<BR>4<BR>5<BR>6<BR>7<BR>8<BR>9<BR>10<BR>11<BR>12<BR>13<BR>14<BR>15<BR>16<BR>17<BR></FONT></PRE></TD>
<TD vAlign=top align=left bgColor=#ffffff><PRE><FONT class=java-reserved_word><B>public</B></FONT> <FONT class=java-reserved_word><B>static</B></FONT> Singleton getInstance()
<FONT class=java-bracket>{</FONT>
  <FONT class=java-reserved_word><B>if</B></FONT> (instance == <FONT class=java-reserved_word><B>null</B></FONT>)
  <FONT class=java-bracket>{</FONT>
    <FONT class=java-reserved_word><B>synchronized</B></FONT>(Singleton.class) <FONT class=java-bracket>{</FONT>      <FONT class=java-comment>//1</FONT>
      Singleton inst = instance;         <FONT class=java-comment>//2</FONT>
      <FONT class=java-reserved_word><B>if</B></FONT> (inst == <FONT class=java-reserved_word><B>null</B></FONT>)
      <FONT class=java-bracket>{</FONT>
        <FONT class=java-reserved_word><B>synchronized</B></FONT>(Singleton.class) <FONT class=java-bracket>{</FONT>  <FONT class=java-comment>//3</FONT>
          inst = <FONT class=java-reserved_word><B>new</B></FONT> Singleton();        <FONT class=java-comment>//4</FONT>
        <FONT class=java-bracket>}</FONT>
        instance = inst;                 <FONT class=java-comment>//5</FONT>
      <FONT class=java-bracket>}</FONT>
    <FONT class=java-bracket>}</FONT>
  <FONT class=java-bracket>}</FONT>
  <FONT class=java-reserved_word><B>return</B></FONT> instance;
<FONT class=java-bracket>}</FONT>
</PRE></TD></TR></TBODY></TABLE><BR><BR>主要為了避免之前的問題,導入了synchronized和使用inst變數的做法 <BR>理由如下 <BR>1.thread1 進入getInstance() <BR>2.instance是null,所以thread1進入synchronized block <BR>3.變數inst取得instance的值,//2但是為null <BR>4.因為inst為NULL,所以thread1會在//3進入第二個synchronized block <BR>5.接下來thread1於//4執行code,將inst改成非null,但是此時並無執行Singleton的constructor(也就是上面範例的缺陷發生原因) <BR>6.thread1切換到thread2 <BR>7.thread2進入getInstance() <BR>8.因為instance為null,因此thread2於//1會想進入synchronized block,但是現在被thread1所鎖住. <BR>9.切換到thread1//4的部分被執行完畢 <BR>10.thread1將完整建構好的 Singleton 物件傳回給變數instance//5,結束兩個synchronized block <BR>11.thread1回傳instance <BR>12.接下來回到thread2,//2將instance代入到inst <BR>13.thread2知道instance並非null,因此回傳instance <BR><BR>關鍵在於//5的部分,在寫上述範例中必須假設成,instance必須將會變成null或者是完全建構好的 Singleton 物件.當這個假設和事實衝突時,就是問題發生的原因了. <BR><BR>依照現行的memory model的定義,上面這個code將不會得到如我們預想的結果 <BR>,JLS定義中無法將synchronized block內的code搬到外面,但是並沒有說明能將synchronized block外的搬到內部. <BR><BR>jit compiler應該會抓住這部分,當作是最佳化的好機會,他會將//4和//5除去並結合,因此最佳化以後會變如下,同樣會造成out of order的問題. <BR><BR>
<TABLE class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
<TBODY>
<TR>
<TD vAlign=top align=left width=1 bgColor=#dddddd><PRE><FONT color=#555555>1<BR>2<BR>3<BR>4<BR>5<BR>6<BR>7<BR>8<BR>9<BR>10<BR>11<BR>12<BR>13<BR>14<BR>15<BR>16<BR>17<BR>18<BR></FONT></PRE></TD>
<TD vAlign=top align=left bgColor=#ffffff><PRE><FONT class=java-reserved_word><B>public</B></FONT> <FONT class=java-reserved_word><B>static</B></FONT> Singleton getInstance()
<FONT class=java-bracket>{</FONT>
  <FONT class=java-reserved_word><B>if</B></FONT> (instance == <FONT class=java-reserved_word><B>null</B></FONT>)
  <FONT class=java-bracket>{</FONT>
    <FONT class=java-reserved_word><B>synchronized</B></FONT>(Singleton.class) <FONT class=java-bracket>{</FONT>      <FONT class=java-comment>//1</FONT>
      Singleton inst = instance;         <FONT class=java-comment>//2</FONT>
      <FONT class=java-reserved_word><B>if</B></FONT> (inst == <FONT class=java-reserved_word><B>null</B></FONT>)
      <FONT class=java-bracket>{</FONT>
        <FONT class=java-reserved_word><B>synchronized</B></FONT>(Singleton.class) <FONT class=java-bracket>{</FONT>  <FONT class=java-comment>//3</FONT>
          <FONT class=java-comment>//inst = new Singleton();      //4</FONT>
          instance = <FONT class=java-reserved_word><B>new</B></FONT> Singleton();               
        <FONT class=java-bracket>}</FONT>
        <FONT class=java-comment>//instance = inst;               //5</FONT>
      <FONT class=java-bracket>}</FONT>
    <FONT class=java-bracket>}</FONT>
  <FONT class=java-bracket>}</FONT>
  <FONT class=java-reserved_word><B>return</B></FONT> instance;
<FONT class=java-bracket>}</FONT>
</PRE></TD></TR></TBODY></TABLE><BR><BR>解決方式就像之前板上大家討論的 <BR>要碼就是 <BR>
<TABLE class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
<TBODY>
<TR>
<TD vAlign=top align=left width=1 bgColor=#dddddd><PRE><FONT color=#555555>1<BR>2<BR>3<BR>4<BR>5<BR>6<BR></FONT></PRE></TD>
<TD vAlign=top align=left bgColor=#ffffff><PRE><FONT class=java-reserved_word><B>public</B></FONT> <FONT class=java-reserved_word><B>static</B></FONT> <FONT class=java-reserved_word><B>synchronized</B></FONT> Singleton getInstance()
<FONT class=java-bracket>{</FONT>
  <FONT class=java-reserved_word><B>if</B></FONT> (instance == <FONT class=java-reserved_word><B>null</B></FONT>)          <FONT class=java-comment>//1</FONT>
    instance = <FONT class=java-reserved_word><B>new</B></FONT> Singleton();  <FONT class=java-comment>//2</FONT>
  <FONT class=java-reserved_word><B>return</B></FONT> instance;               <FONT class=java-comment>//3</FONT>
<FONT class=java-bracket>}</FONT>
</PRE></TD></TR></TBODY></TABLE><BR><BR>不然就是 <BR>
<TABLE class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
<TBODY>
<TR>
<TD vAlign=top align=left width=1 bgColor=#dddddd><PRE><FONT color=#555555>1<BR>2<BR>3<BR>4<BR>5<BR>6<BR>7<BR>8<BR>9<BR>10<BR>11<BR>12<BR>13<BR>14<BR>15<BR>16<BR>17<BR>18<BR></FONT></PRE></TD>
<TD vAlign=top align=left bgColor=#ffffff><PRE><FONT class=java-reserved_word><B>class</B></FONT> Singleton
<FONT class=java-bracket>{</FONT>
  <FONT class=java-reserved_word><B>private</B></FONT> Vector v;
  <FONT class=java-reserved_word><B>private</B></FONT> <FONT class=java-reserved_word><B>boolean</B></FONT> inUse;
  <FONT class=java-reserved_word><B>private</B></FONT> <FONT class=java-reserved_word><B>static</B></FONT> Singleton instance = <FONT class=java-reserved_word><B>new</B></FONT> Singleton();
&nbsp;
  <FONT class=java-reserved_word><B>private</B></FONT> Singleton()
  <FONT class=java-bracket>{</FONT>
    v = <FONT class=java-reserved_word><B>new</B></FONT> Vector();
    inUse = <FONT class=java-reserved_word><B>true</B></FONT>;
    <FONT class=java-comment>//...</FONT>
  <FONT class=java-bracket>}</FONT>
&nbsp;
  <FONT class=java-reserved_word><B>public</B></FONT> <FONT class=java-reserved_word><B>static</B></FONT> Singleton getInstance()
  <FONT class=java-bracket>{</FONT>
    <FONT class=java-reserved_word><B>return</B></FONT> instance;
  <FONT class=java-bracket>}</FONT>
<FONT class=java-bracket>}</FONT>
</PRE></TD></TR></TBODY></TABLE><BR><BR>底下那個String的測試code <BR>在IBM 1.3 JVM和Sun 1.3 JVM沒有問題 <BR>但是在譬如舊的版本如1.2下 <BR>會產生問題 <BR>且會執行 <BR>System.out.println("String is not immutable!"); <BR><BR></P>]]></description>
</item><item>
<title><![CDATA[关于23种设计模式的有趣见解(转)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13101</link>
<author>pudding009</author>
<pubDate>2006/4/2 14:27:36</pubDate>
<description><![CDATA[<P><A><FONT color=#000000><STRONG>创建型模式</STRONG> <BR><BR>1、FACTORY—追MM少不了请吃饭了，麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西，虽然口味有所不同，但不管你带MM去麦当劳或肯德基，只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory <BR><BR>工厂模式：客户类和工厂类分开。消费者任何时候需要某种产品，只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时，工厂类也要做相应的修改。如：如何创建及如何向客户端提供。 <BR><BR>2、BUILDER—MM最爱听的就是“我爱你”这句话了，见到不同地方的MM,要能够用她们的方言跟她说这句话哦，我有一个多种语言翻译机，上面每种语言都有一个按键，见到MM我只要按对应的键，它就能够用相应的语言说出“我爱你”这句话了，国外的MM也可以轻松搞掂，这就是我的“我爱你”builder。（这一定比美军在伊拉克用的翻译机好卖） <BR><BR>建造模式：将产品的内部表象和产品的生成过程分割开来，从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化，客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。 <BR><BR>3、FACTORY METHOD—请MM去麦当劳吃汉堡，不同的MM有不同的口味，要每个都记住是一件烦人的事情，我一般采用Factory Method模式，带着MM到服务员那儿，说“要一个汉堡”，具体要什么样的汉堡呢，让MM直接跟服务员说就行了。 <BR><BR>工厂方法模式：核心工厂类不再负责所有产品的创建，而是将具体创建的工作交给子类去做，成为一个抽象工厂角色，仅负责给出具体工厂类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节。 <BR><BR>4、PROTOTYPE—跟MM用QQ聊天，一定要说些深情的话语了，我搜集了好多肉麻的情话，需要时只要copy出来放到QQ里面就行了，这就是我的情话prototype了。（100块钱一份，你要不要） <BR><BR>原始模型模式：通过给出一个原型对象来指明所要创建的对象的类型，然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类，产品类不需要非得有任何事先确定的等级结构，原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。 <BR><BR>5、SINGLETON—俺有6个漂亮的老婆，她们的老公都是我，我就是我们家里的老公Sigleton，她们只要说道“老公”，都是指的同一个人，那就是我(刚才做了个梦啦，哪有这么好的事) <BR><BR>单例模式：单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。 <BR><BR><STRONG>结构型模式</STRONG> <BR><BR>6、ADAPTER—在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好求助于我的朋友kent了，他作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我) <BR><BR>适配器（变压器）模式：把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。 <BR><BR>7、BRIDGE—早上碰到MM，要说早上好，晚上碰到MM，要说晚上好；碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型，要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题，自己用BRIDGE组合一下不就行了 <BR><BR>桥梁模式：将抽象化与实现化脱耦，使得二者可以独立的变化，也就是说将他们之间的强关联变成弱关联，也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系，从而使两者可以独立的变化。 <BR><BR>8、COMPOSITE—Mary今天过生日。“我过生日，你要送我一件礼物。”“嗯，好吧，去商店，你自己挑。”“这件T恤挺漂亮，买，这条裙子好看，买，这个包也不错，买。”“喂，买了三件了呀，我只答应送一件礼物的哦。”“什么呀，T恤加裙子加包包，正好配成一套呀，小姐，麻烦你包起来。”“……”，MM都会用Composite模式了，你会了没有？ <BR><BR>合成模式：合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。 <BR><BR>9、DECORATOR—Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照片，在背面写上“最好的的礼物，就是爱你的Fita”，再到街上礼品店买了个像框（卖礼品的MM也很漂亮哦），再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗？ <BR><BR>装饰模式：装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。 <BR><BR>10、FACADE—我有一个专业的Nikon相机，我就喜欢自己手动调光圈、快门，这样照出来的照片才专业，但MM可不懂这些，教了半天也不会。幸好相机有Facade设计模式，把相机调整到自动档，只要对准目标按快门就行了，一切由相机自动调整，这样MM也可以用这个相机给我拍张照片了。 <BR><BR>门面模式：外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用。每一个子系统只有一个门面类，而且此门面类只有一个实例，也就是说它是一个单例模式。但整个系统可以有多个门面类。 <BR><BR>11、FLYWEIGHT—每天跟MM发短信，手指都累死了，最近买了个新手机，可以把一些常用的句子存在手机里，要用的时候，直接拿出来，在前面加上MM的名字就可以发送了，再不用一个字一个字敲了。共享的句子就是Flyweight，MM的名字就是提取出来的外部特征，根据上下文情况使用。 <BR><BR>享元模式：FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部，不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态，它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来，将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象，而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。 <BR><BR>12、PROXY—跟MM在网上聊天，一开头总是“hi,你好”,“你从哪儿来呀？”“你多大了？”“身高多少呀？”这些话，真烦人，写个程序做为我的Proxy吧，凡是接收到这些话都设置好了自动的回答，接收到其他的话时再通知我回答，怎么样，酷吧。 <BR><BR>代理模式：代理模式给某一个对象提供一个代理对象，并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下，客户不想或者不能够直接引用一个对象，代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象，而仅仅持有一个被代理对象的接口，这时候代理对象不能够创建被代理对象，被代理对象必须有系统的其他角色代为创建并传入。 <BR><BR><STRONG>行为模式</STRONG> <BR><BR>13、CHAIN OF RESPONSIBLEITY—晚上去上英语课，为了好开溜坐到了最后一排，哇，前面坐了好几个漂亮的MM哎，找张纸条，写上“Hi,可以做我的女朋友吗？如果不愿意请向前传”，纸条就一个接一个的传上去了，糟糕，传到第一排的MM把纸条传给老师了，听说是个老处女呀，快跑! <BR><BR>责任链模式：在责任链模式中，很多对象由每一个对象对其下家的引用而接 <BR><BR>起来形成一条链。请求在这个链上传递，直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求，系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择：承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。 <BR><BR>14、COMMAND—俺有一个MM家里管得特别严，没法见面，只好借助于她弟弟在我们俩之间传送信息，她对我有什么指示，就写一张纸条让她弟弟带给我。这不，她弟弟又传送过来一个COMMAND，为了感谢他，我请他吃了碗杂酱面，哪知道他说：“我同时给我姐姐三个男朋友送COMMAND，就数你最小气，才请我吃面。”，:-( <BR><BR>命令模式：命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开，委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来，使得请求的一方不必知道接收请求的一方的接口，更不必知道请求是怎么被接收，以及操作是否执行，何时被执行以及是怎么被执行的。系统支持命令的撤消。 <BR><BR>15、INTERPRETER—俺有一个《泡MM真经》，上面有各种泡MM的攻略，比如说去吃西餐的步骤、去看电影的方法等等，跟MM约会时，只要做一个Interpreter，照着上面的脚本执行就可以了。 <BR><BR>解释器模式：给定一个语言后，解释器模式可以定义出其文法的一种表示，并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后，使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构，也就是一系列的组合规则。每一个命令对象都有一个解释方法，代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。 <BR><BR><BR><BR>16、ITERATOR—我爱上了Mary，不顾一切的向她求婚。 <BR><BR>Mary：“想要我跟你结婚，得答应我的条件” <BR><BR>我：“什么条件我都答应，你说吧” <BR><BR>Mary：“我看上了那个一克拉的钻石” <BR><BR>我：“我买，我买，还有吗？” <BR><BR>Mary：“我看上了湖边的那栋别墅” <BR><BR>我：“我买，我买，还有吗？” <BR><BR>Mary：“你的小弟弟必须要有50cm长” <BR><BR>我脑袋嗡的一声，坐在椅子上，一咬牙：“我剪，我剪，还有吗？” <BR><BR>…… <BR><BR>迭代子模式：迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集，聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中，从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象，每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。 <BR><BR>17、MEDIATOR—四个MM打麻将，相互之间谁应该给谁多少钱算不清楚了，幸亏当时我在旁边，按照各自的筹码数算钱，赚了钱的从我这里拿，赔了钱的也付给我，一切就OK啦，俺得到了四个MM的电话。 <BR><BR>调停者模式：调停者模式包装了一系列对象相互作用的方式，使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时，不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化，把对象在小尺度的行为上与其他对象的相互作用分开处理。 <BR><BR>18、MEMENTO—同时跟几个MM聊天时，一定要记清楚刚才跟MM说了些什么话，不然MM发现了会不高兴的哦，幸亏我有个备忘录，刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存，这样可以随时察看以前的记录啦。 <BR><BR>备忘录模式：备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下，将一个对象的状态捉住，并外部化，存储起来，从而可以在将来合适的时候把这个对象还原到存储起来的状态。 <BR><BR>19、OBSERVER—想知道咱们公司最新MM情报吗？加入公司的MM情报邮件组就行了，tom负责搜集情报，他发现的新情报不用一个一个通知我们，直接发布给邮件组，我们作为订阅者（观察者）就可以及时收到情报啦 <BR><BR>观察者模式：观察者模式定义了一种一队多的依赖关系，让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时，会通知所有观察者对象，使他们能够自动更新自己。 <BR><BR>20、STATE—跟MM交往时，一定要注意她的状态哦，在不同的状态时她的行为会有不同，比如你约她今天晚上去看电影，对你没兴趣的MM就会说“有事情啦”，对你不讨厌但还没喜欢上的MM就会说“好啊，不过可以带上我同事么？”，已经喜欢上你的MM就会说“几点钟？看完电影再去泡吧怎么样？”，当然你看电影过程中表现良好的话，也可以把MM的状态从不讨厌不喜欢变成喜欢哦。 <BR><BR>状态模式：状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里，每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候，其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时，系统便改变所选的子类。 <BR><BR>21、STRATEGY—跟不同类型的MM约会，要用不同的策略，有的请电影比较好，有的则去吃小吃效果不错，有的去海边浪漫最合适，单目的都是为了得到MM的芳心，我的追MM锦囊中有好多Strategy哦。 <BR><BR>策略模式：策略模式针对一组算法，将每一个算法封装到具有共同接口的独立的类中，从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类，各种算法在具体的策略类中提供。由于算法和环境独立开来，算法的增减，修改都不会影响到环境和客户端。 <BR><BR>22、TEMPLATE METHOD——看过《如何说服女生上床》这部经典文章吗？女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤(Template method)，但每个步骤针对不同的情况，都有不一样的做法，这就要看你随机应变啦(具体实现)； <BR><BR>模板方法模式：模板方法模式准备一个抽象类，将部分逻辑以具体方法以及具体构造子的形式实现，然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法，从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架，而将逻辑的细节留给具体的子类去实现。 <BR><BR>23、VISITOR—情人节到了，要给每个MM送一束鲜花和一张卡片，可是每个MM送的花都要针对她个人的特点，每张卡片也要根据个人的特点来挑，我一个人哪搞得清楚，还是找花店老板和礼品店老板做一下Visitor，让花店老板根据MM的特点选一束花，让礼品店老板也根据每个人特点选一张卡，这样就轻松多了； <BR><BR>访问者模式：访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话，接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统，它把数据结构和作用于结构上的操作之间的耦合解脱开，使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易，就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中，而不是分散到一个个的节点类中。当使用访问者模式时，要将尽可能多的对象浏览逻辑放在访问者类中，而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。<BR></FONT></A></P>]]></description>
</item><item>
<title><![CDATA[Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated?]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13100</link>
<author>pudding009</author>
<pubDate>2006/4/2 14:20:50</pubDate>
<description><![CDATA[<P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><A>
<P><FONT size=-2></A><A href="http://java.sun.com/j2se/1.4.2/docs/relnotes/SMICopyright.html">Copyright &copy;</A><A> 1995-99 </A><A href="http://www.sun.com/">Sun Microsystems, Inc.</A><A> All Rights Reserved.</FONT></P><FONT size=-1></A><A href="http://www.java.sun.com/cgi-bin/feedback.pl">Suggest a feature or make comments</A><A> </FONT></A>
<H3>Why is <CODE>Thread.stop</CODE> deprecated?</H3>
<P>Because it is inherently unsafe. Stopping a thread causes it to unlock all the monitors that it has locked. (The monitors are unlocked as the <CODE>ThreadDeath</CODE> exception propagates up the stack.) If any of the objects previously protected by these monitors were in an inconsistent state, other threads may now view these objects in an inconsistent state. Such objects are said to be <I>damaged</I>. When threads operate on damaged objects, arbitrary behavior can result. This behavior may be subtle and difficult to detect, or it may be pronounced. Unlike other unchecked exceptions, <CODE>ThreadDeath</CODE> kills threads silently; thus, the user has no warning that his program may be corrupted. The corruption can manifest itself at any time after the actual damage occurs, even hours or days in the future. 
<P>
<HR>

<H3>Couldn't I just catch the <CODE>ThreadDeath</CODE> exception and fix the damaged object?</H3>
<P>In theory, perhaps, but it would <EM>vastly</EM> complicate the task of writing correct multithreaded code. The task would be nearly insurmountable for two reasons: 
<OL>
<LI>A thread can throw a <CODE>ThreadDeath</CODE> exception <I>almost anywhere</I>. All synchronized methods and blocks would have to be studied in great detail, with this in mind. 
<LI>A thread can throw a second <CODE>ThreadDeath</CODE> exception while cleaning up from the first (in the <CODE>catch</CODE> or <CODE>finally</CODE> clause). Cleanup would have to repeated till it succeeded. The code to ensure this would be quite complex. </LI></OL>In sum, it just isn't practical. 
<P>
<HR>

<H3>What about <CODE>Thread.stop(Throwable)</CODE>?</H3>
<P>In addition to all of the problems noted above, this method may be used to generate exceptions that its target thread is unprepared to handle (including checked exceptions that the thread could not possibly throw, were it not for this method). For example, the following method is behaviorally identical to Java's <CODE>throw</CODE> operation, but circumvents the compiler's attempts to guarantee that the calling method has declared all of the checked exceptions that it may throw: <PRE>    static void sneakyThrow(Throwable t) {
        Thread.currentThread().stop(t);
    }
</PRE>
<P>
<HR>

<H3>What should I use instead of <CODE>Thread.stop</CODE>?</H3>
<P>Most uses of <CODE>stop</CODE> should be replaced by code that simply modifies some variable to indicate that the target thread should stop running. The target thread should check this variable regularly, and return from its run method in an orderly fashion if the variable indicates that it is to stop running. (This is the approach that JavaSoft's <A href="http://java.sun.com/docs/books/tutorial/essential/threads/lifecycle.html">Tutorial</A> has always recommended.) To ensure prompt communication of the stop-request, the variable must be <TT>volatile</TT> (or access to the variable must be synchronized). 
<P>For example, suppose your applet contains the following <CODE>start</CODE>, <CODE>stop</CODE> and <CODE>run</CODE> methods: <PRE>    private Thread blinker;

    public void start() {
        blinker = new Thread(this);
        blinker.start();
    }

    public void stop() {
        blinker.stop();  // UNSAFE!
    }

    public void run() {
        Thread thisThread = Thread.currentThread();
        while (true) {
            try {
                thisThread.sleep(interval);
            } catch (InterruptedException e){
            }
            repaint();
        }
    }
</PRE>You can avoid the use of <CODE>Thread.stop</CODE> by replacing the applet's <CODE>stop</CODE> and <CODE>run</CODE> methods with: <PRE>    private volatile Thread blinker;

    public void stop() {
        blinker = null;
    }

    public void run() {
        Thread thisThread = Thread.currentThread();
        while (blinker == thisThread) {
            try {
                thisThread.sleep(interval);
            } catch (InterruptedException e){
            }
            repaint();
        }
    }
</PRE>
<P>
<HR>

<H3>How do I stop a thread that waits for long periods (e.g., for input)?</H3>
<P>That's what the <CODE>Thread.interrupt</CODE> method is for. The same "state based" signaling mechanism shown above can be used, but the state change (<CODE>blinker = null</CODE>, in the previous example) can be followed by a call to <CODE>Thread.interrupt</CODE>, to interrupt the wait: <PRE>    public void stop() {
        Thread moribund = waiter;
        waiter = null;
        moribund.interrupt();
    }
</PRE>For this technique to work, it's critical that any method that catches an interrupt exception and is not prepared to deal with it immediately reasserts the exception. We say <EM>reasserts</EM> rather than <EM>rethrows</EM>, because it is not always possible to rethrow the exception. If the method that catches the <CODE>InterruptedException</CODE> is not declared to throw this (checked) exception, then it should "reinterrupt itself" with the following incantation: <PRE>    Thread.currentThread().interrupt();
</PRE>This ensures that the Thread will reraise the <CODE>InterruptedException</CODE> as soon as it is able. 
<P>
<HR>

<H3>What if a thread doesn't respond to <CODE>Thread.interrupt</CODE>?</H3>
<P>In some cases, you can use application specific tricks. For example, if a thread is waiting on a known socket, you can close the socket to cause the thread to return immediately. Unfortunately, there really isn't any technique that works in general. <EM>It should be noted that in all situations where a waiting thread doesn't respond to <CODE>Thread.interrupt</CODE>, it wouldn't respond to <CODE>Thread.stop</CODE> either.</EM> Such cases include deliberate denial-of-service attacks, and I/O operations for which thread.stop and thread.interrupt do not work properly. 
<P>
<HR>

<H3>Why are <CODE>Thread.suspend</CODE> and <CODE>Thread.resume</CODE> deprecated?</H3>
<P><CODE>Thread.suspend</CODE> is inherently deadlock-prone. If the target thread holds a lock on the monitor protecting a critical system resource when it is suspended, no thread can access this resource until the target thread is resumed. If the thread that would resume the target thread attempts to lock this monitor prior to calling <CODE>resume</CODE>, deadlock results. Such deadlocks typically manifest themselves as "frozen" processes. 
<P>
<HR>

<H3>What should I use instead of <CODE>Thread.suspend</CODE> and <CODE>Thread.resume</CODE>?</H3>
<P>As with <CODE>Thread.stop</CODE>, the prudent approach is to have the "target thread" poll a variable indicating the desired state of the thread (active or suspended). When the desired state is suspended, the thread waits using <CODE>Object.wait</CODE>. When the thread is resumed, the target thread is notified using <CODE>Object.notify</CODE>. 
<P>For example, suppose your applet contains the following mousePressed event handler, which toggles the state of a thread called <CODE>blinker</CODE>: <PRE>    private boolean threadSuspended;

    Public void mousePressed(MouseEvent e) {
        e.consume();

        if (threadSuspended)
            blinker.resume();
        else
            blinker.suspend();  // DEADLOCK-PRONE!

        threadSuspended = !threadSuspended;
    }
</PRE>You can avoid the use of <CODE>Thread.suspend</CODE> and <CODE>Thread.resume</CODE> by replacing the event handler above with: <PRE>    public synchronized void mousePressed(MouseEvent e) {
        e.consume();

        threadSuspended = !threadSuspended;

        if (!threadSuspended)
            notify();
    }
</PRE>and adding the following code to the "run loop": <PRE>                synchronized(this) {
                    while (threadSuspended)
                        wait();
                }
</PRE>The <CODE>wait</CODE> method throws the <CODE>InterruptedException</CODE>, so it must be inside a <CODE>try ... catch</CODE> clause. It's fine to put it in the same clause as the <CODE>sleep</CODE>. The check should follow (rather than precede) the <CODE>sleep</CODE> so the window is immediately repainted when the the thread is "resumed." The resulting <CODE>run</CODE> method follows: <PRE>    public void run() {
        while (true) {
            try {
                Thread.currentThread().sleep(interval);

                synchronized(this) {
                    while (threadSuspended)
                        wait();
                }
            } catch (InterruptedException e){
            }
            repaint();
        }
    }
</PRE>Note that the <CODE>notify</CODE> in the <CODE>mousePressed</CODE> method and the <CODE>wait</CODE> in the <CODE>run</CODE> method are inside <CODE>synchronized</CODE> blocks. This is required by the language, and ensures that <CODE>wait</CODE> and <CODE>notify</CODE> are properly serialized. In practical terms, this eliminates race conditions that could cause the "suspended" thread to miss a <CODE>notify</CODE> and remain suspended indefinitely. 
<P>While the cost of synchronization in Java is decreasing as the platform matures, it will never be free. A simple trick can be used to remove the synchronization that we've added to each iteration of the "run loop." The synchronized block that was added is replaced by a slightly more complex piece of code that enters a synchronized block only if the thread has actually been suspended: <PRE>                if (threadSuspended) {
                    synchronized(this) {
                        while (threadSuspended)
                            wait();
                    }
                }
</PRE>
<P>In the absence of explicit synchronization, <TT>threadSuspended</TT> must be made <TT>volatile</TT> to ensure prompt communication of the suspend-request. </P>The resulting <CODE>run</CODE> method is: <PRE>    private boolean volatile threadSuspended;

    public void run() {
        while (true) {
            try {
                Thread.currentThread().sleep(interval);

                if (threadSuspended) {
                    synchronized(this) {
                        while (threadSuspended)
                            wait();
                    }
                }
            } catch (InterruptedException e){
            }
            repaint();
        }
    }
</PRE>
<P>
<HR noShade SIZE=3>

<H3>Can I combine the two techniques to produce a thread that may be safely "stopped" or "suspended"?</H3>Yes; it's reasonably straightforward. The one subtlety is that the target thread may already be suspended at the time that another thread tries to stop it. If the <TT>stop</TT> method merely sets the state variable (<TT>blinker</TT>) to null, the target thread will remain suspended (waiting on the monitor), rather than exiting gracefully as it should. If the applet is restarted, multiple threads could end up waiting on the monitor at the same time, resulting in erratic behavior. 
<P>To rectify this situation, the <TT>stop</TT> method must ensure that the target thread resumes immediately if it is suspended. Once the target thread resumes, it must recognize immediately that it has been stopped, and exit gracefully. Here's how the resulting <TT>run</TT> and <TT>stop</TT> methods look: <PRE>    public void run() {
        Thread thisThread = Thread.currentThread();
        while (blinker == thisThread) {
            try {
                thisThread.sleep(interval);

                synchronized(this) {
                    while (threadSuspended &amp;&amp; blinker==thisThread)
                        wait();
                }
            } catch (InterruptedException e){
            }
            repaint();
        }
    }

    public synchronized void stop() {
        blinker = null;
        notify();
    }
</PRE>If the <TT>stop</TT> method calls <TT>Thread.interrupt</TT>, as described above, it needn't call <TT>notify</TT> as well, but it still must be synchronized. This ensures that the target thread won't miss an interrupt due to a race condition. 
<P>
<HR>

<H3>What about <CODE>Thread.destroy</CODE>?</H3><CODE>Thread.destroy</CODE> has never been implemented. If it were implemented, it would be deadlock-prone in the manner of <CODE>Thread.suspend</CODE>. (In fact, it is roughly equivalent to <CODE>Thread.suspend</CODE> without the possibility of a subsequent <CODE>Thread.resume</CODE>.) We are not implementing it at this time, but neither are we deprecating it (forestalling its implementation in future). While it would certainly be deadlock prone, it has been argued that there may be circumstances where a program is willing to risk a deadlock rather than exit outright. 
<P>
<P>
<HR>

<H3>Why is <CODE>Runtime.runFinalizersOnExit</CODE> deprecated?</H3>Because it is inherently unsafe. It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock. While this problem could be prevented if the class whose objects are being finalized were coded to "defend against" this call, most programmers do <I>not</I> defend against it. They assume that an object is dead at the time that its finalizer is called. 
<P>Further, the call is not "thread-safe" in the sense that it sets a VM-global flag. This forces <I>every</I> class with a finalizer to defend against the finalization of live objects!</P></TD></TR></TBODY></TABLE></P>]]></description>
</item><item>
<title><![CDATA[Thinking in Java笔记]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13099</link>
<author>pudding009</author>
<pubDate>2006/4/2 14:19:27</pubDate>
<description><![CDATA[<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">初学Java，看Thinking in Java时候做的部分章节笔记，一些容易遗忘和忽略的东西</DIV>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid"><A><STRONG>(4).初始化与清理</STRONG> 
<P>1.如果写了一个没有构造函数的类，编译器会自动为你创建一个默认的构造函数；<BR>2.如果写了有构造函数的类(包括无参数的构造函数或带参数的构造函数)，编译器不再为你创建一个默认的构造函数；<BR>3.如果写了一个带参数的构造函数的类，且无无参数的构造函数，如使用 new ClassName() ,编译器报错，没有定义默认构造函数；<BR>4.this关键字处在对象自身内部表示自身的reference；<BR>5.当你为同一个类撰写多个构造函数时候，this关键字在一个构造函数内可以作为调用另一个构造函数的一种形式，且可调用一次；</P>
<P>6.对primitive进行重载，如找不到匹配的类型，实参比形参小，primitive会自动从较小的类型升级到相近的较大类型(常数被视为int类型，char类型比较特殊被升级为int类型)；<BR>7.对primitive进行重载，如找不到匹配的类型，实参比形参大，需要强制设置类型转换，否则编译器报错(且会造成数据丢失的问题)；</P>
<P>8.垃圾回收器只知道释放new分配的内存；</P>
<P>9.类的primitive成员变量如果没有赋初值，编译器会自动赋值；<BR>10.一个类何时被加载 : a.当第一次新建类的一个实例时 b.或第一次访问类的static成员时；<BR>11.初始化顺序: <BR>&nbsp;&nbsp; a.加载类，一个类何时被加载 : a.当第一次新建类的一个实例时 b.或第一次访问类的static成员时；<BR>&nbsp;&nbsp; b.初始化static成员，且初始化一次；<BR>&nbsp;&nbsp; c.初始化primitive成员变量和reference值；<BR>&nbsp;&nbsp; d.执行构造函数；</P>
<P>12.static block 将静态初始化语句全部组织起来；<BR>12.非 static block 将初始化语句全部组织起来；</P></DIV>
<P></A>&nbsp;</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P><STRONG>5.隐藏实现</STRONG><BR><BR>1.package语句必须是文件里的第一个非注释行；<BR>2.无论那种对象，只要放进了String表达式，就会被强制转换为这个对象的String表示形式；<BR>3.如果不写类的访问控制符，默认为package权限，但是如果这个类有public 的 static成员，既便客户程序员不能创建那个类对象，也可以访问static成员；</P></DIV>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P><STRONG>6.复用类</STRONG></P>
<P>1.可以在派生类里修改基类定义的方法，如果在这个复写的方法里调用基类的方法，需要使用super.方法名(),否则造成递归；</P>
<P>2.继承会令构造行为从基类“向外”发展，基类会在派生类的构造函数访问它之前进行初始化；</P>
<P>3.既便你不为派生类创建构造函数，编译器也会为你构造一个默认的构造函数，然后在由它去调用基类的构造函数；</P>
<P>4.如基类没有默认构造函数，或者要调用的基类构造函数带参数的，需要显视的用super关键字以及合适的参数调用构造函数；</P>
<P>5.对派生类的构造函数而言，调用基类的构造函数应该是它做的第一件事情，应明白什么时候需要用super参与调用，什么时候编译器会帮你完成(参见4)，编译器会强制你这么做，否则会报错；</P>
<P>6.不能某样东西是final的，就判断说“它的值在编译的时候就已经确定了”，在运行期确定值也是可以的；</P>
<P>7.空白final数据，你一定要为final数据赋值，为了确保final数据在使用前已经初始化，要么在定义数据的时候用表达式赋值，要么在构造函数里面进行赋值；</P>
<P>8.final的参数，不能在方法里reference指向另一个对象，同样符合final的含义；</P>
<P>9.final的方法禁止派生类复写，private方法根本不存在被复写的机会；</P>
<P>10.final的类会禁止集成，隐式的将final的类中的方法作为final的方法，因为类无法继承，何来复写，但不会影响成员变量的类型；</P></DIV>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid"><BR><STRONG>7.多态性</STRONG><BR><BR></DIV>
<P>&nbsp;</P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P><STRONG>8.接口和内部类</STRONG><BR><BR>1.接口内方法被自动为public的；</P>
<P>2.复载和覆盖不期而遇且不能仅仅通过返回值来辨别重载的方法；</P>
<P>3.interface的数据成员自动就是public、static和final，方法是public的；</P>
<P>4.接口嵌套接口，类嵌套接口；</P>
<P>5.嵌套的私有接口只能在它的类里面实现(私有接口不能被外部访问)；</P>
<P>6.实现接口时，不一定要实现嵌套里面的接口；</P>
<P>7.公共接口返回一个private接口的reference；</P>
<P>8.除非在“宿主类”的非static方法里面，否则你在那里创建内部类对象，都必须用outerClassName.InnerClassName表示这个对象类型；</P></DIV>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P><STRONG>9.用异常来处理错误</STRONG></P>
<P>1.getMessage()类似与toString()，getLocalizedMessage()获得更多信息;</P>
<P>2.可以声称方法会抛出一个实际并不会抛出的异常，编译器会当真，它会要求客户程序员象真的会抛出异常那样使用这个方法，它能为异常占个位子；</P>
<P>3.fillInStackTrace覆盖旧的异常轨迹，保存新的异常轨迹,fillInStackTrace返回的是Throwable的reference；</P>
<P>4.如果抛出一个与你扑捉到的异常不同的异常，异常的最初在那里发生的信息被扔掉了，里面保存的是抛出新异常的地点，与fillInStackTrace有相同的效果；</P>
<P>5.异常链：扑捉到一个异常并且抛出另一个异常的时候，还要保存前一个异常的信息(与4.的称述相矛盾),Throwable的子类都有一个能接受cause对象的构造函数，cause就是用来保存前一个异常的。但Throwable的之类中只有三种基类的异常提供了带cause参数的构造函数，他们是Error，Exception和RuntimeException，如果你要链接其他异常，那就不能用构造函数，而只能用initCause方法了。</P>
<P>6.RuntimeException由Java自动抛出，通常情况不用自己去扑捉RuntimeException，你只能忽略RuntimeException(及其之类)，RuntimeException表示编程错误，如果RuntimeException不受阻挡的冲到main(),它就会在程序退出的时候，调用printStackTrace()；</P>
<P>7.异常没有被当前这组catch子句所扑获的情况下，finally也会在异常处理机制的更高一层的运行环境开始寻找处理程序之前得到执行了；</P>
<P>7.把try区块放进一个循环，你就能构建一个程序运行之前必须满足的条件，提高程序的健壮性；</P>
<P>8.有break和continue语句的情况下，finally语句也会得到执行；</P>
<P>&nbsp;</P>
<P>9.finally造成丢失的异常：第一个异常尚未处理，就产生了第二个异常；</P>
<P>匹配异常的时候并不要求抛出的异常同处理程序所要求的异常完全匹配，派生类的对象也可以匹配处理程序中的基类；</P>
<P>如果把扑捉基类异常的catch子句放在最前面，就会把该异常的派生类的异常全部给屏蔽掉；</P>
<P>如果异常被传到控制台，就无需再在main()的主体用try-catch子句了；</P>
<P>覆写方法的时候，只能抛出这个方法在基类中的版本所声名的异常；</P></DIV>]]></description>
</item><item>
<title><![CDATA[诡异的autoboxing与unboxing]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13098</link>
<author>pudding009</author>
<pubDate>2006/4/2 14:18:35</pubDate>
<description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">再来看一个，先看看程序，您以为结果是如何？</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P><B><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid"><B><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">Integer i1 = 100;<BR>Integer i2 = 100;<BR>&nbsp;<BR>if (i1 == i2) <BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("i1 == i2");<BR>else <BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("i1 != i2");</SPAN></B></DIV></SPAN></B>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">&nbsp;<BR><BR></FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">以自动装箱与拆箱的机制来看，我想您会觉得结果是显示</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">"i1 == i2"</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">，您是对的！那么下面这个您觉得结果是什么？</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P><B><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid"><B><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-font-kerning: 0pt">Integer i1 = 200;<BR>Integer i2 = 200;<BR>&nbsp;<BR>if (i1 == i2) <BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("i1 == i2");<BR>else <BR>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("i1 != i2");</SPAN></B></DIV></SPAN></B>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">&nbsp;<BR><BR></FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">结果是显示</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">"i1 != i2"</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">，这有些令人讶异，语法完全一样，只不过改个数值而已，结果却相反。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><BR><BR></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">其实这与</SPAN><B><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">'=='</FONT></SPAN></B><B><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">运算符</SPAN></B><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">的比较有关，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">'=='</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">可用来比较两个基本型态的变量值是否相等，事实上</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">'=='</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">也用于判断两个对象变量名称是否参考至同一个对象。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><BR><BR></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">所以</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">'=='</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">可以比较两个基本型态的变量值是否相等，也可以判断两个对象变量的参考对象是否相同，当您如前两个程序的方式撰写时，编译器不知道您实际上要比较的是哪一种？所以对于值从</SPAN><B><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">-128</FONT></SPAN></B><B><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">到</SPAN></B><B><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">127</FONT></SPAN></B><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">之间的值，它们被装箱为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">Integer</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">对象后，会存在内存之中被重用，所以当值在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">100</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">，使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">'=='</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">进行比较时，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">i1 </FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">与</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman"> i2</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">实际上参考至同一个对象。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><BR><BR></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">如果超过了从</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">-128</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">到</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">127</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">之间的值，被装箱后的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">Integer</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">对象并不会被重用，即相当于每次都新建一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">Integer</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">对象，所以当值在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman"> 200</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">，使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">'=='</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">进行比较时，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">i1</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">与</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; mso-font-kerning: 0pt"><FONT face="Times New Roman">i2</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">参考的是不同的对象。</SPAN></P>]]></description>
</item><item>
<title><![CDATA[String( Equal , ==, intern())]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13097</link>
<author>pudding009</author>
<pubDate>2006/4/2 14:16:31</pubDate>
<description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><STRONG>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P><STRONG>String java.lang.String.intern()</STRONG><BR>Returns a canonical representation for the string object. </P>
<P>A pool of strings, initially empty, is maintained privately by the class String. </P>
<P>When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. </P>
<P>It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true. </P>
<P>All literal strings and string-valued constant expressions are interned. String literals are defined in §3.10.5 of the Java Language Specification </P>
<P>Returns:<BR>a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.</P></DIV></STRONG>
<P>Test Game：<A href="http://blogger.org.cn/blog/images/emot/face3.gif" target=_blank><IMG onmousewheel="return bbimg(this)" title=点击在新窗口查看原始图片 src="http://blogger.org.cn/blog/images/emot/face3.gif" onload="java_script_:if(this.width>500)this.width=500" border=0></A></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P>package org.sixsun.designpattern.flyweight;</P>
<P>import junit.framework.TestCase;</P>
<P>public class TestFlyweight extends TestCase {</P>
<P>&nbsp;String str1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;String str2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;String str3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;String str4;<BR>&nbsp;<BR>&nbsp;public static void main(String[] args) {<BR>&nbsp;}</P>
<P>&nbsp;public TestFlyweight(String name) {<BR>&nbsp;&nbsp;super(name);<BR>&nbsp;}</P>
<P>&nbsp;protected void setUp() throws Exception {<BR>&nbsp;&nbsp;super.setUp();<BR>&nbsp;&nbsp;str1 = "fly";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;str2 = "weight";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;str3 = "flyweight";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;str4 = str1 + str2;&nbsp;<BR>&nbsp;}</P>
<P>&nbsp;protected void tearDown() throws Exception {<BR>&nbsp;&nbsp;super.tearDown();<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;public void testEqual1() {<BR>&nbsp;&nbsp;assertFalse(str3==str4);<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;public void testEqual2() {<BR>&nbsp;&nbsp;assertTrue(str3.equals(str4));<BR>&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;public void testEqual3() {<BR>&nbsp;&nbsp;assertFalse( str3 == "weight" + "flyweight" );<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;public void testEqual4() {<BR>&nbsp;&nbsp;assertFalse( str3 == (new String("weight") + new String ("flyweight")) );<BR>&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;public void testEqual5() {<BR>&nbsp;&nbsp;assertFalse( str3 == new String ("weight" + "flyweight") );<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;public void testEqual6() {<BR>&nbsp;&nbsp;assertFalse( str3.equals("weight" + "flyweight") );<BR>&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;public void testEqual7() {<BR>&nbsp;&nbsp;assertFalse( str3 == "weightfly" );<BR>&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;public void testEqual8() {<BR>&nbsp;&nbsp;assertFalse( str3 == new String("weightfly") );<BR>&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;public void testEqual9() {<BR>&nbsp;&nbsp;assertTrue( str1=="fly" );<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;public void testEqual10() {<BR>&nbsp;&nbsp;assertFalse( str1==new String("fly") );<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;public void testEqual11() {<BR>&nbsp;&nbsp;assertTrue( str1.equals("fly") );<BR>&nbsp;}<BR>&nbsp;&nbsp;<BR>&nbsp;public void testEqual12() {<BR>&nbsp;&nbsp;assertFalse(str3==(str1 + str2));<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;public void testEqual13() {<BR>&nbsp;&nbsp;assertFalse(str4==(str1 + str2));<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;public void testEqual14() {<BR>&nbsp;&nbsp;assertFalse((str1 + str2)==(str1 + str2));<BR>&nbsp;}<BR>&nbsp;<BR>&nbsp;public void testEqual15() {<BR>&nbsp;&nbsp;assertTrue((str1 + str2).equals(str1 + str2));<BR>&nbsp;}&nbsp;</P>
<P>&nbsp;public void testEqualIntern() {<BR>&nbsp;&nbsp;assertTrue(str3==(str1 + str2).intern());<BR>&nbsp;}&nbsp;</P>
<P>}<BR></P></DIV></TD></TR></TBODY></TABLE>
<P><A></A>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[Class.isInstance() O.R. Class.isAssignableFrom()]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13096</link>
<author>pudding009</author>
<pubDate>2006/4/2 14:15:18</pubDate>
<description><![CDATA[<P><A>　isInstance <BR>&nbsp;public native boolean isInstance(Object obj)</A></P>
<P>此方法是 Java 语言 instanceof 操作的动态等价方法。 如果指定的 Object 参数非空，且该类不生成 ClassCastException 异常的引用，则返回 true， 否则返回 false。 <BR>特别地，当该类表示一个已声明的类时，若指定的 Object 是该类(或其任一父类)的一个实例则返回 true，否则返回 false。若该类是一数组类，且指定的 Object 能通过转换运算、或转换运算的扩充引用，转换为一个数组对象，那么返回 true；否则返回 false。 若该类是接口类，如果指定的 Object 参数类或其任一父类实现了此接口则返回 true；否则返回 false。如果该类是基类型类，则返回 false。 </P>
<P><BR>参数： <BR>obj - 检查的对象。 <BR>isAssignableFrom <BR>&nbsp;public native boolean isAssignableFrom(Class cls)</P>
<P>判定 Class 对象表示的类或接口是否同参数指定的 Class 表示的类或接口相同，或是其父类或父接口。 如果成立则返回 true，否则返回 false。若该类是基类型类，且指定的类参数恰为此类则返回 true，否则返回 false。 <BR>特别地，通过标别转换或其扩展引用，此方法将测试指定的 Class 参数表示的类型能否转换为当前 Class 对象表示的类型，关于更详细信息，请参看 The Java Language Specification 的 5.1.1 和 5.1.4 节。 </P>
<P><BR>抛出： NullPointerException <BR>如果指定的类参数为 null。 <BR></P>]]></description>
</item><item>
<title><![CDATA[详解finalize函数]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13095</link>
<author>pudding009</author>
<pubDate>2006/4/2 14:14:33</pubDate>
<description><![CDATA[<P><A name=3><SPAN class=atitle2>详解finalize函数</SPAN></A></P>
<P>(节选【<SPAN class=atitle>垃圾收集器与Java编程</SPAN>】<A href="http://www-900.ibm.com/developerWorks/cn/java/l-JavaMemoryLeak2/index.shtml#author1">欧阳辰</A> (<A href="mailto:yeekee@sina.com">yeekee@sina.com</A>) <A href="http://www-900.ibm.com/developerWorks/cn/java/l-JavaMemoryLeak2/index.shtml#author2">周欣</A> (<A href="mailto:zhouxin@sei.pku.edu.cn">zhouxin@sei.pku.edu.cn</A>))</P>
<P><A href="http://www-900.ibm.com/developerWorks/cn/java/l-JavaMemoryLeak2/index.shtml#author1">http://www-900.ibm.com/developerWorks/cn/java/l-JavaMemoryLeak2/index.shtml#author1</A></P>
<P>finalize是位于Object类的一个方法，该方法的访问修饰符为protected，由于所有类为Object的子类，因此用户类很容易访问到这个方法。由于，finalize函数没有自动实现链式调用，我们必须手动的实现，因此finalize函数的最后一个语句通常是super.finalize()。通过这种方式，我们可以实现从下到上实现finalize的调用，即先释放自己的资源，然后再释放父类的资源。</P>
<P>根据Java语言规范，JVM保证调用finalize函数之前，这个对象是不可达的，但是JVM不保证这个函数一定会被调用。另外，规范还保证finalize函数最多运行一次。</P>
<P>很多Java初学者会认为这个方法类似与C++中的析构函数，将很多对象、资源的释放都放在这一函数里面。其实，这不是一种很好的方式。原因有三，其一，GC为了能够支持finalize函数，要对覆盖这个函数的对象作很多附加的工作。其二，在finalize运行完成之后，该对象可能变成可达的，GC还要再检查一次该对象是否是可达的。因此，使用finalize会降低GC的运行性能。其三，由于GC调用finalize的时间是不确定的，因此通过这种方式释放资源也是不确定的。</P>
<P>通常，finalize用于一些不容易控制、并且非常重要资源的释放，例如一些I/O的操作，数据的连接。这些资源的释放对整个应用程序是非常关键的。在这种情况下，程序员应该以通过程序本身管理(包括释放)这些资源为主，以finalize函数释放资源方式为辅，形成一种双保险的管理机制，而不应该仅仅依靠finalize来释放资源。</P>
<P>下面给出一个例子说明，finalize函数被调用以后，仍然可能是可达的，同时也可说明一个对象的finalize只可能运行一次。</P>
<P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
class MyObject{
    Test main; //记录Test对象，在finalize中时用于恢复可达性
    public MyObject(Test t)
    {	 
	main=t; //保存Test 对象
    }
    protected void finalize()
    {
	main.ref=this;// 恢复本对象，让本对象可达
	System.out.println("This is finalize");//用于测试finalize只运行一次
    }
}

class Test {
	MyObject ref;
 	public static void main(String[] args) {
 		Test test=new Test();
 		test.ref=new MyObject(test);
 		test.ref=null; //MyObject对象为不可达对象，finalize将被调用
 		System.gc(); 
 		if (test.ref!=null) System.out.println("My Object还活着");	
	}
}
</CODE></PRE></TD></TR></TBODY></TABLE></P>
<P>运行结果：<BR>This is finalize<BR>MyObject还活着</P>
<P>此例子中，需要注意的是虽然MyObject对象在finalize中变成可达对象，但是下次回收时候，finalize却不再被调用，因为finalize函数最多只调用一次。</P>]]></description>
</item><item>
<title><![CDATA[Java学习指南]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=13094</link>
<author>pudding009</author>
<pubDate>2006/4/2 14:11:37</pubDate>
<description><![CDATA[Java Learning Path （一）、工具篇 <BR><BR>一、 JDK (Java Development Kit) <BR><BR>JDK是整个Java的核心，包括了Java运行环境（Java Runtime Envirnment），一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK，除了Sun之外，还有很多公司和组织都开发了自己的JDK，例如IBM公司开发的JDK，BEA公司的Jrocket，还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM（Java Virtual Machine）运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说，我们还是需要先把Sun JDK掌握好。 <BR><BR>1、 JDK的下载和安装 <BR>JDK又叫做J2SE（Java2 SDK Standard Edition），可以从Sun的Java网站上下载到，http://java.sun.com/j2se/downloads.html ，JDK当前最新的版本是J2SDK1.4.2，建议下载该版本的JDK，下载页面在这里：http://java.sun.com/j2se/1.4.2/download.html。 <BR><BR>下载好的JDK是一个可执行安装程序，默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE（供浏览器来使用），在C:\j2sdk1.4.2下安装一套JDK（也包括一套JRE）。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。这样JDK就安装好了。 <BR><BR>2、 JDK的命令工具 <BR>JDK的最重要命令行工具： <BR>java： 启动JVM执行class <BR>javac： Java编译器 <BR>jar： Java打包工具 <BR>javadoc： Java文档生成器 <BR>这些命令行必须要非常非常熟悉，对于每个参数都要很精通才行。对于这些命令的学习，JDK Documentation上有详细的文档。 <BR><BR>二、 JDK Documentation <BR><BR>Documentation在JDK的下载页面也有下载连接，建议同时下载Documentation。Documentation是最最重要的编程手册，涵盖了整个Java所有方面的内容的描述。可以这样说，学习Java编程，大部分时间都是花在看这个Documentation上面的。我是随身携带的，写Java代码的时候，随时查看，须臾不离手。 <BR><BR>三、 应用服务器(App Server) <BR><BR>App Server是运行Java企业组件的平台，构成了应用软件的主要运行环境。当前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免费的Jboss，选择其中一个进行学习就可以了，个人推荐Weblogic，因为它的体系结构更加干净，开发和部署更加方便，是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App Server： <BR><BR>1、 Tomcat <BR>Tomcat严格意义上并不是一个真正的App Server，它只是一个可以支持运行Serlvet/JSP的Web容器，不过Tomcat也扩展了一些App Server的功能，如JNDI，数据库连接池，用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java Web应用中，因此本文做一点下载、安装和配置Tomcat的介绍： <BR><BR>Tomcat是Apache组织下Jakarta项目下的一个子项目，它的主网站是：http://jakarta.apache.org/tomcat/ ，Tomcat最新版本是Tomcat4.1.27，软件下载的连接是：http://www.apache.org/dist/jakarta/tomcat-4/binaries/ 。 <BR><BR>下载Tomcat既可以直接下载zip包，也可以下载exe安装包（个人建议zip更干净些），不管哪种情况，下载完毕安装好以后（zip直接解压缩就可以了）。需要设置两个环境变量： <BR><BR>JAVA_HOME=C:\j2sdk1.4.2 <BR>CATALINA_HOME=D:\tomcat4 (你的Tomcat安装目录 <BR><BR>这样就安装好了，启动Tomcat运行CATALINA_HOME\bin\startup.bat，关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后，默认使用8080端口，因此可以用浏览器访问http://localhost:8080来测试Tomcat是否正常启动。 <BR><BR>Tomcat提供了两个Web界面的管理工具，URL分别是： <BR>http://localhost:8080/admin/index.jsp <BR>http://localhost:8080/manager/html <BR>在启用这两个管理工具之前，先需要手工配置一下管理员用户和口令。用一个文本工具打开CATALINA_HOME\conf\tomcat-users.xml这个文件，加入如下几行： <BR><BR>&lt;role rolename="manager"/&gt; <BR>&lt;role rolename="admin"/&gt; <BR>&lt;user username="robbin" password="12345678" roles="admin,manager,tomcat"/&gt; <BR><BR>这样用户“robbin”就具备了超级管理员权限。重新启动Tomcat以后，你就可以使用该用户来登陆如上的两个管理工具，通过Web方式进行Tomcat的配置和管理了。 <BR><BR>2、 BEA Weblogic <BR>Weblogic可以到BEA的网站上免费注册之后下载到最新的Weblogic8.1企业版，License可以免费使用1年时间，其实这已经完全足够了。Weblogic的下载连接：http://commerce.bea.com/index.jsp，Weblogic的在线文档：http://edocs.bea.com/ 。 <BR><BR>3、 IBM Webshpere <BR>Websphere同样可以下载到免费的试用版本，到IBM的developerWorks网站可以看到Websphere试用产品的下载和相关的Websphere的资料，developerWorks中文网站的连接是：http://www-900.ibm.com/developerWorks/cn/wsdd/ ，Websphere的下载连接：http://www7b.software.ibm.com/wsdd/downloads/WASsupport.html 。 <BR><BR>4、 Jboss <BR>Jboss是免费开源的App Server，可以免费的从Jboss网站下载：http://www.jboss.org/index.html，然而Jboss的文档是不免费，需要花钱购买，所以为我们学习Jboss设置了一定的障碍。在Jdon上有几篇不错的Jboss配置文档，可以用来参考：http://www.jdon.com/idea.html <BR><BR>四、 Java应用的运行环境 <BR><BR>Java的应用可以简单分为以下几个方面： <BR><BR>1、 Java的桌面应用 <BR>桌面应用一般仅仅需要JRE的支持就足够了。 <BR><BR>2、 Java Web应用 <BR>Java的Web应用至少需要安装JDK和一个web容器（例如Tomcat），以及一个多用户数据库，Web应用至少分为三层： <BR>Browser层：浏览器显示用户页面 <BR>Web层：运行Servlet/JSP <BR>DB层：后端数据库，向Java程序提供数据访问服务 <BR><BR>3、 Java企业级应用 <BR>企业级应用比较复杂，可以扩展到n层，最简单情况会分为4层： <BR>Browser层：浏览器显示用户页面 <BR>Client层：Java客户端图形程序（或者嵌入式设备的程序）直接和Web层或者EJB层交互 <BR>Web层：运行Servlet/JSP <BR>EJB层：运行EJB，完成业务逻辑运算 <BR>DB层：后端数据库，向Java程序提供数据访问服务 <BR><BR>4、 Java嵌入式应用 <BR>Java嵌入式应用是一个方兴未艾的领域，从事嵌入式开发，需要从Sun下载J2ME开发包，J2ME包含了嵌入式设备专用虚拟机KVM，和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。 <BR><BR>Java Learning Path（二）、书籍篇 <BR><BR>学习一门新的知识，不可能指望只看一本，或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。 <BR><BR>在这里我只想补充一点看法，很多人学习Java是从《Thinking in Java》这本书入手的，但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《Thinking in Java》并不是在完整的介绍Java的整个体系，而是一种跳跃式的写作方法，是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。 <BR><BR>对于初学者来说，最好是找一本Java入门的书籍，但是比较完整的循序的介绍Java的语法，面向对象的特性，核心类库等等，在看这本书的同时，可以同步来看《Thinking in Java》，来加深对Java的理解和原理的运用，同时又可以完整的了解Java的整个体系。 <BR><BR>对于Java的入门书籍，蔡学镛推荐的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition（针对C++背景）》，我并没有看过这两本书。其实我觉得电子工业出版社的《Java 2编程详解》或者《Java 2从入门到精通》就很不错。 <BR><BR>在所有的Java书籍当中，其实最最有用的，并不是O'reilly的 Java Serials，真正最最有用处是JDK的Documentation！几乎你想获得的所有的知识在Documentation里面全部都有，其中最主要的部分当然是Java基础类库的API文档，是按照package来组织的，对于每一个class都有详细的解释，它的继承关系，是否实现了某个接口，通常用在哪些场合，还可以查到它所有的public的属性和方法，每个属性的解释，意义，每个方法的用途，调用的参数，参数的意义，返回值的类型，以及方法可能抛出的异常等等。可以这样来说，所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言，和良好的组织方式来介绍Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗，如果你有足够的能力来直接通过Documentation来学习Java的类库，那么基本上就不需要看其他的书籍了。除此之外，Documentation也是编程必备的手册，我的桌面上有三个Documentation的快捷方式，分别是J2SDK1.4.1的Documentation，Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了这个三个Documentation，什么其他的书籍都不需要了。 <BR><BR>对于Java Web 编程来说，最核心的是要熟悉和掌握HTTP协议，这个就和Java无关了，在熟悉HTTP协议之后，就需要熟悉Java的实现HTTP协议的类库，也就是Servlet API，所以最重要的东西就是Servlet API。当然对于初学者而言，直接通过Servlet API来学习Web编程有很大的难度，我推荐O'reilly的《Java Server Pages 》这本书来学习Web 编程。 <BR><BR>EJB的书籍当中，《Enterprise JavaBeans, 2nd Edition》是一本很不错的书， EJB的学习门槛是比较高，入门很难，但是这本书完全降低了学习的难度，特别重要的一点是，EJB的学习需要结合一种App Server的具体实现，所以在学习EJB的同时，必须同步的学习某种App Server，而这本书相关的出了三本书，分别是Weblogic6.1，Websphere4.0和JBoss3.0上面部署书中例子的实做。真是既有理论，又有实践。在学习EJB的同时，可以边看边做，EJB的学习会变得很轻松。 <BR><BR>但是这本书也有一个问题，就是版本比较旧，主要讲EJB1.1规范和部分EJB2.0的规范。而Ed Roman写的《Mastering EJB 2.0》这本书完全是根据EJB2.0规范写的，深入浅出，覆盖了EJB编程的各个方面，并且还有很多编程经验tips，也是学习EJB非常推荐的书籍之一。 <BR><BR>如果是结合Weblogic来学习J2EE的话，《J2EE应用与BEA Weblogic Server》绝对是首选读物，虽然是讲述的Weblogic6.0，仍然值得购买，这本书是BEA官方推荐的教材，作者也是BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署，实践指导意义非常强。 <BR><BR>在掌握了Java平台基础知识和J2EE方面的知识以后，更进一步的是学习如何运用OO的方法进行软件的设计，那么就一定要学习“设计模式”。Sun公司出版了一本《J2EE核心模式》，是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式，是设计师的必读书籍。 <BR><BR>Java Learning Path（三）过程篇 <BR><BR>每个人的学习方法是不同的，一个人的方法不见得适合另一个人，我只能是谈自己的学习方法。因为我学习Java是完全自学的，从来没有问过别人，所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法，只能给大家提供一点参考了。 <BR><BR>学习Java的第一步是安装好JDK，写一个Hello World，? 其实JDK的学习没有那么简单，关于JDK有两个问题是很容易一直困扰Java程序员的地方：一个是CLASSPATH的问题，其实从原理上来说，是要搞清楚JRE的ClassLoader是如何加载Class的；另一个问题是package和import问题，如何来寻找类的路径问题。把这两个问题摸索清楚了，就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》，对这两个问题进行了深入的探讨。 <BR><BR>第二步是学习Java的语法。Java的语法是类C++的，基本上主流的编程语言不是类C，就是类C++的，没有什么新东西，所以语法的学习，大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法，public，protected，private，static，什么时候用，为什么要用，怎么用，这可能需要有人来指点一下，我当初是完全自己琢磨出来的，花了很久的时间。不过后来我看到《Thinking in Java》这本书上面是讲了这些概念的。 <BR><BR>第三步是学习Java的面向对象的编程语言的特性的地方。比如继承，构造器，抽象类，接口，方法的多态，重载，覆盖，Java的异常处理机制。对于一个没有面向对象语言背景的人来说，我觉得这个过程需要花很长很长时间，因为学习Java之前没有C++的经验，只有C的经验，我是大概花了一个月左右吧，才彻底把这些概念都搞清楚，把书上面的例子反复的揣摩，修改，尝试，把那几章内容反复的看过来，看过去，看了不下5遍，才彻底领悟了。不过我想如果有C++经验的话，应该一两天时间足够了。那么在这个过程中，可以多看看《Thinking in Java》这本书，对面向对象的讲解非常透彻。可惜的是我学习的时候，并没有看到这本书，所以自己花了大量的时间，通过自己的尝试和揣摩来学会的。 <BR><BR>第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个，我没有统计过。但是真正对于我们来说最核心的只有4个，分别是 <BR>java.lang.*; <BR>java.io.*; <BR>java.util.*; <BR>java.sql.*; <BR><BR>这四个包的学习，每个包的学习都可以写成一本厚厚的教材，而O'reilly也确实是这样做的。我觉得如果时间比较紧，是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的： <BR>首先要通读整个package的框架，了解整个package的class，interface，exception的构成，最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。 <BR><BR>对包整体框架的把握并不是要熟悉每个类的用法，记住它有哪些属性，方法。想记也记不住的。而是要知道包有哪些方面的类构成的，这些类的用途是什么，最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包，所以不可能详细的介绍每个类的用法，但是我反复强调，我给你们讲这些包的不是要告诉你们类的方法是怎么调用的，也不要求你们记住类的方法调用，而是要你们了解，Java给我们提供了哪些类，每个类是用在什么场合，当我遇到问题的时候，我知道哪个类，或者哪几个类的组合可以解决我的问题，That'all！，当我们具体写程序的时候，只要你知道该用哪个类来完成你的工作就足够了。编码的时候，具体的方法调用，是边写代码，边查Documentation，所有的东西都在Documentation里面，不要求你一定记住，实际你也记不住3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。 <BR><BR>第五步，通过上面的学习，如果学的比较扎实的话，就打好了Java的基础了，剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步，Java的自学能力已经被培养出来了，可以到了直接学习Documentation的水平了。除了要做GUI编程之外，JDK里面其他会有用处的包是这些： <BR>java.text.*; <BR>java.net.*; <BR>javax.naming.*; <BR>这些包里面真正用的比较多的类其实很少，只有几个，所以不需要花很多时间。 <BR><BR>第六步，Java Web 编程，Web编程的核心是HTTP协议，HTTP协议和Java无关，如果不熟悉HTTP协议的话，虽然也可以学好Servlet/JSP编程，但是达不到举一反三，一通百通的境界。所以HTTP协议的学习是必备的。如果熟悉了HTTP协议的话，又有了Java编程的良好的基础，学习Servlet/JSP简直易如反掌，我学习Servlet/JSP就用了不到一周的时间，然后就开始用JSP来做项目了。 <BR><BR>在Servlet/JSP的学习中，重头仍然是Servlet Documentation。Servlet API最常用的类很少，花比较少的时间就可以掌握了。把这些类都看一遍，多写几个例子试试。Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在Web Server和Brower之间交谈。另外对JSP，还需要熟悉几个常用JSP的标记，具体的写法记不住的话，临时查就是了。 <BR><BR>此外Java Web编程学习的重点要放在Web Application的设计模式上，如何进行业务逻辑的分析，并且进行合理的设计，按照MVC设计模式的要求，运用Servlet和JSP分别完成不同的逻辑层，掌握如何在Servlet和JSP之间进行流程的控制和数据的共享，以及Web Application应该如何配置和部署。 <BR><BR>第七步，J2EE编程 <BR>以上的学习过程如果是比较顺利的话，进行到这一步，难度又陡然提高。因为上面的知识内容都是只涉及一个方面，而像EJB，JMS，JTA等核心的J2EE规范往往是几种Java技术的综合运用的结晶，所以掌握起来难度比较大。 <BR><BR>首先一定要学习好JNDI，JNDI是App Server定位服务器资源（EJB组件，Datasouce，JMS）查找方法，如果对JNDI不熟悉的话，EJB，JMS这些东西几乎学不下去。JNDI其实就是javax.naming.*这个包，运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置，就需要看看专门的文档规范了，比如web.xml的写法，ejb-jar.xml的写法等等。针对每种不同的App Server，还有自己的服务资源配置文件，也是需要熟悉的。 <BR><BR>然后可以学习JTA，主要是要理解JTA对于事务的控制的方法，以及该在什么场合使用JTA。这里可以简单的举个例子，我们知道一般情况可以对于一个数据库连接进行事务控制(conn.setAutoCommit(false),....,conn.commit())，做为一个原子操作，但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作，你能做的到吗？这时候只能用JTA了。假设操作过程是先往A数据库插一条记录，然后删除B数据库另一个记录，我们自己写代码是控制不了把整个操作做为一个原子操作的。用JTA的话，由App Server来完成控制。 <BR><BR>在学习EJB之前要学习对象序列化和RMI，RMI是EJB的基础。接着学习JMS和EJB，对于EJB来说，最关键是要理解EJB是如何通过RMI来实现对远端对象的调用的，以及在什么情况下要用到EJB。 <BR><BR>在学习完EJB，JMS这些东西之后，你可能会意识到要急不可待学习两个领域的知识，一个是UML，另一个是Design Pattern。Java企业软件的设计非常重视框架(Framework)的设计，一个好的软件框架是软件开发成功的必要条件。在这个时候，应该开始把学习的重点放在设计模式和框架的学习上，通过学习和实际的编程经验来掌握EJB的设计模式和J2EE的核心模式。 <BR><BR>J2EE规范里面，除了EJB，JMS，JTA，Servlet/JSP，JDBC之外还有很多很多的企业技术，这里不一一进行介绍了。 <BR><BR>另外还有一个最新领域Web Services。Web Services也完全没有任何新东西，它像是一种黏合剂，可以把不同的服务统一起来提供一个统一的调用接口，作为使用者来说，我只要获得服务提供者给我的WSDL（对服务的描述），就够了，我完全不知道服务器提供者提供的服务究竟是EJB组件，还是.Net组件，还是什么CORBA组件，还是其他的什么实现，我也不需要知道。Web Services最伟大的地方就在于通过统一的服务提供方式和调用方式，实现了整个Internet服务的共享，是一个非常令人激动的技术领域。Web Services好像目前还没有什么很好的书籍，但是可以通过在网络上面查资料的方式来学习。 <BR><BR>Java Learning Path（四） 方法篇 <BR><BR>Java作为一门编程语言，最好的学习方法就是写代码。当你学习一个类以后，你就可以自己写个简单的例子程序来运行一下，看看有什么结果，然后再多调用几个类的方法，看看运行结果，这样非常直观的把类给学会了，而且记忆非常深刻。然后不应该满足把代码调通，你应该想想看如果我不这样写，换个方式，再试试行不行。记得哪个高人说过学习编程就是个破坏的过程，把书上的例子，自己学习Documentation编写的例子在运行通过以后，不断的尝试着用不同的方法实现，不断的尝试破坏代码的结构，看看它会有什么结果。通过这样的方式，你会很彻底的很精通的掌握Java。 <BR><BR>举个例子，我们都编过Hello World <BR><BR><BR>public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); }} <BR><BR><BR>很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args)，能不能不这样写？包括我刚学习Java的时候也有这样的疑问。想知道答案吗？很简单，你把main改个名字运行一下，看看报什么错误，然后根据出错信息进行分析；把main的public取掉，在试试看，报什么错误；static去掉还能不能运行；不知道main方法是否一定要传一个String[]数组的，把String[]改掉，改成int[]，或者String试试看；不知道是否必须写args参数名称的，也可以把args改成别的名字，看看运行结果如何。 <BR><BR>我当初学习Java的时候就是这样做的，把Hello World程序反复改了七八次，不断运行，分析运行结果，最后就彻底明白为什么了main方法是这样定义的了。 <BR><BR>此外，我对于staic，public，private，Exception，try{ }catch {}finally{}等等等等一开始都不是很懂，都是把参考书上面的例子运行成功，然后就开始破坏它，不断的根据自己心里面的疑问来重新改写程序，看看能不能运行，运行出来是个什么样子，是否可以得到预期的结果。这样虽然比较费时间，不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行，看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。 <BR><BR>其中特别值得一提的是JDK有一个非常棒的调试功能，-verbose <BR>java –verbose <BR>javac –verbose 以及其它很多JDK工具都有这个选项 <BR>-verbose 可以显示在命令执行的过程中，JVM都依次加载哪里Class，通过这些宝贵的调试信息，可以帮助我们分析出JVM在执行的过程中都干了些什么。 <BR><BR>另外，自己在学习过程中，写的很多的这种破坏例程，应该有意识的分门别类的保存下来，在工作中积累的典型例程也应该定期整理，日积月累，自己就有了一个代码库了。遇到类似的问题，到代码库里面 Copy &amp; Paste ，Search &amp; Replace，就好了，极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层，形成一个通用的类库，封装好。那么可复用性就更强了。 <BR><BR>所以我觉得其实不是特别需要例程的，自己写的破坏例程就是最好的例子，如果你实在对自己写的代码不放心的话，我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个src.zip，解开来就可以完整的看到整个JDK基础类库，也就是rt.jar的Java源代码，你可以参考一下Sun是怎么写Java程序的，规范是什么样子的。我自己在学习Java的类库的时候，当有些地方理解的不是很清楚的时候，或者想更加清晰的理解运作的细节的时候，往往会打开相应的类的源代码，通过看源代码，所有的问题都会一扫而空。 <BR><BR>Java Learning Path（五）资源篇 <BR><BR>1、 http://java.sun.com/ (英文) <BR>Sun的Java网站，是一个应该经常去看的地方。不用多说。 <BR><BR>2、http://www-900.ibm.com/developerWorks/cn/ <BR>IBM的developerWorks网站，英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站，也是Web Services，Java，Linux极好的网站。强烈推荐！！！ <BR><BR>3、http://www.javaworld.com/ (英文) <BR>关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用，这里比较好。 <BR><BR>4、http://dev2dev.bea.com.cn/index.jsp <BR>BEA的开发者园地，BEA作为最重要的App Server厂商，有很多独到的技术，在Weblogic上做开发的朋友不容错过。 <BR><BR>5、http://www.huihoo.com/ <BR>灰狐动力网站，一个专业的中间件网站，虽然不是专业的Java网站，但是在J2EE企业应用技术方面有深厚的造诣。 <BR><BR>6、http://www.theserverside.com/ (英文) <BR>TheServerSide是一个著名的专门面向Java Server端应用的网站。 <BR><BR>7、http://www.javaresearch.org/ <BR>Java研究组织，有很多优秀的Java方面的文章和教程，特别是在JDO方面的文章比较丰富。 <BR><BR>8、http://www.cnjsp.org/ <BR>JSP技术网站，有相当多的Java方面的文章和资源。 <BR><BR>9、http://www.jdon.com/ <BR>Jdon论坛，是一个个人性质的中文J2EE专业技术论坛，在众多的Java的中文论坛中，Jdon一个是技术含量非常高，帖子质量非常好的论坛。 <BR><BR>10、http://sourceforge.net/ <BR>SourgeForge是一个开放源代码软件的大本营，其中也有非常非常丰富的Java的开放源代码的著名的软件。]]></description>
</item><item>
<title><![CDATA[[C++基础]重载、覆盖、多态与函数隐藏(3)]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=pudding009&amp;id=12973</link>
<author>pudding009</author>
<pubDate>2006/3/28 16:01:03</pubDate>
<description><![CDATA[<SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">例8-2</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"> 
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">#include &lt;iostream&gt; <BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">using namespace std;<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">class Base{<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">public:<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><STRONG>virtual</STRONG> void fun(int i){ cout &lt;&lt;"Base::fun(int i)"&lt;&lt; endl; }<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">};</SPAN></P></SPAN>
<DIV id=content>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">class Derive : public Base{<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">public:<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>&nbsp;&nbsp;&nbsp;&nbsp; </STRONG></SPAN><STRONG>void fun(int i){ cout &lt;&lt;"Derive::fun(int i)"&lt;&lt; endl; }</STRONG></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>void fun(<STRONG>double</STRONG> <STRONG>d</STRONG>){ cout &lt;&lt;"Derive::fun(double d)"&lt;&lt; endl; }<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">}; 
<P></P></SPAN>
<P></P>
<P></P>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"></P></SPAN>
<P></P>
<P>&nbsp;<SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">int main()<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">{<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Base *pb = new Derive();<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>pb-&gt;fun(1);//<STRONG>Derive::fun(int i)<BR></STRONG></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>pb-&gt;fun((double)0.01);//<STRONG>Derive::fun(int i)<BR></STRONG></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>delete pb;<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return 0;<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">}</SPAN><FONT face=宋体>&nbsp;</FONT></P><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">例</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">9<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">#include &lt;iostream&gt; <BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">using namespace std;<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><BR>class Base{<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">public:<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><STRONG>virtual</STRONG> void fun(int i){ cout &lt;&lt;"Base::fun(int i)"&lt;&lt; endl; }<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">};<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">class Derive : public Base{<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">public:<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>void fun(int i){ cout &lt;&lt;"Derive::fun(int i)"&lt;&lt; endl; }<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>void fun(char c){ cout &lt;&lt;"Derive::fun(char c)"&lt;&lt; endl; }<SPAN style="mso-tab-count: 1">&nbsp;&nbsp;<BR></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>void fun(double d){ cout &lt;&lt;"Derive::fun(double d)"&lt;&lt; endl; }<SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">};<BR><BR></SPAN></P></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">#include &lt;iostream&gt; <BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">using namespace std;<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><BR>class Base{<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">public:<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><STRONG>virtual</STRONG> void fun(int i){ cout &lt;&lt;"Base::fun(int i)"&lt;&lt; endl; }<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">};<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">class Derive : public Base{<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">public:<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>void fun(int i){ cout &lt;&lt;"Derive::fun(int i)"&lt;&lt; endl; }<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>void fun(char c){ cout &lt;&lt;"Derive::fun(char c)"&lt;&lt; endl; }<SPAN style="mso-tab-count: 1">&nbsp;&nbsp;<BR></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>void fun(double d){ cout &lt;&lt;"Derive::fun(double d)"&lt;&lt; endl; }<SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">};<BR><BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">int main()<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">{<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Base *pb = new Derive();</SPAN><FONT face="宋体, MS Song" size=3> </FONT>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>pb-&gt;fun(1);//<B>Derive::fun(int i)<BR></B></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>pb-&gt;fun('a');//<B><FONT color=#ff0000>Derive::fun(int i)<BR></FONT></B></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>pb-&gt;fun((double)0.01);//<B><FONT color=#ff0000>Derive::fun(int i)</FONT></B></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">&nbsp; 
<P></P></SPAN>
<P></P>
<P></P>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>Derive *pd =new Derive();<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">pd-&gt;fun(1);//<B>Derive::fun(int i)</B></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">overload</SPAN> 
<P></P></STRONG></SPAN>
<P></P>
<P></P>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>pd-&gt;fun('a');//<B>Derive::fun(char c)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">overload</SPAN></STRONG></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>pd-&gt;fun(0.01);//<B>Derive::fun(double d)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </B></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">&nbsp;<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>delete pb;<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>delete pd;<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return 0;<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">}</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3></FONT></SPAN>&nbsp;<BR><SPAN lang=EN-US><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">例</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">7-1</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">和例</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">8-1</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">很好理解，我把这两个例子放在这里，是让大家作一个比较摆了，也是为了帮助大家更好的理解：<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">n<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">例</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">7-1</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">中，派生类没有覆盖基类的虚函数，此时派生类的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">vtable</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">中的函数指针指向的地址就是基类的虚函数地址。<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">n<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">例</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">8-1</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">中，派生类覆盖了基类的虚函数，此时派生类的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">vtable</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">中的函数指针指向的地址就是派生类自己的重写的虚函数地址。<BR></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">在例</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">7-2</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">8-2</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">看起来有点怪怪，其实，你按照上面的原则对比一下，答案也是明朗的：<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">n<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">例</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">7-2</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">中，我们为派生类重载了一个函数版本：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto">void fun(<STRONG><SPAN style="FONT-WEIGHT: normal; FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">double d</SPAN></STRONG>)</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"> <SPAN style="mso-spacerun: yes">&nbsp;</SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">其实，这只是一个障眼法。我们具体来分析一下，基类共有几个函数，派生类共有几个函数：</SPAN> 
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">
<TABLE class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR style="mso-yfti-irow: 0">
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: gray; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 50.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt" vAlign=top width=67>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">类型</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"> 
<P></P></SPAN>
<P></P>
<P></P>
<P></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #ece9d8; BACKGROUND: gray; PADDING-BOTTOM: 0cm; WIDTH: 180pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=240>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">基类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"> 
<P></P></SPAN>
<P></P>
<P></P>
<P></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #ece9d8; BACKGROUND: gray; PADDING-BOTTOM: 0cm; WIDTH: 195.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=261>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">派生类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"> 
<P></P></SPAN>
<P></P>
<P></P>
<P></P></TD></TR>
<TR style="mso-yfti-irow: 1">
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 50.4pt; BORDER-TOP-COLOR: #ece9d8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" width=67>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">Vtable</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">部分</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"> 
<P></P></SPAN>
<P></P>
<P></P>
<P></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #ece9d8; PADDING-BOTTOM: 0cm; WIDTH: 180pt; BORDER-TOP-COLOR: #ece9d8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=240>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">void fun(<STRONG><SPAN style="FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'">int</SPAN></STRONG> <STRONG><SPAN style="FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'">i</SPAN></STRONG>)</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #ece9d8; PADDING-BOTTOM: 0cm; WIDTH: 195.7pt; BORDER-TOP-COLOR: #ece9d8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=261>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">指向基类版的虚函数</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">void fun(<STRONG><SPAN style="FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'">int</SPAN></STRONG> <STRONG><SPAN style="FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'">i</SPAN></STRONG>)</SPAN></P></TD></TR>
<TR style="HEIGHT: 33.15pt; mso-yfti-irow: 2; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 50.4pt; BORDER-TOP-COLOR: #ece9d8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 33.15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" width=67>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">静态部分</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #ece9d8; PADDING-BOTTOM: 0cm; WIDTH: 180pt; BORDER-TOP-COLOR: #ece9d8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 33.15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=240>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>
<P><FONT face="Times New Roman" color=#000000 size=3>&nbsp;</FONT></P></SPAN>
<P></P>
<P><FONT face="Times New Roman" color=#000000 size=3>&nbsp;</FONT></P>
<P></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #ece9d8; PADDING-BOTTOM: 0cm; WIDTH: 195.7pt; BORDER-TOP-COLOR: #ece9d8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 33.15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=261>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">void fun(<STRONG><SPAN style="FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'">double d</SPAN></STRONG>)</SPAN></P></TD></TR></TBODY></TABLE></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%; TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 0pt"></SPAN>&nbsp;<BR><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-font-kerning: 0pt">我们再来分析一下以下三句代码<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">Base *pb = new Derive();<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">pb-&gt;fun(1);//<B>Base::fun(int i)<BR></B></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">pb-&gt;fun((double)0.01);//<B>Base::fun(int i)</B></SPAN>&nbsp;</P>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">这第一句是关键，基类指针指向派生类的对象，我们知道这是多态调用；接下来第二句，运行时基类指针根据运行时对象的类型，发现是派生类对象，所以首先到派生类的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">vtable</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">中去查找派生类的虚函数版本，发现派生类没有覆盖基类的虚函数，派生类的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">vtable</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">只是作了一个指向基类虚函数地址的一个指向，所以理所当然地去调用基类版本的虚函数。最后一句，程序运行仍然埋头去找派生类的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">vtable</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">，发现根本没有这个版本的虚函数，只好回头调用自己的仅有一个虚函数。<BR></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">这里还值得一提的是：如果此时基类有多个虚函数，此时程序编绎时会提示</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">”</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">调用不明确</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">”</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">。示例如下<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">#include &lt;iostream&gt; <BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">using namespace std;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">&nbsp;</SPAN></P>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">class Base{<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">public:<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>virtual void fun(int i){ cout &lt;&lt;"Base::fun(int i)"&lt;&lt; endl; }<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>virtual void fun(char c){ cout &lt;&lt;"Base::fun(char c)"&lt;&lt; endl; }<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">};</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"></SPAN></P>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">class Derive : public Base{<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">public:<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>void fun(double d){ cout &lt;&lt;"Derive::fun(double d)"&lt;&lt; endl; }<SPAN style="mso-spacerun: yes">&nbsp; <BR></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">}; 
<P></P></SPAN>
<P></P>
<P></P>
<P></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">
<P>&nbsp;<SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">int main()<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">{<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Base *pb = new Derive();<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>pb-&gt;fun(0.01);//</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">error C2668: 'fun' : ambiguous call to overloaded function<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>delete pb;<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return 0;<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">}<BR></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">好了，我们再来分析一下例</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">8-2</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">。<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">n<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">例8</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">-2</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">中，我们也为派生类重载了一个函数版本：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto">void fun(<STRONG><SPAN style="FONT-WEIGHT: normal; FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">double d</SPAN></STRONG>)</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"> <SPAN style="mso-spacerun: yes">&nbsp;</SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">，同时覆盖了基类的虚函数，我们再来具体来分析一下，基类共有几个函数，派生类共有几个函数：</SPAN></P></SPAN>
<P></P>
<P>&nbsp;<SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">int main()<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">{<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Base *pb = new Derive();<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>pb-&gt;fun(0.01);//</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: red; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">error C2668: 'fun' : ambiguous call to overloaded function<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>delete pb;<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>return 0;<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">}<BR></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">好了，我们再来分析一下例</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">8-2</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">。<BR></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">n<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">例8</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">-2</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">中，我们也为派生类重载了一个函数版本：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-shading: white; mso-pattern: gray-15 auto">void fun(<STRONG><SPAN style="FONT-WEIGHT: normal; FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">double d</SPAN></STRONG>)</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"> <SPAN style="mso-spacerun: yes">&nbsp;</SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">，同时覆盖了基类的虚函数，我们再来具体来分析一下，基类共有几个函数，派生类共有几个函数：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">
<TABLE class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR style="mso-yfti-irow: 0">
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: gray; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 50.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt" vAlign=top width=67>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">类型</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #ece9d8; BACKGROUND: gray; PADDING-BOTTOM: 0cm; WIDTH: 180pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=240>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">基类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"> 
<P></P></SPAN>
<P></P>
<P></P>
<P></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #ece9d8; BACKGROUND: gray; PADDING-BOTTOM: 0cm; WIDTH: 195.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=261>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">派生类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"> 
<P></P></SPAN>
<P></P>
<P></P>
<P></P></TD></TR>
<TR style="mso-yfti-irow: 1">
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 50.4pt; BORDER-TOP-COLOR: #ece9d8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" width=67>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">Vtable</SPAN><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">部分</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'"> 
<P></P></SPAN>
<P></P>
<P></P>
<P></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #ece9d8; PADDING-BOTTOM: 0cm; WIDTH: 180pt; BORDER-TOP-COLOR: #ece9d8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=240>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">void fun(<STRONG><SPAN style="FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'">int</SPAN></STRONG> <STRONG><SPAN style="FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'">i</SPAN></STRONG>)</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #ece9d8; PADDING-BOTTOM: 0cm; WIDTH: 195.7pt; BORDER-TOP-COLOR: #ece9d8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=261>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'">void fun(<STRONG><SPAN style="FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'">int</SPAN></STRONG> <STRONG><SPAN style="FONT-FAMILY: Arial; mso-bidi-font-family: 'Times New Roman'">i</SPAN></STRONG>)</SPAN></P></TD></TR>
<TR style="HEIGHT: 33.15pt; mso-yfti-irow: 2; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 50.4pt; BORDER-TOP-COLOR: #ece9d8; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 33.15pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" width=67>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN style="FONT-SIZE: 9pt; COLOR: #333333; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">静态部分</S]]></description>
</item>
</channel>
</rss>