??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲中文字幕无码一久久区,久久本道综合久久伊人,国产精品对白刺激久久久http://www.shnenglu.com/yunduan5158/Life was like a box of chocolates. You never know what you're gonna get.zh-cnWed, 07 May 2025 18:43:16 GMTWed, 07 May 2025 18:43:16 GMT60提高p听力的好地方http://www.shnenglu.com/yunduan5158/archive/2006/07/20/10273.htmlMerlinMerlinThu, 20 Jul 2006 14:06:00 GMThttp://www.shnenglu.com/yunduan5158/archive/2006/07/20/10273.htmlhttp://www.shnenglu.com/yunduan5158/comments/10273.htmlhttp://www.shnenglu.com/yunduan5158/archive/2006/07/20/10273.html#Feedback0http://www.shnenglu.com/yunduan5158/comments/commentRss/10273.htmlhttp://www.shnenglu.com/yunduan5158/services/trackbacks/10273.htmlhttp://www.putclub.com/index.php

Merlin 2006-07-20 22:06 发表评论
]]>
[转]developerWorksQJava 技术:重锤痛击 RobocodeQ?/title><link>http://www.shnenglu.com/yunduan5158/archive/2006/07/19/10235.html</link><dc:creator>Merlin</dc:creator><author>Merlin</author><pubDate>Wed, 19 Jul 2006 12:55:00 GMT</pubDate><guid>http://www.shnenglu.com/yunduan5158/archive/2006/07/19/10235.html</guid><wfw:comment>http://www.shnenglu.com/yunduan5158/comments/10235.html</wfw:comment><comments>http://www.shnenglu.com/yunduan5158/archive/2006/07/19/10235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yunduan5158/comments/commentRss/10235.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yunduan5158/services/trackbacks/10235.html</trackback:ping><description><![CDATA[ <blockquote> <font face="Arial" color="#000080" size="2">有可能在闪躲炮弹和执行精攻ȝ演练中学会ѝ多态性、事件处理以及内部类q些内容吗?Robocode q个游戏卛_为全世界?Java 开发者实现这个愿望,它把游戏风潮变成了教学工PZ对它的上瘄度o人吃惊。请跟随 Sing Li 一h?RobocodeQ同时着手徏造属于自q、定制的、小而精悍的战斗机器?/font> </blockquote> <!--START RESERVED FOR FUTURE USE INCLUDE FILES--> <!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!--END RESERVED FOR FUTURE USE INCLUDE FILES--> <p> <font face="Arial" color="#000080" size="2">Robocode 是一个很Ҏ使用的机器h战斗仿真器,可以在所有支?Java 2 的^Cq行。您创徏一个机器hQ把它放到战ZQ然后让它同其他开发者们创徏的机器hҎ拼死战斗到底。Robocode 里有一些预先做好的机器人对手让你入门,但一旦您不再需要它们,可以把您自己创建的机器人加入到正在世界范围内Ş成的某个联盟里去和世界最强手寚w?/font> </p> <p> <font face="Arial" color="#000080" size="2">每个 Robocode 参加者都要利?Java 语言元素创徏他或她的机器人,q样׃从初学者到高黑客的广大开发者都可以参与q一׃zd。初U的 Java 的开发者们可以学习一些基知识Q调?API 代码、阅?Javadoc、ѝ内部类、事件处理等{。高U开发者们可以在构建“最优品U”的软g机器人全球竞赛中提高他们的编E技巧。在本文中,我们介l?RobocodeQƈ指导您从构徏您^生第一?Robocode 机器人开始征服世界。我们还看一下迷人的“后台”机Ӟ正是它?Robocode 起作用?/font> </p> <p> <a name="1"> <span id="cinpdbh" class="atitle"> <font face="Arial" color="#000080" size="2">下蝲q安?Robocode</font> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">Robocode ?Mathew Nelson 的智慧之作,他是 IBM Internet 部门 Advanced Technology 的Y件工E师。请首先讉K IBM alphaWorks </font> <a > <font face="Arial" color="#000080" size="2">Robocode</font> </a> <font face="Arial" color="#000080" size="2">面。在q个面上,您可以找?Robocode pȝ最新的可执行文件。这个分发包是一个自包含的安装文Ӟ在下载该分发包之后,您就可以使用下面的命令行在您的系l上安装q个软g包(当然Q我们假定您的机器上已经预安装了 Java VMQJDK 1.3.xQ)Q?/font> <font face="Arial" color="#000080" size="2"> <code class="section"> <br /> <br /> </code> <font face="Courier New">java -jar robocode-setup.jar<br /></font> <br /> 在安装过E中QRobocode 问您是否要使用q个外部?Java VM 来编译机器h。您也可以选择使用作ؓ Robocode 分发包一部分而提供的 Jikes ~译器?/font> </p> <p> <font face="Arial" color="#000080" size="2">安装完成后,您可以通过 shell 脚本Qrobocode.shQ、批处理文gQrobocode.batQ或桌面上的图标来启?Robocode pȝ。此Ӟ战场会出现。在此,您可以通过菜单调用 Robot Editor ?compiler?/font> </p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <font face="Arial" color="#000080" size="2"> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </font> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <font face="Arial" color="#000080" size="2"> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> </font> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <font face="Arial" color="#000080" size="2"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </font> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font face="Arial" color="#000080" size="2">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="2"> <span id="lbnwzgy" class="atitle"> <font face="Arial" color="#000080" size="2">Robocode pȝlg</font> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">当您Ȁz?Robocode Ӟ看C个相关的 GUI H口Q这两个H口构成?Robocode ?IDEQ?/font> </p> <ul> <li> <font face="Arial" color="#000080" size="2">战场 </font> </li> <li> <font face="Arial" color="#000080" size="2">Robot Editor </font> </li> </ul> <p> <font face="Arial" color="#000080" size="2">?1 展示了处于工作状态的战场?Robot Editor?/font> </p> <br /> <a name="figure1"> <b> <font face="Arial" color="#000080" size="2">?1. Robocode IDE</font> </b> </a> <br /> <font face="Arial" color="#000080" size="2"> <img height="509" alt="Robocode IDE" src="http://www-128.ibm.com/developerworks/cn/java/j-robocode/fig1.gif" width="600" /> <br /> </font> <p> <font face="Arial" color="#000080" size="2">战场是机器h之间q行战斗直至分出胜负的场地。主要的仿真引擎被置于其中,q且允许您在q里创徏战斗、保存战斗以及打开新徏的或现有的战斗。通过界面区域内的控gQ您可以暂停或l战斗、终止战斗、消灭Q何机器h个体或获取Q何机器h的统计数据。此外,您可以在此屏q上Ȁz?Robot Editor?/font> </p> <p> <font face="Arial" color="#000080" size="2">Robot Editor 是一个定制的文本~辑器,它可以用于编辑生成机器h?Java 源文件。在它的菜单里集成了 Java ~译器(用于~译机器Z码)以及定制?Robot 打包器。由 Robot Editor 创徏q成功编译的所有机器h都会处于战场上一个部|就l的位置?/font> </p> <p> <font face="Arial" color="#000080" size="2">Robocode 里的每个机器人都׃个或多个 Java cL成。这些类可以被压~成一?JAR 包。ؓ此,Robocode 的最新版本提供了一个可以在战场 GUI H口中激zȝ“Robot Packager”?/font> </p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <font face="Arial" color="#000080" size="2"> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </font> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <font face="Arial" color="#000080" size="2"> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> </font> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <font face="Arial" color="#000080" size="2"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </font> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font face="Arial" color="#000080" size="2">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="3"> <span id="ozthaqf" class="atitle"> <font face="Arial" color="#000080" size="2">?Robocode 机器人的详细分析</font> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">在写q篇文章ӞRobocode 机器人是一个图形化的坦克。图 2 是一个典型的 Robocode 机器人的图解?/font> </p> <br /> <a name="figure2"> <b> <font face="Arial" color="#000080" size="2">?2. ?Robocode 机器人的详细分析</font> </b> </a> <br /> <font face="Arial" color="#000080" size="2"> <img height="209" alt="Robocode 机器? src="http://www-128.ibm.com/developerworks/cn/java/j-robocode/fig2.gif" width="240" /> <br /> </font> <p> <font face="Arial" color="#000080" size="2">h意,机器人有一门可以旋转的炮,炮上面的雯也是可以旋{的。机器h坦克车(VehicleQ、炮QGunQ以及雷达(RadarQ都可以单独旋{Q也是_在Q何时刻,机器人坦克R、炮以及雯都可以{向不同的方向。缺省情况下Q这些方向是一致的Q都指向坦克车运动的方向?/font> </p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <font face="Arial" color="#000080" size="2"> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </font> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <font face="Arial" color="#000080" size="2"> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> </font> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <font face="Arial" color="#000080" size="2"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </font> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font face="Arial" color="#000080" size="2">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="4"> <span id="xbxbbjr" class="atitle"> <font face="Arial" color="#000080" size="2">Robot 命o</font> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">Robocode 机器人的命o集都收录?Robocode API Javadoc 中。您会发现q些命o都是 <code>robocode.Robot</code> cȝ公共Ҏ。在q一部分Q我们将分类讨论每个可用的命令?</font> </p> <p> <a name="N100C3"> <span id="iteeeuz" class="smalltitle"> <strong> <font face="Arial" color="#000080" size="2">Ud机器人、炮和雷?/font> </strong> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">让我们从Ud机器人及其装备的基本命o开始:</font> </p> <ul> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>turnRight(double degree)</code> ?<code>turnLeft(double degree)</code> 使机器h转过一个指定的角度?<br /></font> </font> </font> </li> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>ahead(double distance)</code> ?<code>back(double distance)</code> 使机器hUd指定的像素点距离Q这两个Ҏ在机器h到墙或另外一个机器h时即告完成?<br /></font> </font> </font> </li> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>turnGunRight(double degree)</code> ?<code>turnGunLeft(double degree)</code> 使炮可以独立于坦克R的方向{动?<br /></font> </font> </font> </li> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>turnRadarRight(double degree)</code> ?<code>turnRadarLeft(double degree)</code> 使炮上面的雷达{动,转动的方向也独立于炮的方向(以及坦克车的方向Q?</font> </font> </font> </li> </ul> <p> <font face="Arial" color="#000080" size="2">q些命o都是在执行完毕后才把控制权交q给E序。此外,转动坦克车的时候,除非通过调用下列Ҏ分别指明炮(和雷达)的方向,否则炮(和雷达)的指向也移动?/font> </p> <ul> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>setAdjustGunForRobotTurn(boolean flag)</code> Q如?flag 被设|成 trueQ那么坦克R转动Ӟ炮保持原来的方向?<br /></font> </font> </font> </li> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>setAdjustRadarForRobotTurn(boolean flag)</code> Q如?flag 被设|成 trueQ那么坦克RQ和炮)转动Ӟ雯会保持原来的方向?<br /></font> </font> </font> </li> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>setAdjustRadarForGunTurn(boolean flag)</code> Q如?flag 被设|成 trueQ那么炮转动Ӟ雯会保持原来的方向。而且Q它执行的动作如同调用了 <code>setAdjustRadarForRobotTurn(true)</code> ?</font> </font> </font> </li> </ul> <p> <a name="N10124"> <span id="emtxqdn" class="smalltitle"> <strong> <font face="Arial" color="#000080" size="2">获取关于机器人的信息</font> </strong> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">有许多方法可以得到关于机器h的信息。下面简单列举了常用的方法调用:</font> </p> <ul> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>getX()</code> ?<code>getY()</code> 可以捕捉到机器h当前的坐标?<br /></font> </font> </font> </li> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>getHeading()</code> ?<code>getGunHeading()</code> ?<code>getRadarHeading()</code> 可以得出坦克车、炮或雷辑ֽ前的方向Q该方向是以角度表示的?<br /></font> </font> </font> </li> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>getBattleFieldWidth()</code> ?<code>getBattleFieldHeight()</code> 可以得到当前q一回合的战场尺寸?</font> </font> </font> </li> </ul> <p> <a name="N10159"> <span id="tqufqqg" class="smalltitle"> <strong> <font face="Arial" color="#000080" size="2">击命o</font> </strong> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">一旦您掌握了移动机器h以及相关的武器装备的ҎQ您p考虑击和控制损害的d了。每个机器h在开始时都有一个缺省的“能量别”,当它的能量别减到零的时候,我们p个机器h已经被消灭了。射ȝ时候,机器人最多可以用掉三个能量单位。提供给炮弹的能量越多,对目标机器h所造成的损害也p大?<code>fire(double power)</code> ?<code>fireBullet(double power)</code> 用来发射指定能量Q火力)的炮式V调用的 <code>fireBullet()</code> 版本q回 <code>robocode.Bullet</code> 对象的一个引用,该引用可以用于高U机器h?</font> </p> <p> <a name="N10172"> <span id="xuyngwx" class="smalltitle"> <strong> <font face="Arial" color="#000080" size="2">事g</font> </strong> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">每当机器人在Ud或{动时Q雷达一直处于激zȝ态,如果雯到有机器h在它的范围内Q就会触发一个事件。作为机器h创徏者,您有权选择处理可能在战斗中发生的各cM件。基本的 <code>Robot</code> cM包括了所有这些事件的~省处理E序。但是,您可以覆盖其中Q何一个“什么也不做的”缺省处理程序,然后实现您自q定制行ؓ。下面是一些较为常用的事gQ?</font> </p> <ul> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>ScannedRobotEvent</code> 。通过覆盖 <code>onScannedRobot()</code> Ҏ来处?<code>ScannedRobotEvent</code> Q当雯到机器人时Q就调用该方法?<br /></font> </font> </font> </li> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>HitByBulletEvent</code> 。通过覆盖 <code>onHitByBullet()</code> Ҏ来处?<code>HitByBulletEvent</code> Q当机器炮弹MӞp用该Ҏ?<br /></font> </font> </font> </li> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>HitRobotEvent</code> 。通过覆盖 <code>onHitRobot()</code> Ҏ来处?<code>HitRobotEvent</code> Q当您的机器人击中另外一个机器hӞp用该Ҏ?<br /></font> </font> </font> </li> <li> <font face="Arial"> <font size="2"> <font color="#000080"> <code>HitWallEvent</code> 。通过覆盖 <code>onHitWall()</code> Ҏ来处?<code>HitWallEvent</code> Q当您的机器人撞到墙Ӟp用该Ҏ?</font> </font> </font> </li> </ul> <p> <font face="Arial" color="#000080" size="2">我们只需要知道这些就可以创徏一些相当复杂的机器Z。您可以通过战场的帮助菜单或 Robot Editor 的帮助菜单访?Javadoc 中其余的 Robocode API?/font> </p> <p> <font face="Arial" color="#000080" size="2">现在Q我们该把学到的知识付诸实践了?/font> </p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <font face="Arial" color="#000080" size="2"> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </font> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <font face="Arial" color="#000080" size="2"> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> </font> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <font face="Arial" color="#000080" size="2"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </font> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font face="Arial" color="#000080" size="2">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="5"> <span id="spxiemu" class="atitle"> <font face="Arial" color="#000080" size="2">创徏机器?/font> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">要创Z个新的机器hQ请启动 Robot Editor q择 <b>File</b>-> <b>New</b>-> <b>Robot</b>。系l将会提C您输入机器人的名称Q这个名U将成ؓ Java cd。请您在提示W处输入 <b>DWStraight</b>。接下来Q系l还会提C您输入一个独一无二的包前缀Q它用作存放机器hQ还可能有相关的 Java 文gQ的包的名称。请在该提示W处输入 <b>dw</b>?</font> </p> <p> <font face="Arial" color="#000080" size="2">Robot Editor ׃昄您要控制q个机器人需要编写的 Java 代码。清?1 是您会看到的代码的一个示例:</font> </p> <br /> <a name="code1"> <b> <font face="Arial" color="#000080" size="2">清单 1. Robocode 生成?Robot 代码</font> </b> </a> <br /> <table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"> <tbody> <tr> <td> <pre> <code class="section"> <font face="Arial" color="#000080" size="2">package dw; import robocode.*; /** * DWStraight - a robot by (developerWorks) */ public class DWStraight extends Robot { ... // <<Area 1>> /** * run: DWStraight's default behavior */ public void run() { ... // <<Area 2>> while(true) { ... // <<Area 3>> } } ... // <<Area 4>> public void onScannedRobot(ScannedRobotEvent e) { fire(1); } } </font> </code> </pre> </td> </tr> </tbody> </table> <br /> <p> <font face="Arial" color="#000080" size="2">H出昄的区域就是我们添加控制机器h的代码的地方Q?/font> </p> <p> <font face="Arial"> <font size="2"> <font color="#000080"> <b>Area 1</b> <br />我们可以在这片空白里声明cM用域变量q设|这些变量的倹{这些变量可以在机器人的 <code>run()</code> Ҏ内以及其他一些您可能创徏的助手方法内使用?</font> </font> </font> </p> <p> <font face="Arial"> <font size="2"> <font color="#000080"> <b>Area 2</b> <br />战斗理器调?<code>run()</code> ҎȀzL器h。典型情况下Qrun() Ҏ包括两个区域Q即在清?1 中指出的 Area 2 ?Area 3Q,您可以在q两块空白里d代码。您?Area 2 中加入的代码每个机器人实例只q行一ơ。这部分代码通常用于使机器h先处于一U预讄态后再开始执行重复行为?</font> </font> </font> </p> <p> <font face="Arial"> <font size="2"> <font color="#000080"> <b>Area 3</b> <br />q是典型?<code>run()</code> Ҏ实现的第二部分。在此,我们在无限 <code>while</code> 循环内对机器人可能执行的重复行ؓq行~程?</font> </font> </font> </p> <p> <font face="Arial"> <font size="2"> <font color="#000080"> <b>Area 4</b> <br />您可以在q一区域内添加机器h?<code>run()</code> 逻辑内用的助手Ҏ。您也可以在此添加您惌覆盖的Q何事件处理程序。例如,清单 1 里的代码处理 <code>ScannedRobot</code> 事gQ每当雷达检到机器人的时候,只是直接向其发射炮弹?</font> </font> </font> </p> <p> <font face="Arial" color="#000080" size="2">我们对第一个机器hQDWStraightQ的代码的更新如清单 2 中红色标记所C?/font> </p> <br /> <a name="code2"> <b> <font face="Arial" color="#000080" size="2">清单 2. DWStraight 机器Z码的增加部分</font> </b> </a> <br /> <table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"> <tbody> <tr> <td> <pre> <code class="section"> <font face="Arial" color="#000080" size="2">package dw; import robocode.*; public class DWStraight extends Robot { public void run() { turnLeft(getHeading()); while(true) { ahead(1000); turnRight(90); } } public void onScannedRobot(ScannedRobotEvent e) { fire(1); } public void onHitByBullet(HitByBulletEvent e) { turnLeft(180); } } </font> </code> </pre> </td> </tr> </tbody> </table> <br /> <p> <font face="Arial" color="#000080" size="2">下面我们逐区地描q这个第一个机器h做些什么:</font> </p> <p> <font face="Arial"> <font size="2"> <font color="#000080"> <b>Area 1</b>我们没有在这个机器h的程序中指定McM用域变量?</font> </font> </font> </p> <p> <font face="Arial"> <font size="2"> <font color="#000080"> <b>Area 2</b> <br />Z使机器h处于已知的状态,我们通过 <code>turnLeft(getHeading())</code> 使它转到 0 度的方向?</font> </font> </font> </p> <p> <font face="Arial"> <font size="2"> <font color="#000080"> <b>Area 3</b> <br />在这个重复性的部分Q我们用语?<code>ahead(1000)</code> 让机器h其所能向前移动到最q的地方。当机器人撞到墙或其他机器hӞ׃停下来。接着Q我们通过 <code>turnRight(90)</code> 使它向右转。在重复执行q一行ؓӞ机器人基本上是在沿着墙按时针方向移动?</font> </font> </font> </p> <p> <font face="Arial"> <font size="2"> <font color="#000080"> <b>Area 4</b> <br />在此Q除处理自动生成?<code>ScannedRobot</code> 事gq向被发现的机器人直接射M外,我们q会?<code>HitByBullet</code> 事gQƈ且让机器人在被击中的时候{q?180 度(沉K旉方向或逆时针方向)?</font> </font> </font> </p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <font face="Arial" color="#000080" size="2"> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </font> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <font face="Arial" color="#000080" size="2"> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> </font> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <font face="Arial" color="#000080" size="2"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </font> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font face="Arial" color="#000080" size="2">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="6"> <span id="lxlozae" class="atitle"> <font face="Arial" color="#000080" size="2">~译以及试机器?/font> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">?Robot Editor 菜单上选择 <b>Compiler</b>-> <b>Compile</b>~译您的机器Z码。现在我们可以尝试第一回合的战斗了。切换回战场q择菜单上的 <b>Battle</b>-> <b>New</b>Q将会出C个类g?3 中所C的对话框?</font> </p> <br /> <a name="figure3"> <b> <font face="Arial" color="#000080" size="2">?3. New Battle 对话?/font> </b> </a> <br /> <font face="Arial" color="#000080" size="2"> <img height="440" alt="New Battle 对话? src="http://www-128.ibm.com/developerworks/cn/java/j-robocode/fig3.gif" width="584" /> <br /> </font> <p> <font face="Arial" color="#000080" size="2">请先我们的机器?dw.DWStraight d到战斗中Q然后再d一个对手机器hQ比?sample.SittingDuck。单?<b>Finish</b>Q战斗就开始了。不可否认,?SittingDuck 战斗q不怎么有趣Q但是您可以目睹q个叫做 DWStraight 的机器h在缺省情况下的行为。试?sample 文g多w的其他机器hQ看?DWStraight 同这些机器h的战斗情况如何?</font> </p> <p> <font face="Arial" color="#000080" size="2">当您准备开始研I另外一个机器h的代码时Q请先看看随 </font> <a > <font face="Arial" color="#000080" size="2">参考资?/font> </a> <font face="Arial" color="#000080" size="2">中的代码分发包一h供的 dw.DWRotater q个机器人的代码。在~省情况下,q个机器人将会: </font> </p> <ul> <li> <font face="Arial" color="#000080" size="2">Ud到战Z?</font> </li> <li> <font face="Arial" color="#000080" size="2">一直{动它的炮Q直到检到机器?</font> </li> <li> <font face="Arial" color="#000080" size="2">每次试以不同的角度在离被检到的机器h前方不远的地方射?</font> </li> <li> <font face="Arial" color="#000080" size="2">每当它被另外一个机器hMӞ它都会迅速的来回Ud </font> </li> </ul> <p> <font face="Arial" color="#000080" size="2">q段代码单易懂,所以我们在q里׃做分析了Q但是我鼓励您试验一下。Robocode 中的 sample 包还提供了许多其他机器h的代码?/font> </p> <p> <a name="N102AF"> <span id="qnkzkhh" class="smalltitle"> <strong> <font face="Arial" color="#000080" size="2">附加的机器h支持c?/font> </strong> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">随着您设计机器h的水q的提高Q机器h的代码主体将充分增长。对q些代码的一U模块化处理Ҏ是把代码分解成独立的 Java c,然后通过打包器把q些 Java cL包成一个单独的包(JAR 文gQ,q将它包括在您的机器人分发包内。Robocode 自动在它的 robots 目录下的包里扑ֈ robot cR?/font> </p> <p> <a name="N102B8"> <span id="doshlxu" class="smalltitle"> <strong> <font face="Arial" color="#000080" size="2">其他 Robot 子类</font> </strong> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">M人都可以创徏 <code>Robot</code> 子类q添加用于构建机器h的新功能。Robocode 提供了一个叫?<code>AdvancedRobot</code> ?<code>Robot</code> 子类Q它允许异步 API 调用。虽然对 <code>AdvancedRobot</code> cȝ描述出了本文的范围Q但我鼓励您在掌握了基本?<code>Robot</code> cȝ操作后,试验一下这个高U类?</font> </p> <table cellspacing="0" cellpadding="0" width="40%" align="right" border="0"> <tbody> <tr> <td width="10"> <font face="Arial" color="#000080" size="2"> <img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /> </font> </td> <td> <table cellspacing="0" cellpadding="5" width="100%" border="1"> <tbody> <tr> <td bgcolor="#eeeeee"> <a name="sidebar"> <b> <font face="Arial" color="#000080" size="2">设计 Robocode 的目?/font> </b> </a> <br /> <p> <font face="Arial" color="#000080" size="2">我碰见了 Robocode 的创?Mathew NelsonQ向他请教创?Robocode 最初的设计目的。Mat 所说的是:“编?Robocode 的一部分目的是ؓ了向世界证明Q象‘Java 比较慢’以及‘Java 不可以用来写游戏’之cȝ论断不再正确。我认ؓ我证明了q一炏V?/font> </p> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <font face="Arial" color="#000080" size="2"> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </font> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <font face="Arial" color="#000080" size="2"> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> </font> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <font face="Arial" color="#000080" size="2"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </font> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font face="Arial" color="#000080" size="2">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="7"> <span id="dhltmug" class="atitle"> <font face="Arial" color="#000080" size="2">战斗仿真器的体系l构</font> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">通过“在后台”对 Robocode q行分析Q我们发现复杂的仿真引擎既具高性能Qؓ了以现实的速度生成战斗Q又LzL(使创建复杂的机器人逻辑不存在障)。特别感?Robocode 的创?Mathew Nelson 无私的提供了仿真引擎体系l构的内部信息?/font> </p> <p> <a name="N102EA"> <span id="ucyyrks" class="smalltitle"> <strong> <font face="Arial" color="#000080" size="2">利用 Java q_q行设计</font> </strong> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">?4 中所C的仿真引擎利用的是大多数现代的 Java VM 都提供的非抢占式U程技术,q结合用了 JDK GUI ?2D 囑Ş库提供的生成功能?/font> </p> <br /> <a name="figure4"> <b> <font face="Arial" color="#000080" size="2">?4. Robocode 仿真引擎体系l构</font> </b> </a> <br /> <font face="Arial" color="#000080" size="2"> <img height="233" alt="仿真引擎" src="http://www-128.ibm.com/developerworks/cn/java/j-robocode/fig4.gif" width="450" /> <br /> </font> <p> <font face="Arial" color="#000080" size="2">h意,所仿真的每个机器h都在它自q Java U程上,它可以在M可适用的地方利?VM 本地U程映射机制。战斗管理器U程是系l的控制器:它安排仿真ƈ驱动囑Ş化的生成子系l。图形化的生成子pȝ本n是基?Java 2D ?AWT 的?/font> </p> <p> <a name="N10305"> <span id="ifyyqcs" class="smalltitle"> <strong> <font face="Arial" color="#000080" size="2">松散的线E耦合</font> </strong> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">Z减少׃n资源可能带来的问题(以及有可能随之出现的死锁或阻塞仿真引擎)Q战斗管理器U程和机器hU程之间的耦合应当非常松散。ؓ了实现这U松散耦合Q每个机器hU程都将有属于自q事g队列。获取及处理q些事g都是在每个机器h自己的线E内q行。这U基于线E的队列有效地消除了战斗理器线E和机器人线E之_或机器hU程本n之间Q可能存在的M争用?/font> </p> <p> <a name="N1030E"> <span id="ccvvglp" class="smalltitle"> <strong> <font face="Arial" color="#000080" size="2">Robocode 内部l构</font> </strong> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">您可以把 Robocode 仿真器引擎看作是一个仿真器E序Q该E序在运行时会用一些插Ӟ定制机器人)Q这些插件可以利用已有的 APIQ?<code>robocode.Robot</code> cȝҎQ。实际上Q每个机器h都是一个独立的 Java U程Q同?<code>run()</code> Ҏ内包含了每个U程上将要执行的逻辑?</font> </p> <p> <font face="Arial" color="#000080" size="2">在Q何时候,机器人线E都可以调用由它的父c?<code>robocoode.Robot</code> cL提供?API。典型情况下Q这通过调用 <code>Object.wait()</code> d机器人线E?</font> </p> <p> <a name="N1032A"> <span id="kwptmjz" class="smalltitle"> <strong> <font face="Arial" color="#000080" size="2">战斗理器线E?/font> </strong> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">战斗理器线E管理机器h、炮弹及它们在战Z的生成。仿真“时钟”是Ҏ战场上生成的帧的数目来标记的。用户可以调整真实的帧的速度?/font> </p> <p> <font face="Arial" color="#000080" size="2">在一个典型的回合中,战斗理器线E唤醒每个机器hU程Q然后等待机器h完成它的一轮战?卻I再次调用一个阻?APIQ。等待的间隔旉通常是几十毫U,即是最复杂的机器hQ用现今典型的pȝ速度q行{略安排和计,也只?1 ?2 毫秒的时间?/font> </p> <p> <font face="Arial" color="#000080" size="2">以下是战斗管理器U程执行的逻辑的伪代码Q?/font> </p> <br /> <a name="code3"> <b> <font face="Arial" color="#000080" size="2">清单 3. 战斗理器的逻辑的伪代码</font> </b> </a> <br /> <table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"> <tbody> <tr> <td> <pre> <code class="section"> <font face="Arial" color="#000080" size="2">while (round is not over) do call the rendering subsystem to draw robots, bullets, explosions for each robot do wake up the robot wait for it to make a blocking call, up to a max time interval end for clear all robot event queue move bullets, and generate event into robots' event queue if applicable move robots, and generate event into robots' event queue if applicable do battle housekeeping and generate event into robots' event queue if applicable delay for frame rate if necessary end do </font> </code> </pre> </td> </tr> </tbody> </table> <br /> <p> <font face="Arial" color="#000080" size="2">h意,?for 循环内部Q战斗管理器U程的等待时间不会超q最大的旉间隔。如果机器hU程没有及时调用d APIQ典型情况下是由于一些应用程序逻辑错误或无限@环)Q那么,它将l箋q行战斗。生成一?<code>SkippedTurnEvent</code> q将其加入机器h事g队列中,用来通知高机器人?</font> </p> <p> <a name="N1034A"> <span id="bfbufbf" class="smalltitle"> <strong> <font face="Arial" color="#000080" size="2">可替换的生成子系l?/font> </strong> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">AWT ?Java 2D U程是当前实现中的生成子系l,它从战斗理器中获取命oq生成战场。它同系l的其余部分是完全分ȝ。我们可以预见到Q在q个生成子系l将来的修订版中Q它可以被替换掉Q比如,?3-D 生成器)。在当前的实CQ只?Robocode 应用E序被最化Q生成就用了,q可以以更快的速度q行仿真?/font> </p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <font face="Arial" color="#000080" size="2"> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </font> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <font face="Arial" color="#000080" size="2"> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> </font> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <font face="Arial" color="#000080" size="2"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </font> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font face="Arial" color="#000080" size="2">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="8"> <span id="imuqfcs" class="atitle"> <font face="Arial" color="#000080" size="2">Robocode 的未?/font> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">通过 alphaWorks Robocode 站点上的一个讨论组Q请参阅 </font> <a > <font face="Arial" color="#000080" size="2">参考资?/font> </a> <font face="Arial" color="#000080" size="2">Q,Mathew Nelson 可以?Robocode 用户C֌保持紧密的反馈联pR许多反馈都q入了真实的代码中。Mathew 已计划即要q行的一些改q有Q?</font> </p> <ul> <li> <font face="Arial" color="#000080" size="2">通过不同的物体和障碍来定制战场地?</font> </li> <li> <font face="Arial" color="#000080" size="2">Z团队的战?</font> </li> <li> <font face="Arial" color="#000080" size="2">对联赛或联盟的集成支?</font> </li> <li> <font face="Arial" color="#000080" size="2">用户可选择坦克车体Q炮Q雷达/武器的样?</font> </li> </ul> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <font face="Arial" color="#000080" size="2"> <img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /> <br /> <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /> </font> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <font face="Arial" color="#000080" size="2"> <img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /> <br /> </font> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <font face="Arial" color="#000080" size="2"> <img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </font> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font face="Arial" color="#000080" size="2">回页?/font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="9"> <span id="zvzzolb" class="atitle"> <font face="Arial" color="#000080" size="2">挡不住的 Robocode 风潮</font> </span> </a> </p> <p> <font face="Arial" color="#000080" size="2">对于一个从 2001 q?7 ?12 日出现在公众面前的项目,Robocode 的出名简直让人吃惊。尽最新的可用版本q不?1.0Q在写这文章时是版?0.98.2Q,但它已经是全世界的大学校园以及公司的 PC Z颇受Ƣ迎的娱乐活动了。Robocode 联盟Q或 <i>roboleagues</i>Q正如雨后春W般出现Q在q些联盟里,Z通过因特|让自己定制的作品相互较量。大学教授们一直在挖掘 Robocode 的教育特性,q且已经把它U_了大学里的计机U学评。在因特|上QRobocode 用户l、讨论列表、FAQ、教E和 Webring 随处可见?</font> </p> <p> <font face="Arial" color="#000080" size="2">昄QRobocode 已经填补了大众化的寓教于乐领域的I白 ?它ؓ学生们和熬夜的工E师们提供简ѝ有、非胁迫却富竞争力的方式Q释放他们的创造力Q而且有可能实C们征服世界的梦想?/font> </p> <img src ="http://www.shnenglu.com/yunduan5158/aggbug/10235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yunduan5158/" target="_blank">Merlin</a> 2006-07-19 20:55 <a href="http://www.shnenglu.com/yunduan5158/archive/2006/07/19/10235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大家共勉--E序员如何成?/title><link>http://www.shnenglu.com/yunduan5158/archive/2006/07/19/10230.html</link><dc:creator>Merlin</dc:creator><author>Merlin</author><pubDate>Wed, 19 Jul 2006 09:02:00 GMT</pubDate><guid>http://www.shnenglu.com/yunduan5158/archive/2006/07/19/10230.html</guid><wfw:comment>http://www.shnenglu.com/yunduan5158/comments/10230.html</wfw:comment><comments>http://www.shnenglu.com/yunduan5158/archive/2006/07/19/10230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yunduan5158/comments/commentRss/10230.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yunduan5158/services/trackbacks/10230.html</trackback:ping><description><![CDATA[ <font face="Arial" color="#000080" size="2">华裔国U学家、前微Y中国研究院院长(呵呵Q应该是前了吧!Q李开复是一位在语音识别、h工智能、三l图形和国际互联|多媒体{领域n有很高声誉的q轻人。他的成功经验和d_引v了我国许多青q尤其是大学生的q泛x。在与我国年Mh的交往q程中,李开复归U_了一些大家共同关心的问题Qƈl合自己的学习和工作l历Q坦诚相见,直抒胸臆Q写成了一给我国学生的长?怿对大学生和青q朋友在如何对待机遇、如何对待学业、如何对待工作、如何对待他?、如何对待自q诸多斚w会有一些有益的启示?br /><br />    我在中国的这两年来,工作中最大的享受是到国内各高校与学生们进行交。这些访问和交流使得我有Z与成千上万的青年学生׃们所兛_的事业、前途等问题q行面对面的沟通。中国学生的聪明、好学和上进l我留下了非常深ȝ印象?   <br /><br />  在与q些青年学生的交过E中Q我发现有一些问题是大家都十分关心的。那些已l获得国外大学奖学金的学生,大都希望我谈一谈应该如何度q自己在国的学习生涯;那些军_留在国内发展的学生,非常兛_如何定一个正的方向Qƈ以最快的速度在科研和学业斚w取得成功Q还有那些刚刚踏q大学校门的学生Q则希望我能讲给他们一些学习、做人的l验之谈。最q,更有一些学生关心网l信息业的发展Q希望了解美国的大学生是如何创业和致富的。看到这么多双求知识、充满希望的眼睛Q我H然产生了一U冲动,那就是给中国的学生们写一信Q将我与同学们在交流q程中生的一些想法以及我要对中国学生的一些忠告写出来Q帮助他们在未来的留学、工作或者创业的q程中能够h格更完美Q生zL利Q事业更成功?   <br /><br /><b>坚守诚信、正直的原则</b><br />  我在Ҏ公司工作Ӟ曾有一位刚被我提拔的经理,׃受到下属的批评,非常沮地要我再找一个h来接替他。我问他Q“你认ؓ你的长处是什么?”他_“我自信自己是一个非常正直的人。”我告诉他:“当初我提拔你做l理Q就是因Z是一个公正无U的人。管理经验和沟通能力是可以在日后工作中学习的,但一颗正直的心是无h的。”我支持他l干下去Qƈ在管理和沟通技巧方面给予他很多指点和帮助。最l, 他不负众望,成ؓ一个出色的理人才?   <br /><br />  与之相反Q我N试过一位求职者。他在技术、管理方面都相当。但是,在谈话之余,他表C,如果我录取他Q他可以把在原来公司工作时的一发明带q来。随后他g觉察到这栯有些不妥Q特做声明:那些工作是他在下班之后做的,他的老板q不知道。这一番谈话之?Q对于我而言Q不Z的能力和工作水^怎样Q我都肯定不会录用他。原因是他缺乏最基本的处世准则和最L的职业道P“诚实”和“讲信用”。如果雇用这L人,谁能保证他不会在q里工作一D|间后Q把在这里的成果也当作所谓“业余之作”而变成向其他公司讨好的“A品”呢Q这说明Q一个h品不完善的h是不可能成ؓ一个真正有所作ؓ的h的?<br />  在美国,中国学生的勤奋和优秀是出了名的。曾l一度是国各名校最Ƣ迎的留学生体Q而最q,却有一些变化。原因很单,某些中国学生拿着d士的奖学金到了美国,可一旦找到工作机会,他们׃马上甌d学校Q将自己曄承诺要完成的学位和研I抛在一辏V这U言行不一的做法已l得美国一部分教授对中国学生的诚信产生了怀疑。应该指出,有这U行为的中国学生是少敎ͼ然而就是这L“少数”,已经让中国学生的名誉受到了极大的损害。另外,目前国有些教授不愿理会部分中国学生的推荐信Q因Z们知道这些推荐信Ҏ出自学生自׃手,已无参考性可a。这也是诚信受到损害以后的必然结果?   <br /><br />  我在微Y研究院也曄到过cM的问题。一位来q里实习的学生,有一ơ出乎意料地报告了一个非常好的研I结果。但是,他做的研I结果别人却无法重复。后来,他的老板发现Q这个学生对实验数据q行了挑选,只留下了那些合乎最佳结果的数据Q而舍弃了那些“不太好”的数据。我认ؓQ这个学生永q不可能实现真正意义的学术突_也不可能成ؓ一名真正合格的研究人员?   <br /><br />  最后想提的是一些喜Ƣ贪便宜的人。他们用学校或公司的电话打私人长途、多报销出租车票。也许有为,学生以成l、事业ؓ重,其他l节只是一些小事,随心所Ʋ地做了Q也没什么大不了的。然而,是那些w边的所谓“小事”,往往成ؓ一个h塑造h格和U篏诚信的关键。一些贪便宜、耍小聪明的行为只会把自己定性ؓ一个贪囑ְ利、没有出息的人的形象Q最l因失大。中国有“勿以恶而ؓ之”的古训Q很值得记取?   <br /><br /><b>生活在群体之?/b><br />与大多数国学生比较而言Q中国学生的表达能力、沟通能力和团队_要相Ҏ~Z些。这也许是由于文化背景和教育体制的不同而造成的。今天,当我们面对一个正在走向高度全球化的社会时Q生zd体之中Q做出更好的表现Q得到更多的收获Q是ؓ重要的?   <br /><br />  表达和沟通的能力是非帔R要的。不Z做出了怎样优秀的工作,不会表达Q无法让更多的hȝ解和分nQ那几乎等于白做。所以,在学习阶D,你不可以只生zd一个h的世界中Q而应当尽量学会与各类Z往和沟通,d表达自己对各U事物的看法和意见,甚至在公众集会时发表演讲Q锻Dq表达能力?   <br /><br />  表达能力l不只是你的“口才”。哈佛大学的Ambady教授最q做q一个非常有的实验Q他让两l学生分别评估几位教授的授课质量。他把这几位教授的讲译ֽ像带先无声地放两U钟l一l学生看Q得Z套评估结果。然后与那些已经听过q几位教授几个月讲课的学生的l果q行ҎQ两个小l的l论竟然惊h的相伹{这表明Q在表达自己思想的过E中Q非语言表达方式和语a同样重要Q有时作用甚x加明显。这里所讲的非语a表达方式是指人的仪表、D止、语气、声调和表情{。因Zq些斚wQh们可以更直观、更形象地判断你Zh、做事的能力Q看Z的自信和热情Q从而获得十分重要的“第一印象”?   <br /><br />  对于一个集体、一个公司,甚至是一个国Ӟ团队_都是非常关键性的。微软公司在国以特D的团队_著称。像Windows2000q样的品的研发Q有过3000名开发工E师和测试h员参与,写出?000万行代码。没有高度统一的团队精,没有全部参与者的默契与分工合作,q项工程是根本不可能完成的?   <br /><br />  以前我在别的公司时却也曾见到q相反的现象。一工E布|下来,大家明明知道无法完成Q但都心照不宣,不告诉老板。因为反正也做不完,大家索性也不努力去做事Q却花更多的旉ȝ计怎么把这工E的p|怪罪到别n上去。就是这些h和这L工作作风Q几乎把q家公司拖垮?   <br /><br />  Z培养团队_Q我同学们在M之余U极参加各种C会团体的工作。在与他人分工合作、分享成果、互助互惠的q程中,你们可以体会团队_的重要性?<br />  在学习过E中Q你千万不要不愿意把好的思\、想法和l果与别人分享,担心别h走到你前面的x是不健康的,也无助于你的成功。有一句谚语说Q“你付出的越多,你得到的多”。试惻I如果你的行ؓ让h觉得“你的是我的Q我的还是我的”,当你需要帮忙时Q你认ؓ别h会来帮助你吗Q反之,如果你时常慷慨地帮助别hQ那你是不是会得到更多h的回报呢Q?   <br /><br />在团队之中,要勇于承认他人的贡献。如果借助了别人的智慧和成果,应该声明。如果得C他h的帮助,应该表C感谢。这也是团队_的基本体现?br />做一个主动的?   <br /><br />  三十q前Q一个工E师梦寐以求的目标就是进入科技最领先的IBM。那时IBM对h才的定义是一个有专业知识的、埋头苦q的人。斗转星U,事物发展C天,Z对h才的看法已逐步发生了变化。现在,很多公司所渴求的h才是U极d、充满热情、灵z自信的人?   <br /><br />  作ؓ当代中国的大学生Q你应该不再只是被动地等待别人告诉你应该做什么,而是应该dM解自p做什么,q且规划它们Q然后全力以赴地d成。想想今天世界上最成功的那些hQ有几个是唯唯诺诺、等人吩咐的人?对待自己的学业和研究目Q你需要以一个母亲对孩子那样的责d和爱心,全力投入Q不断努力。果真如此,便没有什么目标是不能辑ֈ的?   <br /><br />  一个积极主动的应该虚心听取他h的批评和意见。其实,q也是一U进取心的体现。不能虚心接受别人的批评Qƈ从中汲取教训Q就不可能有更大的进步。比盖茨曾l对公司所有员工说q:“客L批评比赚钱更重要。从客户的批评中Q我们可以更好地汲取p|的教训,它转ؓ成功的动力。?   <br /><br />  除了虚心接受别h的批评,你还应该努力L一位你特别敬的良师。这位良师应该是直接教导你的老师以外的hQ这L人更能客观地l你一些忠告。这位良师除了可以在学识上教g之外Q还可以在其他一些方面对你有所指点Q包括ؓ人处世,看问题的眼光Q应对突发事件的技能等{?<br />  我以前在Ҏ公司负责一个研I门时Q就曾有q找到这样一位良师。当Ӟ他是负责Ҏ公司全球q作和生产业务的高副总裁Q他在事业发展方面给我的许多教诲令我ln受益。如果有q样的hl你帮助 Q那你成长的速度一定会比别人更快一些?   <br /><br />  中国学生大多比较含蓄、害,不太习惯做自我推销。但是,要想把握住{瞬即逝的ZQ就必须学会说服他hQ向别h推销自己或自q观点。在说服他h之前Q要先说服自己。你的激情加上才智往往折射Z的潜力,一个好的自我推销{略可以令事情的发展锦上添花?<br /><br />  例如Q有一ơ我收到了一份很Ҏ的求职申请书。不同于已往大多数求职者,q位甌人的求职资料中包括了他的自我介绍、他对微软研I的向往、以及他Z么认己是合适的人选,此外q有他已l发表的论文、老师的推荐信和他希望来微软作的课题等。尽他毕业的学校不是中国最有名的学校,但他的自我推销奏效了。我从这些文件中看到了他的热情和认真。在我面试他Ӟ他又递交了一份更充分的个料。最后,当我问他有没有问题要问我Ӟ他反问我Q:“你Ҏq有没有M的保留?”当Ӟ我的对他能否进入新的研I域有疑虑Q于是就q一步问了他一些这斚w的问题。他丑և了两个很有说服力的例子。最后,我们雇用了这名应聘者。他现在做得非常?   <br /><br /><b>挑战自我、开发自w潜?</b>   <br />  我在Ҏ公司工作的时候,有一天,老板H然问我什么时候可以接替他的工作?我非常吃惊,表示自己~Z像他那样的管理经验和能力。但是他却说Q这些经验是可以培养和积累的Q而且他希望我在两q之后就可以做到。有了这L提示和鼓励,我开始有意识地加己在q方面的学习和实c果Ӟ我真的在两年之后接替了他的工作。我个h认ؓQ一个h的领导素质对于他来的治学、经商或从政都是十分重要的。在M时候、Q何环境里Q我们都应该有意识地培养自己的领导才能。同Ӟ我徏议你l自׃些机会展C斚w的能力,或许像我一P你会惊讶自己在这一斚w的潜力远q超q了自己的想象?   <br />  l自p定目标是一件十分重要的事情。目标设定过高固然不切实际,但是目标千万不可定得太低。在二十一世纪Q竞争已l没有疆界,你应该放开思维Q站在一个更高的LQ给自己讑֮一个更h战性的标准Q才会有准确的努力方向和qK的前景,切不可做“井底之蛙”。另外,只在一所学校取得好成l、好名次p己已l功成名是可笑的,要知道,山外有山Qh上有人,而且Q不同地方的衡量标准又不一 栗所以,在订立目标方面,千万不要有“宁为鸡首,不ؓ牛后”的思想?   <br /><br />  一个一的Z一个一般的人在一般问题上的表现可能一P但是在一问题上的表现则会有天壤之别。美国著名作家威?amp;#8226;克Uq:“不要竭全力去和你的同僚竞争。你更应该在乎的是:你要比现在的你更强。”你应该永远l自p立一些很h战性、但q不可及的目标?<br /><br />在确立将来事业的目标Ӟ不要忘了扪心自问Q“这是不是我最热爱的专业?我是否愿意全力投入?”我希望你们能够对自己选择所从事的工作充满激情和惌力,对前q途中可能出现的各U艰NL所畏惧。谈到对工作的热爱,我认识的一位微软的研究员曾l让我深有感触。他l常周末开车出门,说去见“女朋友”,后来Q一ơ偶然机会我在办公室里看见他Q问他:“女朋友在哪里?”他W着指着电脑_“就是她呀??<br /><br />  对于工作的热爱,比尔&#8226;盖茨也曾有过非常_ֽ的阐qͼ他说Q“每天早晨醒来,一惛_所从事的工作和所开发的技术将会给人类生活带来的巨大媄响和变化Q我׃无比兴奋和激动。?   <br /><br />  几个月前Q《北京青q报》上曾有一场探讨比?amp;#8226;盖茨和保?amp;#8226;柯察金谁更伟大的讨论。由于从在国长大Q我q不知道保尔和他的事qV但是,我非常赞同保的q段名言Q“h最宝贵的东西是生命Q生命属于我们只有一ơ。h的一生应当这样度q,当他回首往事的时候,不因虚度q华而悔恨,也不因碌无羞愧……”所以,你应当选择一个你真心热爱的事业,不断地挑战自我、完善自我,让自q一生过得精彩和充实?<br />  <br /><b>客观、直截了当的沟?/b><br />  有一ơ,一位中国的大学教授扑ֈ我,希望我帮他找一位国外的专家在他l织的会议上d主题演讲Q末了还Ҏ加了一句,最好是一个洋人。我很不以ؓ然地对他_“这个领域最h威的人士是在北京的一个中国hQؓ什么你一定要找一位洋人呢Q”他表面上同意我的说法,但是他仍然请了一个美国h来做q个演讲Q结果效果很差。所以,我们不应该陷入盲目的崇洋情结。我们应该用客观的眼光来判断事物Q而不是以他的肤色或他的居住地来决定?   <br /><br />有一句话_“真理往往掌握在少Ch手中”。这句话的意思是Q我们看问题应该有自q眼光Q有独立思考的能力Q不一定大多数可的Q或某个权威说的Q就是对的。不论是做学问、搞研究q是l商Q我们都不能盲从Q要多想几个Z么。有了客观的意见Q你应该直截了当地表达。如果做M事情都像“打太极拳”,会让Z知所云,也会造成很多误会。有一ơ,在微软研I工作的一位研Ih员就自己所选择的研I方向来征求我的意见Q我作了一番分析,认ؓq个方向有不问题,但如果他坚持Q我愿意支持他试着d。结果他认ؓ我这句话的意思实际上是不允总dQ所以他选择了其他的方向。后来他要出差时Q负责行政事务的人告诉他Q你可以选择坐火车或者坐飞机。他认ؓ行政人员实际上是在暗CZ坐火车,因ؓ坐飞机太c其实,他的猜测都是错误的。因为我们的沟通方式是直截了当Q而他却在“打太极拳”。这之后Q我们通过一pd的公司文化讲座,让员工们了解刎ͼ心里想什么就讲什么,不要把简单的问题复杂化。现在,研究院里q类的误会少了很多?  <br /><br />  拐弯抹角Q言不由Pl果费了大家的宝贵旉。瞻前顾后,生怕说错话Q结果是变成谨小慎微的懦夫。更p糕的是q有些hQ当面不_背后pQ这样对他h和自己都毫无益处Q最后只能是破坏了集体的团结。这L人和作风既不能面对社会,也不可能在科学研I中走出新\Q更不可能在Ȁ烈的商战中脱颖而出?   <br /><br />  希望同学们能够做到开诚布公,敢于说“不”,q才是尊重自己思想意愿的表现。当Ӟ在表达你的意见时Q无论反对和批评都应是徏设性的Q有高度诚意的,而不是ؓ批评而批评,批评。我赞成的方式是提供性的正面的意见。在开始讨论问题时QQ何h先不要拒人千里之外,大家把想法都摆在桌面上,充分体现个h的观点,q样才会有一个容U_部分人意见的l论。当Ӟ你也要学习用适当的方法和口气表达你的意见Q比如说不要在很多h面前让别人难堪。这P你的批评才会奏效?   <br /><br /><br /><b>珍惜校园学习生活</b>    <br />  几天前,报纸上登Z条消息,说有中学生辍学去开|络公司。我认ؓqƈ不值得提倡。对l大多数学生来讲Q在校生zLpȝ地学习基理论知识Q学习思考和解决问题方式的好Z。这些知识将成ؓ你未来发展过E中所需要的最基本的知识和技能。就像徏一栋高|如果不打好基Q是l不起风吚w打的?   <br /><br />  在全球范围内Q美国的研究水^无疑是世界一的。而除了美国之外,你会发现英国的研I水q也是相当突出的。究其原因,其实是语言问题。英国h可以毫无ȝ地阅ȝ国乃臛_球各U最新的英文研究报告和资料。这对于他们把握研究方向Q跟t最新进展,发表研究成果都有很大的帮助。因此,p学习对于我们作研I的人来_是相当重要的。只有加斚w素质的培养,才能适应来的发展。我Q学p先听_再学dQ而且务必在大学阶D完全解册语学习的问题。等到年龄大了,要付出的代h相比׃大得多?   <br /><br />  除了p之外Q数学、统计学对理工科学生也是很重要的基础评Q是不可忽视的。数学是人类几千q的智慧l晶Q你们一定要用心把它学好Q不能敷衍了事。我今天很后悔自己当初没有花更多功夫把数学 学得 更好些。另外,计算机应用、算法和~程也都是每一个工U学生应?熟悉 和掌握的Q它们是来Zh必须会用的工兗?   <br /><br />  U技的发展可谓日新月异。在校学习的目的Q其实就是掌握最基本的学习工具和Ҏ。将来利用这些工具和ҎQ再d习新的东ѝ比如:上课学会了CQ+Q能否自己学会JavaQ上译֭会了HTMLQ能否自己学?XMLQ与其说上大学是Z学一门专业,不如说是Z学会如何学习 Q让自己能够“无师自通”?   <br /><br />  大学毕业后的前两q_同学们聚CP发现变化都还不算大。五q后再聚CP变化大多了。一些h落伍了,因ؓ他们不再学习Q不再能够掌握新的东西,自然而然地落在了C会发展的后面。如果我们要在这个竞争激烈的C会中永不落伍,那就得永q学习?   <br />  我的老板RickRashid博士是目前微软公怸研I的高副总裁Q他已经功成名就Q却始终保持着一颗学习和q取的心。现在,他每q仍然编写大U?0Q?00行程序。他认ؓQ用最新的技术编E可以他保持对计算机最前沿技术的敏感Q自己能够不断q步。今天,有些博士生带着低年U的本科生和士生做目Q就自满地认己已l没有必要再~程了。其实,q样的做法是很不明智的?   <br /><br />  每次到清华和其他学校讉KQ被问到最多的是学生打工的问题。我认ؓQ打工从M来说对学生是一件好事,是拓宽视野的一U方式。例如,在研I机构打工,可以学到最新的U技Q在产品部门打工Q可以学到开发的技术和技能;在市场部门打工,可以理解商业的运作。我认ؓ每一个学生都应该有打工的l验Q但不要打一些“没用的工”。首先要明白打工只是学生生活中的一U补充,学习才是最重要的。打工的目的是开阔眼界,不是提前上班。如果你把翻译书本、录入数据库所q旉投入学习Q将来可以赚更多的钱。那些钱远q超出目前打工的收入?    <br /><br />  此外Q还有一些学生受到目前退学创业风潮的鼓励Qؓ成ؓ中国的比?amp;#8226;盖茨和迈克尔&#8226;戴尔而中途辍学。以我的观点Q除了十分特D的情况外,我不在校学生退学创业。你所看到的那些退学创业的成功者实际上之又少。目前,大部分学生虽有创业的xQ但~少创业的经验,所以失败的可能性非常大。如果要成功Q我你们先把书读好。如果是要学习创业的l验Q你完全可以利用假期的时间先M家公司边打工边学?<br /><br />  比尔&#8226;盖茨也曾说过Q“如果你正在考虑自己成立一家新公司Q你应该首先明确地知道:创办公司需要巨大的_֊投入Q要冒巨大的风险。我觉得你们不必像我Q一开始就创办一家公司。你应该考虑加盟其他公司q在q家公司中学习他们的工作、创业方法。?   <br /><br /><br /><b>你想戴一什么样的博士帽</b>    <br />  在我q入卡内基梅隆大学攻读计机博士学位ӞpMLҎԌ当你拿到你的博士学位Ӟ你应该成Z所从事的研I域里世界W一的专家。这句话对于初出茅庐的我来说直高不可攀Q但也让我踌w满志、跃跃欲试。就q样Q在l过五年寒窗、夜以日的努力工作后,他所期待的结果就那么自然而然地出C?<br /><br />  一个打攻d士学位的人,应该给自己树立一个很高的目标。如果没有雄心壮志,千万不要自ƺ欺人,也许l商或从事其它工作,会有更大的成l。在目标立之后Q我你ؓ自己设计一个三q的学习和科研计划。首先,你需要彻底地了解在相关领域他人已有的工作和成l。然后再提出自己的想法和见解Q做脚踏实地的工作。另外,q要不断跟踪q个领域的最新研I进展。只有这P才可以把握好方向Q避免重复性工作,把精力集中在最有h值的研究方向??   <br /><br />  在学术界Qh们普遍认为“名师出高徒”。可见导师在你的成长道\中作用是多么大。所以,你应该主动去L自己所研究的领域里最好的老师。除了你的老师之外Q你q应该去求教于周围所有的专家。更不要忘了常去求教“最博学的老师”InternetQ现在,几乎所有的论文、研I结果、先q想法都可以在网上找到。我q鼓׃直接发电子邮件去咨询一些世界公认的专家和教授。以我的l验Q对于这L邮gQ他们中的大部分都会很快l你回复?   <br /><br />  我在攻读博士学位Ӟ每周工作七天Q每天工?6个小Ӟ大量的统计结果和分析报告几乎让我崩溃。那Ӟ同领域其他研Ih员采用的是与我不同的传统Ҏ。我的老师虽然支持我,但ƈ不认可我的研I方?。我也曾不止一ơ地怀疑自q所作所为是否真的能够成功。但l于有一 天, 在半夜三Ҏ做出的一个结果让我感受到了成功的滋味。后来,研究有了H飞猛进的进展,导师也开始采用我的研I方法。我的博士论文我的研究成ؓ自然语言研究斚w当时最有媄响力的工作之一?<br /><br />  d士不是一件轻杄事,切忌躁的情l,而要一步一个脚华ͼ扎扎实实地工作。也不可 受一些稍U即逝的名利的诱惑,而要200%的投入。也怽会疲劻I会懊悔,会迷失方向,但是要记住,你所期待的成功和H破也正孕育其中。那U一切都很顺利,谁都可以得到的工作和l果Q我怿研究价g定不高。从一定意义上Ԍ一个h如果打算一辈子从事研究工作Q那么从他在d士学位期间所形成的做事习惯、研I方法和思维方式基本上就可以判断Z未来工作的轮廓。所以,你一定要做一个“有心h”,充分?用在 校的旉Qؓ自己的将来打好基?   <br /><br />  上述一些观点,是我在与同学们交往q程中的一些感受。我希望q些和想法能Ҏ在未来之路上跋涉的你们有所启发Q能对你们目前的学习有所帮助。或许因点不同、h各有志,或许因ؓ忠言逆耻Iq封信可能无法ؓ每一位同学所接受。但是只要一百位阅读q封信的同学中有一位从中受益,q封信就已经比我所作的M研究都更有h倹{我真诚地希望,在新的世U,中国学生无论是在国内Q还是国外;无论是做研究Q还是经商,都显得更成熟一些,成功的机率更大一些?br /></font> <img src ="http://www.shnenglu.com/yunduan5158/aggbug/10230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yunduan5158/" target="_blank">Merlin</a> 2006-07-19 17:02 <a href="http://www.shnenglu.com/yunduan5158/archive/2006/07/19/10230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]学习的方法(工作两年之后的ȝQ?/title><link>http://www.shnenglu.com/yunduan5158/archive/2006/07/19/10228.html</link><dc:creator>Merlin</dc:creator><author>Merlin</author><pubDate>Wed, 19 Jul 2006 08:32:00 GMT</pubDate><guid>http://www.shnenglu.com/yunduan5158/archive/2006/07/19/10228.html</guid><wfw:comment>http://www.shnenglu.com/yunduan5158/comments/10228.html</wfw:comment><comments>http://www.shnenglu.com/yunduan5158/archive/2006/07/19/10228.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yunduan5158/comments/commentRss/10228.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yunduan5158/services/trackbacks/10228.html</trackback:ping><description><![CDATA[ <font face="Arial" color="#000080" size="2">作ؓE序员,应该是最苦的一件事情,通宵达旦的熬夜,把自q血汗无偿的捐献l了Boss Q同时还得小心自p伍,明天要学习,再学习,因ؓ技术更新实在是太快QJDK1.4q没有搞定, JDK5.0已经开始普及了Q等Z开始用上了5.0Q?.0已经开始发布测试版了,7.0也在刀霍霍之中Q危机感始终是笼|在自己头上Q怎么办? N我们E序员就是这L生活Q?<br /><br />    真想好好的休息一下,放松自己的神l! 但是不能Q怎么办? 工作两年了,真的是感觉到了这U辛苦。那怎么才能够改变这U现象呢Q方法,改变我们学习的方法,q是我最q一直在思考的事情。新技术曾ZIP我们不可能永q跟得上脚步Q所以我们要掌握自己的主动权?<br /><br />   W一Q要有好的心态,我们选择了这一行,没有什么可以抱怨的?br /><br />   W二Q经常反省自己,看能不能变得更好?每天都会有收P所以呢Q每天都可以发现自己的不뀂Matrin Folwer_如果Q两q后Q你q是认ؓ两年前的自己已经很优U的话Q那说明你没有进步?<br /><br />   W三Q要ȝQ把自己明天的心得都C来,记录自己的脚步?<br /><br />   W四Q要ȝQ要做就把它做好。碰到困难更是要q难而上Q这时候才是学习的最好机会?br /><br />   W五Q不要有畏惧心理Q不要怕做不好。相信自己?br /><br />   W六Q要学会使用文档Q俺的头q一Ҏ让h佩服Q不会的问题Q看文档Q很快就可以搞定Q当Ӟ前提是他p实在是高。没有语a障碍?<br /><br />    W七Q就是上面说的,作ؓE序员,要学好英语。这是很重要?<br /><br />    q有是Q程序员每天该做的事Q好东西?br /><font color="#ff0000"><br /><br />写的真的很好Q不q我发现人坚持干一件事情真的很难?/font></font> <img src ="http://www.shnenglu.com/yunduan5158/aggbug/10228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yunduan5158/" target="_blank">Merlin</a> 2006-07-19 16:32 <a href="http://www.shnenglu.com/yunduan5158/archive/2006/07/19/10228.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]你该学什么程序语aQ?/title><link>http://www.shnenglu.com/yunduan5158/archive/2006/07/13/9821.html</link><dc:creator>Merlin</dc:creator><author>Merlin</author><pubDate>Thu, 13 Jul 2006 13:50:00 GMT</pubDate><guid>http://www.shnenglu.com/yunduan5158/archive/2006/07/13/9821.html</guid><wfw:comment>http://www.shnenglu.com/yunduan5158/comments/9821.html</wfw:comment><comments>http://www.shnenglu.com/yunduan5158/archive/2006/07/13/9821.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/yunduan5158/comments/commentRss/9821.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yunduan5158/services/trackbacks/9821.html</trackback:ping><description><![CDATA[ <font face="Arial"> <font color="#000080" size="2">除非你像我一样学E序语言只是Z到处献宝Q否则你在学一套程序语a前,应该先仔l评估到底要学哪一套。每个程序语a的用途都有很大的差异Q走了冤枉\可能会耽误到计d作的q程?br />我大致上把程序语a分成五类Q分q如下:<br /><br />Web Page Script Languages<br />用来做网늚语言Q可以对|页做控制。如果你希望设计出很炫的|页Q光?HTML 是不够的Q你q得学一?Web Page Script LanguageQ比方说 javascriptQECMAScriptQ和微Y?JScript。不q两者都是系出同门,所以差不多。WML ScriptQWAP 手机?scriptQ也是袭?<br />javascript?br />许多人知道我不会 javascript 之后Q都会大吃一惊地反问Q「可是你不是?JavaQ怎么不顺便学 javascriptQ两个语a不是差不多」。如果依照此推理Q我看我差不多每个语a都要学了Q因为除?REBOL 和汇~语a比较Ҏ之外Q我觉得其它语言的语法都差不多(但用途差很多Q?br />不过我最q的是有打开始学 javascriptQ因为我发现用到它的Zq不。除了网会用到之外Q我最q所接触?SVGQScalable Vector GraphicsQ就使用 javascript 来达到动L果?br /><br />Interpreted LanguagesQ直译式语言Q?br />q类直译式的语言包括?Perl、Python、REBOL、Ruby... {,也常被称?script 语言Q通常是用来取代批ơ档?shell script 以便和底下的操作pȝ沟通。基本上Q每个h臛_都应该要会一套这cȝ语言Q当你需要做某g单的工作Q你可以透过直译式的语言来轻易地办到Q这么一来,你就可以不必大张旗鼓C?Java ?C++ {工具了?br />直译式的语言通常比较高阶Q程序比较好写,往往短地几行E序抵得过 Java ?C++ 的一堆程序代码。因Z用编译而且高阶Q所以这c语a的程序效率通常很差Q又因ؓ原始E序代码暴露在外Q所以拿它来写写工具E序自己用可以,但是拿来开发Y件品比较不恰当Q除非你不在乎原始码外流Q。目前这c语a最常被用来开发网|务器端的E序Q或者是设计软g?prototype?br />Python 有一些不错的语言Ҏ,目前在国外算是满热门的;Ruby 是日本一位教授设计的Q但是这语言太新了,目前好象只有 Addison Wesley 的一本英文书?O'Reilly 的一本日文书可供参考;REBOL 则是我近期最喜欢的程序语aQ非常特别,REBOL 语言的思维和别的语a差异非常大,许多时候很接近英文句子。至?PerlQ我没有研I了Q台湾欧q公司已经?Perl 的专家了Q如果我现在d Perl 的话Q短期内是不可能越他的Q所以我看算?:(<br /><br />Hybrid LanguagesQ؜合式语言Q?br />JavaQC# 都是混合式语aQ介于直译式语言和编译式语言之间Q不是在执行效能上或程序简单性上Q?br />C# 的语a有许多奇怪的特色Q但也有一些不错的特色。C# 的学习用上的难度介?Java ?C/C++ 之间。C# ?Microsoft .NET q_上最重要的语aQ值得我们持箋观察其后l发展。至?Java 我就不用多说了,怿 Sleepless in Java 的读者们应该都知?Java 是怎么一回事?br />至于 Visual BasicQ在 .NET q_L C# 语言Q?VisualBasic .NET 的语a又比以前复杂许多的情况下Q?Visual Basic 的前途似乎很不看好?br /><br />Compiling LanguagesQ编译式语言Q?br />C/C++QDelphiQObject PascalQ都是编译式语言。这几年来,C++ 已经变得来庞大了Q大多数?C++ E序员只用到Q也只懂QC++ 功能的一部份。想成ؓ C++ 语言真正的高手,没有耗上三五q是不可能的。虽?C++ 很复杂,但是真正x为程序高手的人应该都要懂 C/C++Q重要的 API 都会?C/C++ 的版本,由此可见 C/C++ 的重要性。至?DelphiQ在 Microsoft .NET 推出之后会对 Delphi 造成一些打击(Microsoft .NET 的语a名单中连 Scheme、Eiffel ?Mercury q种用的语a都出CQ独~?DelphiQ,但是 Delphi 能透过 Kylix 来跨?Windows ?LinuxQ又是一个很大的吸引力,如果你想要跨 Linux ?Windows q_?RAD 工具Q语aQ,目前 Delphi g是最好的选择?br /><br />Assembly LanguagesQ汇~语aQ?br />使用汇编语言Q你尝试到一砖一瓦堆砌出E序的乐(或痛苦)。汇~语a可以说是最接近g的语aQ学会汇~语aQ就可以对计机的运作有相当E度的了解。不q,目前q开发驱动程序都不太需要用到汇~语a了。恐怕只有做 DSP ?OS {极部份的人需要用到汇~语a。我也好久没写汇~程序了Q以?DOS 时代Q我q用汇编语言写过一?PE 2?br /><br />E序语言学习序的徏?br />通常 Web Script 最单,直译式语a其次Q接着是؜合式语言Q和~译式语aQ最ȝ的是汇编语言。如果你完全没有E序l验Q想开始学E序设计的话Q你可以?javascript 着手,{到E序基础观念建立得差不多了,再往下学习直译式语言Q然后再学习混合式语a ...Q以此类推?br />希望q篇文章能解册者们选择E序语言的困?br /><br /><font color="#ff3366">看完q篇文章Q我觉得自己的学习经历真的很搞笑Q上大学最先学的是C++,接着学了一q的C#Q后来接触了Javascript,现在又在学Java。弄了半天我是越学越单了Q哈哈~~~~~~~</font></font> </font> <img src ="http://www.shnenglu.com/yunduan5158/aggbug/9821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yunduan5158/" target="_blank">Merlin</a> 2006-07-13 21:50 <a href="http://www.shnenglu.com/yunduan5158/archive/2006/07/13/9821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]JavaU程ȝ http://www.shnenglu.com/yunduan5158/archive/2006/07/12/9763.htmlMerlinMerlinWed, 12 Jul 2006 08:38:00 GMThttp://www.shnenglu.com/yunduan5158/archive/2006/07/12/9763.htmlhttp://www.shnenglu.com/yunduan5158/comments/9763.htmlhttp://www.shnenglu.com/yunduan5158/archive/2006/07/12/9763.html#Feedback0http://www.shnenglu.com/yunduan5158/comments/commentRss/9763.htmlhttp://www.shnenglu.com/yunduan5158/services/trackbacks/9763.html在论坛上面常常看到初学者对U程的无可奈何,所以ȝZ下面一文章,希望对一些正在学习用javaU程的初学者有所帮助?br />
首先要理解线E首先需要了解一些基本的东西Q我们现在所使用的大多数操作pȝ都属于多dQ分时操作系l。正是由于这U操作系l的出现才有了多U程q个概念。我们用的windows,linux属于此列。什么是分时操作pȝ呢,通俗一点与是可以同一旉执行多个E序的操作系l,在自q电脑上面Q你是不是一边听歌,一边聊天还一边看|页呢?但实际上Qƈ不上cpu在同时执行这些程序,cpu只是时间切割ؓ旉片,然后时间片分配l这些程序,获得旉片的E序开始执行,不等执行完毕Q下个程序又获得旉片开始执行,q样多个E序轮流执行一D|_׃现在cpu的高速计能力,lh的感觉就像是多个E序在同时执行一栗?br />一般可以在同一旉内执行多个程序的操作pȝ都有q程的概?一个进E就是一个执行中的程?而每一个进E都有自q立的一块内存空?一l系l资?在进E概念中,每一个进E的内部数据和状态都是完全独立的.因此可以惛_创徏q执行一个进E的pȝ开像是比较大的Q所以线E出C。在java中,E序通过控制来执行E序?E序中单个顺序的控制称为线E?多线E则指的是在单个E序中可以同时运行多个不同的U程,执行不同的Q?多线E意味着一个程序的多行语句可以看上d乎在同一旉内同时运?Q你可以前面一句话的程序换成进E,q程是程序的一ơ执行过E?是系l运行程序的基本单位Q?br />
U程与进E相?是一D完成某个特定功能的代码,是程序中单个序的流控制;但与q程不同的是,同类的多个线E是׃n一块内存空间和一l系l资?而线E本w的数据通常只有微处理器的寄存器数据,以及一个供E序执行时用的堆栈.所以系l在产生一个线E?或者在各个U程之间切换?负担要比q程的?正因如此,U程也被UCؓ轻负药E?light-weight process).一个进E中可以包含多个U程.

