﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-杨彩的Java博客-随笔分类-java学习总结</title><link>http://www.blogjava.net/yangcai/category/19591.html</link><description>醉里挑灯看剑,梦里吹雨听风.仗剑独走天涯,试问谁与争锋!</description><language>zh-cn</language><lastBuildDate>Sun, 18 Mar 2007 04:52:11 GMT</lastBuildDate><pubDate>Sun, 18 Mar 2007 04:52:11 GMT</pubDate><ttl>60</ttl><item><title>Java经典试题及答案</title><link>http://www.blogjava.net/yangcai/archive/2007/03/18/104540.html</link><dc:creator>杨彩</dc:creator><author>杨彩</author><pubDate>Sun, 18 Mar 2007 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/yangcai/archive/2007/03/18/104540.html</guid><wfw:comment>http://www.blogjava.net/yangcai/comments/104540.html</wfw:comment><comments>http://www.blogjava.net/yangcai/archive/2007/03/18/104540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangcai/comments/commentRss/104540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangcai/services/trackbacks/104540.html</trackback:ping><description><![CDATA[
		<p>第一，谈谈final, finally, finalize的区别。 <br />　　 final—修饰符（关键字）如果一个类被声明为final，意味着它不能再派生出新的子类，不能作为父类被继承。因此一个类不能既被声明为 abstract的，又被声明为final的。将变量或方法声明为final，可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值，而在以后的引用中只能读取，不可修改。被声明为final的方法也同样只能使用，不能重载。 <br />　　finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常，那么相匹配的 catch 子句就会执行，然后控制就会进入 finally 块（如果有的话）。 <br />　　finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的，因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 <br />　　第二，Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)? <br />　　匿名的内部类是没有名字的内部类。不能extends(继承) 其它类，但一个内部类可以作为一个接口，由另一个内部类实现。 <br />　　第三，Static Nested Class 和 Inner Class的不同，说得越多越好(面试题有的很笼统)。 <br />　　Nested Class （一般是C++的说法），Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&amp;page=1 </p>
		<p>　　 注： 静态内部类（Inner Class）意味着1创建一个static内部类的对象，不需要一个外部类对象，2不能从一个static内部类的一个对象访问一个外部类对象 <br />　　第四，&amp;和&amp;&amp;的区别。 <br />　　&amp;是位运算符。&amp;&amp;是布尔逻辑运算符。 <br />　　第五，HashMap和Hashtable的区别。 <br />　　都属于Map接口的类，实现了将惟一键映射到特定的值上。 <br />　　 HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 <br />　　 Hashtable 类似于 HashMap，但是不允许 null 键和 null 值。它也比 HashMap 慢，因为它是同步的。 <br />　　第六，Collection 和 Collections的区别。 <br />　　Collections是个java.util下的类，它包含有各种有关集合操作的静态方法。 <br />　　 Collection是个java.util下的接口，它是各种集合结构的父接口。 <br />　　第七，什么时候用assert。 <br />　　断言是一个包含布尔表达式的语句，在执行这个语句时假定该表达式为 true。如果表达式计算为 false，那么系统会报告一个 Assertionerror。它用于调试目的： <br /> 　　assert(a &gt; 0); // throws an Assertionerror if a &lt;= 0 </p>
		<p>　　 断言可以有两种形式： <br />　　 assert Expression1 ; <br />　　 assert Expression1 : Expression2 ; <br />　　 Expression1 应该总是产生一个布尔值。 <br />　　 Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。 <br />　　 断言在默认情况下是禁用的。要在编译时启用断言，需要使用 source 1.4 标记： <br />　　 javac -source 1.4 Test.java <br />　　 要在运行时启用断言，可使用 -enableassertions 或者 -ea 标记。 <br />　　 要在运行时选择禁用断言，可使用 -da 或者 -disableassertions 标记。 <br />　　 要系统类中启用断言，可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。 <br />　　可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过，断言不应该用于验证传递给公有方法的参数，因为不管是否启用了断言，公有方法都必须检查其参数。不过，既可以在公有方法中，也可以在非公有方法中利用断言测试后置条件。另外，断言不应该以任何方式改变程序的状态。 </p>
		<p>
				<br />　　第八，GC是什么? 为什么要有GC? (基础)。 <br />　　GC是垃圾收集器。Java 程序员不用担心内存管理，因为垃圾收集器会自动进行管理。要请求垃圾收集，可以调用下面的方法之一： <br /> 　　System.gc() <br />　　 Runtime.getRuntime().gc() <br />　　第九，String s = new String("xyz");创建了几个String Object? <br />　　两个对象，一个是“xyx”,一个是指向“xyx”的引用对象s。 <br />　　第十，Math.round(11.5)等於多少? Math.round(-11.5)等於多少?<br />　　<br />　　 Math.round(11.5)返回（long）12，Math.round(-11.5)返回（long）-11; <br />　　第十一，short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?</p>
		<p>　　short s1 = 1; s1 = s1 + 1;有错，s1是short型，s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。 <br />　　第十二，sleep() 和 wait() 有什么区别? 搞线程的最爱 <br />　　sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后，线程不一定立即恢复执行。这是因为在那个时刻，其它线程可能正在运行而且没有被调度为放弃执行，除非(a)“醒来”的线程具有更高的优先级。</p>
		<p>　　 (b)正在运行的线程因为其它原因而阻塞。 <br />　　 wait()是线程交互时，如果线程对一个同步对象x 发出一个wait()调用，该线程会暂停执行，被调对象进入等待状态，直到被唤醒或等待时间到。 <br />　　第十三，Java有没有goto? <br />　　Goto—java中的保留字，现在没有在java中使用。 <br />　　第十四，数组有没有length()这个方法? String有没有length()这个方法？ <br />　　数组没有length()这个方法，有length的属性。 <br />　　 String有有length()这个方法。 <br />　　第十五，Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? <br />　　方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现，重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数，我们说该方法被重写 (Overriding)。子类的对象使用这个方法时，将调用子类中的定义，对它而言，父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法，它们或有不同的参数个数或有不同的参数类型，则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 <br />　　第十六，Set里的元素是不能重复的，那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? <br />　　Set里的元素是不能重复的，那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。 <br />　　 equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖，为的是当两个分离的对象的内容和类型相配的话，返回真值。 <br />　　第十七，给我一个你最常见到的runtime exception。 <br />　　ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, <br />　　 ImagingOpException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFORMatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException </p>
		<p>　　第十八，error和exception有什么区别? <br />　　error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 <br />　　 exception 表示一种设计或实现问题。也就是说，它表示如果程序运行正常，从不会发生的情况。 </p>
		<p>　　 第十九，List, Set, Map是否继承自Collection接口? <br />　　List，Set是 <br />　　Map不是 <br />　　第二十，abstract class和interface有什么区别? <br />　　声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 <br />　　接口（interface）是抽象类的变体。在接口中，所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的，没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似，除了该实现类不能从接口定义中继承行为。当类实现特殊接口时，它定义（即将程序体给予）所有这种接口的方法。然后，它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类，它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换，instanceof 运算符可以用来决定某对象的类是否实现了接口。 <br />　　第二十一，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized? <br />　　都不能 <br />　　第二十二，接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? <br />　　接口可以继承接口。抽象类可以实现(implements)接口，抽象类是否可继承实体类，但前提是实体类必须有明确的构造函数。 <br />　　第二十三，启动一个线程是用run()还是start()? <br />　　启动一个线程是调用start()方法，使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 <br />　　第二十四，构造器Constructor是否可被override? <br />　　构造器Constructor不能被继承，因此不能重写Overriding，但可以被重载Overloading。 <br />　　第二十五，是否可以继承String类? <br />　　String类是final类故不可以继承。 </p>
		<p>　　第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法? <br />　　不能，一个对象的一个synchronized方法只能由一个线程访问。 </p>
		<p>　　 第二十七，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后? <br />　　会执行，在return前执行。 </p>
		<p>　　 第二十八，编程题: 用最有效率的方法算出2乘以8等於几? <br />　　有C背景的程序员特别喜欢问这种问题。 <br />　　第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对? <br />　　不对，有相同的hash code。 <br />　　第三十，当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递? <br />　　是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时，参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变，但对象的引用是永远不会改变的。 <br />　　第三十一，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上? <br />　　switch（expr1）中，expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。 <br />　　第三十二，编程题: 写一个Singleton出来。 <br />　　Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。</p>
		<p> </p>