多Q务是指在一个系l中可以同时q行多个E序,x多个独立q行的Q?每个d对应一个进E,同进E一?一个线E也有从创徏,q行到消亡的q程,UCؓU程的生命周?用线E的状?state)表明U程处在生命周期的哪个阶D?U程有创?可运?q行?d,M五中状?通过U程的控制与调度可ɾU程在这几种状态间转化每个E序臛_自动拥有一个线E?UCؓȝE?当程序加载到内存?启动ȝE?

[U程的运行机制以及调度模型]
java中多U程是一个类或一个程序执行或理多个U程执行d的能力,每个U程可以独立于其他线E而独立运行,当然也可以和其他U程协同q行Q一个类控制着它的所有线E,可以军_哪个U程得到优先U,哪个U程可以讉K其他cȝ资源Q哪个线E开始执行,哪个保持休眠状态?br />下面是线E的机制图:
image

U程的状态表C线E正在进行的zd以及在此旉D内所能完成的d.U程有创?可运?q行?d,M五中状?一个具有生命的U程,L处于q五U状态之一Q?br />1.创徏状?/b>
使用newq算W创Z个线E后,该线E仅仅是一个空对象,pȝ没有分配资源,U该U程处于创徏状?new thread)
2.可运行状?/b>
使用start()Ҏ启动一个线E后,pȝU程分配了除CPU外的所需资源,使该U程处于可运行状?Runnable)
3.q行中状?/b>
Javaq行pȝ通过调度选中一个Runnable的线E?使其占有CPUq{行中状?Running).此时,pȝ真正执行U程的run()Ҏ.
4.d状?/b>
一个正在运行的U程因某U原因不能l运行时,q入d状?Blocked)
5.M状?/b>
U程l束后是M状?Dead)

同一时刻如果有多个线E处于可q行状?则他们需要排队等待CPU资源.此时每个U程自动获得一个线E的优先U?priority),优先U的高低反映U程的重要或紧急程?可运行状态的U程按优先排队,U程调度依据优先U基上的"先到先服?原则.
U程调度理器负责线E排队和CPU在线E间的分?q由U程调度法q行调度.当线E调度管理器选种某个U程?该线E获得CPU资源而进入运行状?

U程调度是先占式调度,卛_果在当前U程执行q程中一个更高优先的线E进入可q行状?则这个线E立卌调度执行.先占式调度分?独占式和分时方式.
独占方式?当前执行U程一直执行下??到执行完毕或׃某种原因d攑ּCPU,或CPU被一个更高优先的线E抢?br />分时方式?当前q行U程获得一个时间片,旉到时,即没有执行完也要让出CPU,q入可运行状?{待下一个时间片的调?pȝ选中其他可运行状态的U程执行
分时方式的系l每个U程工作若干?实现多线E同时运?br />
另外h意下面的U程调度规则Q如果有不理解,不急,往下看Q:
①如果两个或是两个以上的U程都修改一个对象,那么把执行修改的Ҏ定义同步的(SynchronizedQ?如果对象更新影响到只L法,那么只度Ҏ也应该定义ؓ同步?br />②如果一个线E必ȝ待一个对象状态发生变化,那么它应该在对象内部{待Q而不是在外部{待Q它可以调用一个被同步的方法,q让q个Ҏ调用wait()
③每当一个方法改变某个对象的状态的时候,它应该调用notifyAll()ҎQ这l等待队列的U程提供Z来看一看执行环境是否已发生改变
④记住wait(),notify(),notifyAll()Ҏ属于Objectc,而不是Threadc,仔细查看是否每次执行wait()Ҏ都有相应的notify()或notifyAll()ҎQ且它们作用与相同的对象 在java中每个类都有一个主U程Q要执行一个程序,那么q个cd中一定要有mainҎQ这个manҎ也就是java class中的ȝE。你可以自己创徏U程Q有两种ҎQ一是承Threadc,或是实现Runnable接口。一般情况下Q最好避免承,因ؓjava中是单根l承Q如果你选用l承Q那么你的类失MҎ,当然也不能全然否定承Thread,该方法编写简?可以直接操作U程,适用于单重承情c至于选用那一U,具体情况具体分析?br />

eg.l承Thread
				public class MyThread_1 extends Thread
{
public void run()
{
//some code
}
}


eg.实现Runnable接口
				public class MyThread_2 implements Runnable
{
public void run()
{
//some code
}
}



当用承创建线E,q样启动U程Q?br />
				new MyThread_1().start()
		


当用实现接口创建线E,q样启动U程Q?br />
				new Thread(new MyThread_2()).start()
		


注意Q其实是创徏一个线E实例,q以实现了Runnable接口的类为参C入这个实例,当执行这个线E的时候,MyThread_2中run里面的代码将被执行?br />下面是完成的例子Q?br />
				public class MyThread implements Runnable
{

public void run()
{
System.out.println("My Name is "+Thread.currentThread().getName());
}
public static void main(String[] args)
{
new Thread(new MyThread()).start();
}
}



执行后将打印出:
My Name is Thread-0

你也可以创徏多个U程Q像下面q样
				new Thread(new MyThread()).start();
new Thread(new MyThread()).start();
new Thread(new MyThread()).start();



那么会打印出Q?br /> My Name is Thread-0
My Name is Thread-1
My Name is Thread-2


看了上面的结果,你可能会认ؓU程的执行顺序是依次执行的,但是那只是一般情况,千万不要用以为是U程的执行机Ӟ影响U程执行序的因素有几点Q首先看看前面提到的优先U别


				public class MyThread implements Runnable
{

public void run()
{
System.out.println("My Name is "+Thread.currentThread().getName());
}
public static void main(String[] args)
{
Thread t1=new Thread(new MyThread());
Thread t2=new Thread(new MyThread());
Thread t3=new Thread(new MyThread());
t2.setPriority(Thread.MAX_PRIORITY);//赋予最高优先
t1.start();
t2.start();
t3.start();
}
}


再看看结果:
My Name is Thread-1
My Name is Thread-0
My Name is Thread-2



U程的优先分ؓ10U,分别??0的整C表,默认情况?。上面的t2.setPriority(Thread.MAX_PRIORITY){h与t2.setPriority(10Q?br />然后是线E程序本w的设计Q比如用sleep,yield,joinQwait{方法(详情LJDKDocument)

				public class MyThread implements Runnable
{
public void run()
{
try
{
int sleepTime=(int)(Math.random()*100);//产生随机数字Q?br />Thread.currentThread().sleep(sleepTime);//让其休眠一定时_旉又上面sleepTime军_
//public static void sleep(long millis)throw InterruptedException QAPIQ?br />System.out.println(Thread.currentThread().getName()+" 睡了 "+sleepTime);
}catch(InterruptedException ie)//׃U程在休眠可能被中断Q所以调用sleepҎ的时候需要捕捉异?br />{
ie.printStackTrace();
}
}
public static void main(String[] args)
{
Thread t1=new Thread(new MyThread());
Thread t2=new Thread(new MyThread());
Thread t3=new Thread(new MyThread());
t1.start();
t2.start();
t3.start();
}
}


执行后观察其输出Q?br />
Thread-0 睡了 11
Thread-2 睡了 48
Thread-1 睡了 69




上面的执行结果是随机的,再执行很可能出现不同的结果。由于上面我在run中添加了休眠语句Q当U程休眠的时候就会让出cpuQcpu会选择执行处于runnable状态中的其他线E,当然也可能出现这U情况,休眠的Thread立即q入了runnable状态,cpu再次执行它?br />[U程l概念]
U程是可以被l织的,java中存在线E组的概念,每个U程都是一个线E组的成?U程l把多个U程集成Z个对?通过U程l可以同时对其中的多个线E进行操?如启动一个线E组的所有线E等.Java的线E组由java.lang包中的Thread——Groupcd?
ThreadGroupcȝ来管理一l线E?包括:U程的数?U程间的关系,U程正在执行的操?以及U程要启动或终止时间等.U程l还可以包含U程l?在Java的应用程序中,最高层的线E组是名位main的线E组,在main中还可以加入U程或线E组,在mian的子U程l中也可以加入线E和U程l?形成U程l和U程之间的树状承关pR像上面创徏的线E都是属于mainq个U程l的?br />借用上面的例子,main里面可以q样写:

				public static void main(String[] args)
{
/***************************************
ThreadGroup(String name)
ThreadGroup(ThreadGroup parent, String name)
***********************************/
ThreadGroup group1=new ThreadGroup("group1");
ThreadGroup group2=new ThreadGroup(group1,"group2");
Thread t1=new Thread(group2,new MyThread());
Thread t2=new Thread(group2,new MyThread());
Thread t3=new Thread(group2,new MyThread());
t1.start();
t2.start();
t3.start();
}



U程l的嵌套Qt1,t2,t3被加入group2,group2加入group1?br />另外一个比较多是关于U程同步斚w的,试想q样一U情况,你有一W存Ƒ֜银行Q你在一安行ؓ你的账户存款Q而你的妻子在另一安行从q个账户提款Q现在你?000块在你的账户里面。你存入?000Q但是由于另一方也在对q笔存款q行操作Qh家开始执行的时候只看到账户里面原来?000元,当你的妻子提?000元后Q你d所在的银行pZ的̎户里面没有钱了,而你所在的银行却认Zq有2000元?br />看看下面的例子:

				class BlankSaving //储蓄账户
{
private static int money=10000;
public void add(int i)
{
money=money+i;
System.out.println("Husband 向银行存入了 [K?+i+"]");
}
public void get(int i)
{
money=money-i;
System.out.println("Wife 向银行取C [K?+i+"]");
if(money<0)
System.out.println("余额不Q?);
}
public int showMoney()
{
return money;
}
}


class Operater implements Runnable
{
String name;
BlankSaving bs;
public Operater(BlankSaving b,String s)
{
name=s;
bs=b;



}
public static void oper(String name,BlankSaving bs)
{



if(name.equals("husband"))
{
try
{
for(int i=0;i<10;i++)
{
Thread.currentThread().sleep((int)(Math.random()*300));
bs.add(1000);
}
}catch(InterruptedException e){}
}else
{
try
{



for(int i=0;i<10;i++)
{
Thread.currentThread().sleep((int)(Math.random()*300));
bs.get(1000);
}
}catch(InterruptedException e){}
}
}
public void run()
{
oper(name,bs);
}
}
public class BankTest
{
public static void main(String[] args)throws InterruptedException
{
BlankSaving bs=new BlankSaving();
Operater o1=new Operater(bs,"husband");
Operater o2=new Operater(bs,"wife");
Thread t1=new Thread(o1);
Thread t2=new Thread(o2);
t1.start();
t2.start();
Thread.currentThread().sleep(500);
}



}



下面是其中一ơ的执行l果Q?br />


---------first--------------
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Husband 向银行存入了 [K?000]


看到了吗Q这可不是正的需求,在husbandq没有结束操作的时候,wife插了进来,q样很可能导致意外的l果。解军_法很单,是对数据q行操作Ҏ声明为synchronized,当方法被该关键字声明后,也就意味着Q如果这个数据被加锁Q只有一个对象得到这个数据的锁的时候该对象才能对这个数据进行操作。也是当你存款的时候,q笔账户在其他地Ҏ不能q行操作的,只有你存Ƒ֮毕,银行理人员̎戯锁,其他人才能对q个账户q行操作?br />修改public static void oper(String name,BlankSaving bs)为public static void oper(String name,BlankSaving bs)Q再看看l果:

Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Husband 向银行存入了 [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]
Wife 向银行取C [K?000]




当丈夫完成操作后Q妻子才开始执行操作,q样的话Q对׃n对象的操作就不会有问题了?br />[wait and notify]
你可以利用这两个Ҏ很好的控制线E的执行程Q当U程调用waitҎ后,U程被挂vQ直到被另一U程唤醒QnotifyQ或则是如果waitҎ指定有时间得话,在没有被唤醒的情况下Q指定时间时间过后也自动被唤醒。但是要注意一定,被唤醒ƈ不是指马上执行,而是从组塞状态变为可q行状态,其是否运行还要看cpu的调度?br />事例代码Q?br />
				class MyThread_1 extends Thread
{
Object lock;
public MyThread_1(Object o)
{
lock=o;
}
public void run()
{
try
{
synchronized(lock)
{
System.out.println("Enter Thread_1 and wait");
lock.wait();
System.out.println("be notified");
}
}catch(InterruptedException e){}
}
}
class MyThread_2 extends Thread
{
Object lock;
public MyThread_2(Object o)
{
lock=o;
}
public void run()
{
synchronized(lock)
{
System.out.println("Enter Thread_2 and notify");
lock.notify();
}
}
}
public class MyThread
{
public static void main(String[] args)
{
int[] in=new int[0];//notice
MyThread_1 t1=new MyThread_1(in);
MyThread_2 t2=new MyThread_2(in);
t1.start();
t2.start();
}
}




执行l果如下Q?br /> Enter Thread_1 and wait
Enter Thread_2 and notify
Thread_1 be notified


可能你注意到了在使用wait and notifyҎ得时候我使用了synchronized块来包装q两个方法,q是׃调用q两个方法的时候线E必获得锁Q也是上面代码中的lock[]Q如果你不用synchronized包装q两个方法的得话Q又或则锁不一是同一把,比如在MyThread_2中synchronized(lock)改ؓsynchronized(this),那么执行q个E序的时候将会抛出java.lang.IllegalMonitorStateException执行期异常。另外wait and notifyҎ是Object中的Qƈ不在Threadq个cM。最后你可能注意Cq点Qint[] in=new int[0];Z么不是创建new Object而是一?长度的数l,那是因ؓ在java中创Z?长度的数l来充当锁更加高效?br />
Thread作ؓjava中一重要l成部分Q当然还有很多地斚w要更深刻的认识,上面只是对Thread的一些常识和易错问题做了一个简要的ȝQ若要真正的掌握java的线E,q需要自己多做ȝ


Merlin 2006-07-12 16:38 发表评论
]]>
[转]l典java问题http://www.shnenglu.com/yunduan5158/archive/2006/07/12/9753.htmlMerlinMerlinWed, 12 Jul 2006 08:02:00 GMThttp://www.shnenglu.com/yunduan5158/archive/2006/07/12/9753.htmlhttp://www.shnenglu.com/yunduan5158/comments/9753.htmlhttp://www.shnenglu.com/yunduan5158/archive/2006/07/12/9753.html#Feedback1http://www.shnenglu.com/yunduan5158/comments/commentRss/9753.htmlhttp://www.shnenglu.com/yunduan5158/services/trackbacks/9753.htmlW一Q谈谈final, finally, finalize的区别?br />
  
final—修饰符Q关键字Q如果一个类被声明ؓfinalQ意味着它不能再z出新的子c,不能作ؓ父类被ѝ因此一个类不能既被声明?abstract的,又被声明为final的。将变量或方法声明ؓfinalQ可以保证它们在使用中不被改变。被声明为final的变量必d声明时给定初|而在以后的引用中只能dQ不可修攏V被声明为final的方法也同样只能使用Q不能重载?br />
  
finally—再异常处理时提?finally 块来执行M清除操作。如果抛Z个异常,那么相匹配的 catch 子句׃执行Q然后控制就会进?finally 块(如果有的话)?br />
  
finalize—方法名。Java 技术允怋?finalize() Ҏ在垃圾收集器对象从内存中清除出M前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对q个对象调用的。它是在 Object cM定义的,因此所有的c都l承了它。子c覆?finalize() Ҏ以整理系l资源或者执行其他清理工作。finalize() Ҏ是在垃圾攉器删除对象之前对q个对象调用的?br />

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

  
匿名的内部类是没有名字的内部cR不能extends(l承) 其它c,但一个内部类可以作ؓ一个接口,由另一个内部类实现?br />

  
W三QStatic Nested Class ?Inner Class的不同,说得多好(面试题有的很W统)?br />
  
Nested Class Q一般是C++的说法)QInner Class (一般是JAVA的说?。Java内部cMC++嵌套cL大的不同在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&page=1

  
注: 静态内部类QInner ClassQ意味着1创徏一个static内部cȝ对象Q不需要一个外部类对象Q?不能从一个static内部cȝ一个对象访问一个外部类对象


  
W四Q?amp;?amp;&的区别?br />
  
&是位q算W?amp;&是布逻辑q算W?br />

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

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


  
W七Q什么时候用assert?br />
  
断言是一个包含布表辑ּ的语句,在执行这个语句时假定该表辑ּ?true。如果表辑ּ计算?falseQ那么系l会报告一?Assertionerror。它用于调试目的Q?br />
  
assert(a > 0); // throws an Assertionerror if a <= 0

  

断言可以有两UŞ式:

  
assert Expression1 ;

 
assert Expression1 : Expression2 ;

  
Expression1 应该L产生一个布倹{?br />
  
Expression2 可以是得Z个值的L表达式。这个值用于生成显C更多调试信息的 String 消息?br />
  
断言在默认情况下是禁用的。要在编译时启用断言Q需要?source 1.4 标记Q?br />
  
javac -source 1.4 Test.java

  
要在q行时启用断aQ可使用 -enableassertions 或?-ea 标记?br />
  
要在q行旉择用断言Q可使用 -da 或?-disableassertions 标记?br />
  
要系l类中启用断aQ可使用 -esa 或?-dsa 标记。还可以在包的基上启用或者禁用断a?br />
  
可以在预计正常情况下不会到达的Q何位|上攄断言。断a可以用于验证传递给U有Ҏ的参数。不q,断言不应该用于验证传递给公有Ҏ的参敎ͼ因ؓ不管是否启用了断aQ公有方法都必须查其参数。不q,既可以在公有Ҏ中,也可以在非公有方法中利用断言试后置条g。另外,断言不应该以M方式改变E序的状态?


  
W八QGC是什? Z么要有GC? (基础)?

  
GC是垃圾收集器。Java E序员不用担心内存管理,因ؓ垃圾攉器会自动q行理。要h垃圾攉Q可以调用下面的Ҏ之一Q?br />
  
System.gc()

  
Runtime.getRuntime().gc()


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

  
两个对象Q一个是"xyx",一个是指向"xyx"的引用对象s?br />

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

    
Math.round(11.5)q回QlongQ?2QMath.round(-11.5)q回QlongQ?11;


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

  
short s1 = 1; s1 = s1 + 1;有错Qs1是short型,s1+1是int?不能昑ּ转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确?br />

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

  
W十三,Java有没有goto?

  
Goto—java中的保留字,现在没有在java中用?br />

  
W十四,数组有没有length()q个Ҏ? String有没有length()q个ҎQ?br />
  
数组没有length()q个ҎQ有length的属性?br />
  
String有有length()q个Ҏ?br />

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

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

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

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

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


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

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

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

  
ListQSet?br />
  
Map不是


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

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

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

  
都不?br />

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

  
接口可以l承接口。抽象类可以实现(implements)接口Q抽象类是否可承实体类Q但前提是实体类必须有明的构造函数?br />

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

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

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

  
构造器Constructor不能被承,因此不能重写OverridingQ但可以被重载Overloading?br />

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

  
StringcLfinalcL不可以ѝ?br />

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

  
不能Q一个对象的一个synchronizedҎ只能׃个线E访问?br />

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

  
会执行,在return前执行?br />

  
二十八,~程? 用最有效率的Ҏ出2乘以8{於?

  
有C背景的程序员特别喜欢问这U问题?


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

 
不对Q有相同的hash code?


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

  
是g递。Java ~程语言只由g递参数。当一个对象实例作Z个参数被传递到Ҏ中时Q参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变Q但对象的引用是永远不会改变的?


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

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

  
W三十二Q编E题: 写一个Singleton出来?br />
  
Singleton模式主要作用是保证在Java应用E序中,一个类Class只有一个实例存在?br />
 
一般Singleton模式通常有几U种形式:

  
W一UŞ? 定义一个类Q它的构造函Cؓprivate的,它有一个static的private的该cd量,在类初始化时实例话,通过一个public的getInstanceҎ获取对它的引?l而调用其中的Ҏ?

  
public class Singleton {

  
private Singleton(){}

  
//在自己内部定义自׃个实例,是不是很奇怪?

  
//注意q是private 只供内部调用

  
private static Singleton instance = new Singleton();

  
//q里提供了一个供外部讉K本class的静态方法,可以直接讉K  

  
public static Singleton getInstance() {

  
return instance;   

  
}

  
}


  
W二UŞ?

  
public class Singleton {

  
private static Singleton instance = null;

  
public static synchronized Singleton getInstance() {

  
//q个Ҏ比上面有所改进Q不用每ơ都q行生成对象Q只是第一ơ 

      
 //使用时生成实例,提高了效率!

  
if (instance==null)

  
instanceQnew Singleton();

  
return instance;   }

  
}

  
其他形式:

  
定义一个类Q它的构造函Cؓprivate的,所有方法ؓstatic的?

  
一般认为第一UŞ式要更加安全?

  
Hashtable和HashMap

  
Hashtablel承自Dictionaryc,而HashMap是Java1.2引进的Map interface的一个实?br />
  
HashMap允许null作ؓ一个entry的key或者valueQ而Hashtable不允?

  
q有是QHashMap把Hashtable的containsҎL了,Ҏcontainsvalue和containsKey。因为containsҎҎ让h引v误解?br />
  
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是Q在

  
多个U程讉KHashtableӞ不需要自׃ؓ它的Ҏ实现同步Q而HashMap

  
必Mؓ之提供外同步?

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

Merlin 2006-07-12 16:02 发表评论
]]>
Javahttp://www.shnenglu.com/yunduan5158/archive/2006/07/11/9707.htmlMerlinMerlinTue, 11 Jul 2006 14:34:00 GMThttp://www.shnenglu.com/yunduan5158/archive/2006/07/11/9707.htmlhttp://www.shnenglu.com/yunduan5158/comments/9707.htmlhttp://www.shnenglu.com/yunduan5158/archive/2006/07/11/9707.html#Feedback0http://www.shnenglu.com/yunduan5158/comments/commentRss/9707.htmlhttp://www.shnenglu.com/yunduan5158/services/trackbacks/9707.html 《Thinking in Java?br />《J2EE技术实c?br />《JAVA高效~程指南?/strong>
《Sleepless in Java?/strong> 下蝲地址Q?/font> http://www.shnenglu.com/Files/yunduan5158/SleeplessInJava.rar  
 


Merlin 2006-07-11 22:34 发表评论
]]>
[转]对String的深ȝ?/title><link>http://www.shnenglu.com/yunduan5158/archive/2006/07/11/9706.html</link><dc:creator>Merlin</dc:creator><author>Merlin</author><pubDate>Tue, 11 Jul 2006 14:29:00 GMT</pubDate><guid>http://www.shnenglu.com/yunduan5158/archive/2006/07/11/9706.html</guid><wfw:comment>http://www.shnenglu.com/yunduan5158/comments/9706.html</wfw:comment><comments>http://www.shnenglu.com/yunduan5158/archive/2006/07/11/9706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yunduan5158/comments/commentRss/9706.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yunduan5158/services/trackbacks/9706.html</trackback:ping><description><![CDATA[ <font face="Arial" color="#000080" size="2">q期到CSDN论坛看看一些网友脓的面试题Q其中关于String的问题常常被提及。我一直以己很清楚q个东西了,其实qhQ发现自己ƈ不那么清楚,会犯一些错误;同时也生了一些联惟뀂小l一下?br /><br />1?abc"与new String("abc");<br />    l常会问到的面试题:String s = new String("abc");创徏了几个String Object?【如q里创徏了多对? 和一道小的面试??br /><br />    q个问题比较单,涉及的知识点包括Q?br /><br />引用变量与对象的区别Q?<br />字符串文?abc"是一个String对象Q?<br />文字池[pool of literal strings]和堆[heap]中的字符串对象?br />    一、引用变量与对象Q除了一些早期的Java书籍和现在的垃圾书籍Qh们都可以从中比较清楚地学习到两者的区别。A aa;语句声明一个类A的引用变量aa[我常常称之ؓ句柄]Q而对象一般通过new创徏。所以题目中s仅仅是一个引用变量,它不是对象。[ref 句柄、引用与对象]<br /><br />    二、Java中所有的字符串文字[字符串常量]都是一个String的对象。有人[特别是CE序员]在一些场合喜Ƣ把字符?当作/看成"字符数组Q这也没有办法,因ؓ字符串与字符数组存在一些内在的联系。事实上Q它与字W数l是两种完全不同的对象?br /><br />        System.out.println("Hello".length());<br />        char[] cc={'H','i'};<br />        System.out.println(cc.length);<br /><br />    三、字W串对象的创?׃字符串对象的大量使用[它是一个对象,一般而言对象L在heap分配内存]QJava中ؓ了节省内存空间和q行旉[如比较字W串Ӟ==比equals()快]Q在~译阶段把所有的字符串文字放C个文字池[pool of literal strings]中,而运行时文字池成为常量池的一部分。文字池的好处,是该池中所有相同的字符串常量被合ƈQ只占用一个空间。我们知道,对两个引用变量,使用==判断它们的值[引用]是否相等Q即指向同一个对象:<br /><br /></font> <pre class="overflow"> <font face="Arial" color="#000080" size="2">String s1 = "abc" ;<br />String s2 = "abc" ;<br />if( s1 == s2 ) <br />    System.out.println("s1,s2 refer to the same object");<br />else     System.out.println("trouble");</font> </pre> <br /> <br /> <font face="Arial" color="#000080" size="2">    q里的输出显C,两个字符串文字保存ؓ一个对象。就是说Q上面的代码只在pool中创Z一个String对象?br /><br />    现在看String s = new String("abc");语句Q这?abc"本n是pool中的一个对象,而在q行时执行new String()Ӟpool中的对象复制一份放到heap中,q且把heap中的q个对象的引用交ls持有。okQ这条语句就创徏?个String对象?br /><br /></font> <pre class="overflow"> <font face="Arial" color="#000080" size="2">String s1 = new String("abc") ;<br />String s2 = new String("abc") ;<br />if( s1 == s2 ){ //不会执行的语句}</font> </pre> <br /> <br /> <font face="Arial" color="#000080" size="2">    q时?=判断可知,虽然两个对象?内容"相同[equals()判断]Q但两个引用变量所持有的引用不同,<br /><br />    BTWQ上面的代码创徏了几个String Object? [三个Qpool中一个,heap?个。]<br />    [Java2 认证考试学习指南 (W??( 英文?p197-199有图解。]<br /><br /><br />2、字W串?q算和字W串转换<br />    字符串{换和串接是很基础的内容,因此我以个问题简直就是送分题。事实上Q我自己q错了?br /><br />String str = new String("jf"); // jf是接?br />str = 1+2+str+3+4;<br />一共创Z多少String的对象?[我开始的{案Q?个。jf、new?jf?jf3?jf34]<br /><br />    首先看JLS的有兌qͼ<br /><br />    一、字W串转换的环境[JLS 5.4 String Conversion]<br /><br />    字符串{换环境仅仅指使用双元?q算W的情况Q其中一个操作数是一个String对象。在q一特定情Ş下,另一操作数{换成StringQ表辑ּ的结果是q两个String的串接?br /><br />    二、串接运符[JLS 15.18.1 String Concatenation Operator + ]<br /><br />    如果一个操作数/表达式是StringcdQ则另一个操作数在运行时转换成一个String对象Qƈ两者串接。此ӞMcd都可以{换成String。[q里Q我漏掉?3"?4"]<br /><br />如果是基本数据类型,则如同首先{换成其包装类对象Q如int x视ؓ转换成Integer(x)?<br />现在全部统一到引用类型向String的{换了。这U{换如同[as if]调用该对象的无参数toStringҎ。[如果是null则{换成"null"]。因为toStringҎ在Object中定义,故所有的c都有该ҎQ而且Boolean, Character, Integer, Long, Float, Double, and String改写了该Ҏ?<br />关于+是串接还是加法,由操作数军_?+2+str+3+4 很Ҏ知道?3jf34"。[BTW :在JLS?5.18.1.3中D的一个jocular little exampleQ真的很无趣。]<br />    下面的例子测试了改写toStringҎ的情??br /><br /></font> <pre class="overflow"> <font face="Arial" color="#000080" size="2">class A{<br />    int i = 10;<br />    public static void main(String []args){<br />        String str = new String("jf");<br />        str += new A();<br />        System.out.print(str);<br />    }<br /><br />    public String toString(){<br />        return " a.i ="+i+"\n";<br />    }<br />}</font> </pre> <br /> <br /> <font face="Arial" color="#000080" size="2">三、字W串转换的优?br /><br />按照上述说法Qstr = 1+2+str+3+4;语句g应该应该生?个String对象Q?br /><br />1+2 Q?Qthen 3↺nteger(3)?3" in pool? [假设如此] <br />"3"+str(in heap) = "3jf"     (in heap) <br />"3jf" +3 ,first 3↺nteger(3)?3" in pool? [则不创徏] then "3jf3" <br />"3jf3"+4 create "4"  in pool <br />then "3jf34"<br /><br />    q里我ƈ不清??转换成字W串后是否在池中Q所以上q结果仍然是猜测?br /><br />    Z减少创徏中间q渡性的字符串对象,提高反复q行串接q算时的性能Qa Java compiler可以使用StringBuffer或者类似的技术,或者把转换与串接合q成一步。例如:对于 a + b + c QJava~译器就可以它视ؓ[as if]<br /><br />    new StringBuffer().append(a).append(b).append(c).toString();<br /><br />    注意Q对于基本类型和引用cdQ在append(a)q程中仍然要先将参数转换Q从q个观点看,str = 1+2+str+3+4;创徏的字W串可能?3"?4"?3jf34"[以及一个StringBuffer对象]?br /><br />    现在我仍然不知道怎么回答str = 1+2+str+3+4;创徏了多String的对象,。或许,q个问题不需要过于研IӞ臛_SCJP不会考它?br /><br />3、这又不同:str = "3"+"jf"+"3"+"4";<br />    如果是一个完全由字符串文字组成的表达式,则在~译Ӟ已经被优化而不会在q行时创Z间字W串。测试代码如下:<br /><br /></font> <pre class="overflow"> <font face="Arial" color="#000080" size="2">String str1 ="3jf34";<br />        String str2 ="3"+"jf"+"3"+"4"; <br />        if(str1 == str2) {<br />            System.out.println("str1 == str2");<br />        }else {<br />            System.out.println("think again");<br />        }<br />        if(str2.equals(str1))<br />            System.out.println("yet str2.equals(str1)");</font> </pre> <br /> <br /> <font face="Arial" color="#000080" size="2">    可见Qstr1与str2指向同一个对象,q个对象在pool中。所有遵循Java Language Spec的编译器都必d~译时对constant expressions q行化。JLS规定QStrings computed by constant expressions (&yacute;15.28) are computed at compile time and then treated as if they were literals. <br /><br />    对于String str2 ="3"+"jf"+"3"+"4";我们说仅仅创Z个对象。注意,“创建多对象”的讨论是说q行时创建多对象?br /><br />    BTWQ编译时优化<br /><br /></font> <pre class="overflow"> <font face="Arial" color="#000080" size="2">    String x = "aaa " + "bbb ";<br />    if (false) {<br />        x = x + "ccc ";<br />    }<br />    x +=  "ddd ";<br /><br />    {h于:<br /><br />    String x = "aaa bbb ";<br />    x = x + "ddd ";</font> </pre> <font face="Arial"> <font color="#000080"> <font size="2"> <font style="BACKGROUND-COLOR: #ffffff"> <font color="#ff0000">//q个地方我自p行了~译Q不q和他的l论不一P好像当用x+="ddd"的时候和直接的x="aaa"+"bbb"+"ddd" 不同Q但是具体ؓ什么我也不清楚Q正在研I中。。?/font> <br /> <br /> </font>4、不变类<br />    String对象是不可改变的(immutable)。有人对str = 1+2+str+3+4;语句提出疑问,怎么str的内容可以改变?其实仍然是因Z清楚Q引用变量与对象的区别。str仅仅是引用变量,它的值——它持有的引用可以改变。你不停地创建新对象Q我׃断地改变指向。[参考TIJ的Read-only classes。]<br /><br />    不变cȝ关键是,对于对象的所有操作都不可能改变原来的对象[只要需要,p回一个改变了的新对象]。这׃证了对象不可改变。ؓ什么要一个类设计成不变类Q有一个OOD设计的原则:Law of Demeter。其q义解读是:<br /><br />    使用不变cR只要有可能Q类应当设计Z变类?br /></font> </font> </font> <img src ="http://www.shnenglu.com/yunduan5158/aggbug/9706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yunduan5158/" target="_blank">Merlin</a> 2006-07-11 22:29 <a href="http://www.shnenglu.com/yunduan5158/archive/2006/07/11/9706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]abstract class和interface相关整理http://www.shnenglu.com/yunduan5158/archive/2006/07/11/9703.htmlMerlinMerlinTue, 11 Jul 2006 11:53:00 GMThttp://www.shnenglu.com/yunduan5158/archive/2006/07/11/9703.htmlhttp://www.shnenglu.com/yunduan5158/comments/9703.htmlhttp://www.shnenglu.com/yunduan5158/archive/2006/07/11/9703.html#Feedback0http://www.shnenglu.com/yunduan5158/comments/commentRss/9703.htmlhttp://www.shnenglu.com/yunduan5158/services/trackbacks/9703.html abstract class和interface在Java语言中都是用来进行抽象类定义?br />
Interface ,l外界的接口,按照规定办事Q?br />Abstract  ,内部l承关系Q?br />
interface 是一l操作的集合,它定义了一个行为集但不作Q何具体的实现,q样的话,具体的操?都可以放在实现类中去,
          体现设计与实现分ȝ设计思想?br />
在面向对象的概念中,所有的对象都是通过cL描绘Q如果一个类中没有包含够的信息来描l一个具体的对象Q这Lcd是抽象类
抽象概念在问题领域没有对应的具体概念Q所以用以表征抽象概늚抽象cL不能够实例化的?br />
=====================================================================================================================
使用abstract class的方式定义Demo抽象cȝ方式如下Q?br />

				abstract class Demo {
abstract void method1();
abstract void method2();
?br />}



使用interface的方式定义Demo抽象cȝ方式如下Q?br />

				interface Demo {
void method1();
void method2();
?br />}



====================================================================================================================
从编E层面看abstract class和interface

abstract class在Java语言中表C的是一U承关p,一个类只能使用一ơ承关p?br />一个类却可以实现多个interface

在abstract class的定义中Q我们可以赋予方法的默认行ؓ
在interface的定义中Q方法却不能拥有默认行ؓ

======================================================================================================================
例如要设计一个Ş状类MShapeQ从此类可以z 方Ş、圆形、三角Ş{子cR我们就可以MShapeq个父类设计为abstractcR?br />
比如Q子c都?color 属性,因此可以?color q个数据成员Q以及给 color 赋值的method均设计在父类中,
q样׃用在每个子类中设计相同的代码来处?color q个属性?br />而如果想计算几何形状的面U,׃各个几何形状的面U计方式都不相同,所以把计算面积的method的处理放在父cM׃合适,
但由于每个几何Ş犉需要用到这个methodQ因此可以在父类中只声明计算面积的method "area()"Q而把具体的处理放在子cM定义?br />xarea()设计为抽象类?br />
以下是程序代码:
//abstractc?MShape      

				abstract class MShape
{
        protected String color;   //数据成员
        public void setColor(String mcolor)   //一般方法,定义了具体的处理
        {
           color=mcolor;
        }
        abstract void area();   //抽象ҎQ没有定义具体的处理
}



//方Şc?br />

				class RectShape extends MShape
{      
        int width,height,rectarea;    
        public RectShape(int w,int h)
        {  
                 width=w;
                 height=h;        
        }
        public void area()  //计算面积
        {          
          rectarea=width*height;
        }
}



//使用

				public class myapp
{
        public static void main(String args[])
        {
          RectShape rect=new RectShape(3,6);
          rect.setColor("Red");
          rect.area();
          System.out.print("color="+rect.color+", area="+rect.rectarea);
        }
}



由此可见Q在abstract中不仅可以定义一般的ҎQ即可以q行具体处理的方法)Q还可以象interface一样定义抽象方法?br />而在interface中只能定义抽象方法?/font>



Merlin 2006-07-11 19:53 发表评论
]]>
Ļձ޾þþ | þֻоƷ18| ĻۺϾþ| þþžžƷ99Ʒ| Ʒ˾þþ| ŷպþAV| þ99Ʒþþþþ| 97þþþ| þþƵ| 鶹ƷþþƷɫۺ| ɫɫݺɫۺϾþ| þþƷһպ| þ99ƷۺϹҳ| þ99Ƶ| þþ99Ʒһ| ޵һAVվþþƷ˵AV| þ91ᆱƷ2020| ŷҹAŴƬþ| ҹӰԺþþƷѿһ | ɫۺϾþ| þùƷҰAV| ҹƷþþþó| þۺϹapp| þþþ޾Ʒ| ޹Ʒþ66| պݺݾþ͵͵ɫۺ0| ɫվwwwþþ| Ʒ9999þþþ| ˾Ʒþ޸岻 ˾Ʒþ޸岻 ˾Ʒþ | þþƷA㽶 | ˾þһ| 99þùۺϾƷ| ھƷþþþ| þĻ| Ʒþþþþ޾Ʒ| ձƷþþþӰԺձ| AV12þ| þþþù˾Ʒҹ| ľƷþþþþò| ޳˾þ| ޹þþþƷС˵|