<img src ="http://www.blogjava.net/yangcai/aggbug/104540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangcai/" target="_blank">杨彩</a> 2007-03-18 09:30 <a href="http://www.blogjava.net/yangcai/archive/2007/03/18/104540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA代码编写的30条建议</title><link>http://www.blogjava.net/yangcai/archive/2007/01/29/96605.html</link><dc:creator>杨彩</dc:creator><author>杨彩</author><pubDate>Mon, 29 Jan 2007 12:21:00 GMT</pubDate><guid>http://www.blogjava.net/yangcai/archive/2007/01/29/96605.html</guid><wfw:comment>http://www.blogjava.net/yangcai/comments/96605.html</wfw:comment><comments>http://www.blogjava.net/yangcai/archive/2007/01/29/96605.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangcai/comments/commentRss/96605.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangcai/services/trackbacks/96605.html</trackback:ping><description><![CDATA[
		<p>列举了大量有用的建议，帮助大家进行低级程序设计，并提供了代码编写的一般性指导： </p>
		<p>　　(1) 类名首字母应该大写。字段、方法以及对象（句柄）的首字母应小写。对于所有标识符，其中包含的所有单词都应紧靠在一起，而且大写中间单词的首字母。例如： </p>
		<p>　　ThisIsAClassName </p>
		<p>　　thisIsMethodOrFieldName </p>
		<p>　　若在定义中出现了常数初始化字符，则大写static final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。 </p>
		<p>　　Java包（Package）属于一种特殊情况：它们全都是小写字母，即便中间的单词亦是如此。对于域名扩展名称，如com，org，net或者edu等，全部都应小写（这也是Java 1.1和Java 1.2的区别之一）。 </p>
		<p>　　(2) 为了常规用途而创建一个类时，请采取“经典形式”，并包含对下述元素的定义： </p>
		<p>equals() </p>
		<p>hashCode() </p>
		<p>toString() </p>
		<p>clone()（implement Cloneable） </p>
		<p>implement Serializable </p>
		<p>　　(3) 对于自己创建的每一个类，都考虑置入一个main()，其中包含了用于测试那个类的代码。为使用一个项目中的类，我们没必要删除测试代码。若进行了任何形式的改动，可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。 </p>
		<p>　　(4) 应将方法设计成简要的、功能性单元，用它描述和实现一个不连续的类接口部分。理想情况下，方法应简明扼要。若长度很大，可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用（有些时候，方法必须非常大，但它们仍应只做同样的一件事情）。 </p>
		<p>　　(5) 设计一个类时，请设身处地为客户程序员考虑一下（类的使用方法应该是非常明确的）。然后，再设身处地为管理代码的人考虑一下（预计有可能进行哪些形式的修改，想想用什么方法可把它们变得更简单）。 </p>
		<p>　　(6) 使类尽可能短小精悍，而且只解决一个特定的问题。下面是对类设计的一些建议： </p>
		<p>　　■一个复杂的开关语句：考虑采用“多形”机制 </p>
		<p>　　■数量众多的方法涉及到类型差别极大的操作：考虑用几个类来分别实现 </p>
		<p>　　■许多成员变量在特征上有很大的差别：考虑使用几个类 </p>
		<p>　　(7) 让一切东西都尽可能地“私有”——private。可使库的某一部分“公共化”（一个方法、类或者一个字段等等），就永远不能把它拿出。若强行拿出，就可能破坏其他人现有的代码，使他们不得不重新编写和设计。若只公布自己必须公布的，就可放心大胆地改变其他任何东西。在多线程环境中，隐私是特别重要的一个因素——只有private字段才能在非同步使用的情况下受到保护。 </p>
		<p>　　(8) 谨惕“巨大对象综合症”。对一些习惯于顺序编程思维、且初涉OOP领域的新手，往往喜欢先写一个顺序执行的程序，再把它嵌入一个或两个巨大的对象里。根据编程原理，对象表达的应该是应用程序的概念，而非应用程序本身。 </p>
		<p>　　(9) 若不得已进行一些不太雅观的编程，至少应该把那些代码置于一个类的内部。 </p>
		<p>　　(10) 任何时候只要发现类与类之间结合得非常紧密，就需要考虑是否采用内部类，从而改善编码及维护工作（参见第14章14.1.2小节的“用内部类改进代码”）。 </p>
		<p>　　(11) 尽可能细致地加上注释，并用javadoc注释文档语法生成自己的程序文档。 </p>
		<p>　　(12) 避免使用“魔术数字”，这些数字很难与代码很好地配合。如以后需要修改它，无疑会成为一场噩梦，因为根本不知道“100”到底是指“数组大小”还是“其他全然不同的东西”。所以，我们应创建一个常数，并为其使用具有说服力的描述性名称，并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。 </p>
		<p>　　(13) 涉及构建器和异常的时候，通常希望重新丢弃在构建器中捕获的任何异常——如果它造成了那个对象的创建失败。这样一来，调用者就不会以为那个对象已正确地创建，从而盲目地继续。 </p>
		<p>　　(14) 当客户程序员用完对象以后，若你的类要求进行任何清除工作，可考虑将清除代码置于一个良好定义的方法里，采用类似于cleanup()这样的名字，明确表明自己的用途。除此以外，可在类内放置一个boolean（布尔）标记，指出对象是否已被清除。在类的finalize()方法里，请确定对象已被清除，并已丢弃了从RuntimeException继承的一个类（如果还没有的话），从而指出一个编程错误。在采取象这样的方案之前，请确定finalize()能够在自己的系统中工作（可能需要调用System.runFinalizersOnExit(true)，从而确保这一行为）。 </p>
		<p>　　(15) 在一个特定的作用域内，若一个对象必须清除（非由垃圾收集机制处理），请采用下述方法：初始化对象；若成功，则立即进入一个含有finally从句的try块，开始清除工作。 </p>
		<p>　　(16) 若在初始化过程中需要覆盖（取消）finalize()，请记住调用super.finalize()（若Object属于我们的直接超类，则无此必要）。在对finalize()进行覆盖的过程中，对super.finalize()的调用应属于最后一个行动，而不应是第一个行动，这样可确保在需要基础类组件的时候它们依然有效。 </p>
		<p>　　(17) 创建大小固定的对象集合时，请将它们传输至一个数组（若准备从一个方法里返回这个集合，更应如此操作）。这样一来，我们就可享受到数组在编译期进行类型检查的好处。此外，为使用它们，数组的接收者也许并不需要将对象“造型”到数组里。 </p>
		<p>　　(18) 尽量使用interfaces，不要使用abstract类。若已知某样东西准备成为一个基础类，那么第一个选择应是将其变成一个interface（接口）。只有在不得不使用方法定义或者成员变量的时候，才需要将其变成一个abstract（抽象）类。接口主要描述了客户希望做什么事情，而一个类则致力于（或允许）具体的实施细节。 </p>
		<p>　　(19) 在构建器内部，只进行那些将对象设为正确状态所需的工作。尽可能地避免调用其他方法，因为那些方法可能被其他人覆盖或取消，从而在构建过程中产生不可预知的结果（参见第7章的详细说明）。 </p>
		<p>　　(20) 对象不应只是简单地容纳一些数据；它们的行为也应得到良好的定义。 </p>
		<p>　　(21) 在现成类的基础上创建新类时，请首先选择“新建”或“创作”。只有自己的设计要求必须继承时，才应考虑这方面的问题。若在本来允许新建的场合使用了继承，则整个设计会变得没有必要地复杂。 </p>
		<p>　　(22) 用继承及方法覆盖来表示行为间的差异，而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的继承来表示颜色，这是绝对应该避免的：应直接使用一个“颜色”字段。 </p>
		<p>　　(23) 为避免编程时遇到麻烦，请保证在自己类路径指到的任何地方，每个名字都仅对应一个类。否则，编译器可能先找到同名的另一个类，并报告出错消息。若怀疑自己碰到了类路径问题，请试试在类路径的每一个起点，搜索一下同名的.class文件。 </p>
		<p>　　(24) 在Java 1.1 AWT中使用事件“适配器”时，特别容易碰到一个陷阱。若覆盖了某个适配器方法，同时拼写方法没有特别讲究，最后的结果就是新添加一个方法，而不是覆盖现成方法。然而，由于这样做是完全合法的，所以不会从编译器或运行期系统获得任何出错提示——只不过代码的工作就变得不正常了。 </p>
		<p>　　(25) 用合理的设计方案消除“伪功能”。也就是说，假若只需要创建类的一个对象，就不要提前限制自己使用应用程序，并加上一条“只生成其中一个”注释。请考虑将其封装成一个“独生子”的形式。若在主程序里有大量散乱的代码，用于创建自己的对象，请考虑采纳一种创造性的方案，将些代码封装起来。 </p>
		<p>　　(26) 警惕“分析瘫痪”。请记住，无论如何都要提前了解整个项目的状况，再去考察其中的细节。由于把握了全局，可快速认识自己未知的一些因素，防止在考察细节的时候陷入“死逻辑”中。 </p>
		<p>　　(27) 警惕“过早优化”。首先让它运行起来，再考虑变得更快——但只有在自己必须这样做、而且经证实在某部分代码中的确存在一个性能瓶颈的时候，才应进行优化。除非用专门的工具分析瓶颈，否则很有可能是在浪费自己的时间。性能提升的隐含代价是自己的代码变得难于理解，而且难于维护。 </p>
		<p>　　(28) 请记住，阅读代码的时间比写代码的时间多得多。思路清晰的设计可获得易于理解的程序，但注释、细致的解释以及一些示例往往具有不可估量的价值。无论对你自己，还是对后来的人，它们都是相当重要的。如对此仍有怀疑，那么请试想自己试图从联机Java文档里找出有用信息时碰到的挫折，这样或许能将你说服。 </p>
		<p>　　(29) 如认为自己已进行了良好的分析、设计或者实施，那么请稍微更换一下思维角度。试试邀请一些外来人士——并不一定是专家，但可以是来自本公司其他部门的人。请他们用完全新鲜的眼光考察你的工作，看看是否能找出你一度熟视无睹的问题。采取这种方式，往往能在最适合修改的阶段找出一些关键性的问题，避免产品发行后再解决问题而造成的金钱及精力方面的损失。 </p>
		<p>　　(30) 良好的设计能带来最大的回报。简言之，对于一个特定的问题，通常会花较长的时间才能找到一种最恰当的解决方案。但一旦找到了正确的方法，以后的工作就轻松多了，再也不用经历数小时、数天或者数月的痛苦挣扎。我们的努力工作会带来最大的回报（甚至无可估量）。而且由于自己倾注了大量心血，最终获得一个出色的设计方案，成功的快感也是令人心动的。坚持抵制草草完工的诱惑——那样做往往得不偿失。 </p>
		<p>　　(31) 可在Web上找到大量的编程参考资源，甚至包括大量新闻组、讨论组、邮寄列表等。       <br /></p>
<img src ="http://www.blogjava.net/yangcai/aggbug/96605.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangcai/" target="_blank">杨彩</a> 2007-01-29 20:21 <a href="http://www.blogjava.net/yangcai/archive/2007/01/29/96605.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>