??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲第一精品福利,亚洲一区二区三区AV无码,亚洲成a人片在线看http://www.tkk7.com/ranxiang/category/4382.htmlx于J2SEQJ2EE以及开源方面的技术?/description>zh-cnTue, 27 Feb 2007 08:49:14 GMTTue, 27 Feb 2007 08:49:14 GMT60TIJ阅读W记Q第十四章)http://www.tkk7.com/ranxiang/articles/17964.html冉翔冉翔Thu, 03 Nov 2005 07:17:00 GMThttp://www.tkk7.com/ranxiang/articles/17964.htmlhttp://www.tkk7.com/ranxiang/comments/17964.htmlhttp://www.tkk7.com/ranxiang/articles/17964.html#Feedback0http://www.tkk7.com/ranxiang/comments/commentRss/17964.htmlhttp://www.tkk7.com/ranxiang/services/trackbacks/17964.html阅读全文

冉翔 2005-11-03 15:17 发表评论
]]>
TIJ阅读W记Q第十三章)http://www.tkk7.com/ranxiang/articles/17960.html冉翔冉翔Thu, 03 Nov 2005 07:05:00 GMThttp://www.tkk7.com/ranxiang/articles/17960.htmlhttp://www.tkk7.com/ranxiang/comments/17960.htmlhttp://www.tkk7.com/ranxiang/articles/17960.html#Feedback0http://www.tkk7.com/ranxiang/comments/commentRss/17960.htmlhttp://www.tkk7.com/ranxiang/services/trackbacks/17960.html阅读全文

冉翔 2005-11-03 15:05 发表评论
]]>
TIJ阅读W记Q第十二章)http://www.tkk7.com/ranxiang/articles/17940.html冉翔冉翔Thu, 03 Nov 2005 04:36:00 GMThttp://www.tkk7.com/ranxiang/articles/17940.htmlhttp://www.tkk7.com/ranxiang/comments/17940.htmlhttp://www.tkk7.com/ranxiang/articles/17940.html#Feedback0http://www.tkk7.com/ranxiang/comments/commentRss/17940.htmlhttp://www.tkk7.com/ranxiang/services/trackbacks/17940.html阅读全文

冉翔 2005-11-03 12:36 发表评论
]]>
TIJ阅读W记Q第十一章)http://www.tkk7.com/ranxiang/articles/17937.html冉翔冉翔Thu, 03 Nov 2005 04:05:00 GMThttp://www.tkk7.com/ranxiang/articles/17937.htmlhttp://www.tkk7.com/ranxiang/comments/17937.htmlhttp://www.tkk7.com/ranxiang/articles/17937.html#Feedback0http://www.tkk7.com/ranxiang/comments/commentRss/17937.htmlhttp://www.tkk7.com/ranxiang/services/trackbacks/17937.html   如果E序的对象数量有限,且寿命可知,那么q个E序是相当简单的?br>
数组
  数组与其它容器的区别体现在三个方面:效率Q类型识别以及可以持有primitives。数l是Java提供的,能随机存储和讉Kreference序列 的诸多方法中的,最高效的一U。数l是一个简单的U性序列,所有它可以快速的讉K其中的元素。但是速度是有代h的;当你创徏了一个数l之后,它的定w固 定了Q而且在其生命周期里不能改变。也怽会提议先创徏一个数l,{到快不够用的时候,再创Z个新的,然后旧的数l里的reference全部导到? 的里面。其实(我们以后会讲的)ArrayList是q么做的。但是这U灵zL所带来的开销Q得ArrayList的效率比hl有了明显下降?br>   JavaҎl和容器都做边界查;如果q了界,它旧会给一个RuntimeException。这U异常表明这个错误是q序员造成的,q样你就用不着再在E序里面查了?br>   q有一些泛型容器类包括ListQSet和Map。他们处理对象的时候就好像q些对象都没有自q具体cd一栗也是_容器它所含的元素都看成是 QJava中所有类的根c)Object的。这样你只需要徏一U容器,p把所有类型的对象全都放进厅R从q个角度来看Q这U做法很不错Q只是苦? primitive。如果是帔RQ你q可以用Java的primitive的Wrapperc;如果是变量,那就只能攑֜你自qc里了)。与其他泛型? 器相比,q里体现数组的第二革优势Q创建数l的时候,你也同时指明了它所持有的对象的cdQ这又引ZW三点-Q数l可以持有primitivesQ而容 器却不行Q。也是_它会在编译的时候作cd查,从而防止你插入错误cd的对象,或者是在提取对象的时候把对象的类型给搞错了。Java在编译和q行 旉能阻止你一个不恰当的消息传l对象。所有这q不是说使用容器有什么危险,只是如果~译器能够帮你指定,那么E序q行会更快,最l用户也会较收? E序q行异常的骚扰?br>   从效率和cd查的角度来看Q用数lL没错的。但是,如果你在解决一个更Z般的问题Q那数组׃昑־功能太弱了点?br>  
  数组是第一的对象
    不管你用的是那种cd的数l,数组的标识符实际上都是一个“创建在堆(heapQ里的实实在在的对象的”reference。实际上是那个对象持有其他对 象的reference。你卛_以用数组的初始化语句Q隐含地创徏q个对象Q也可以用new表达式,明确地创个对象,只读的length属性能告诉? 数组能存储多元素。它是数l对象的一部分Q实际上也是你唯一能访问的属性或ҎQ。‘[]’语法是另一条访问数l对象的途径?br>     你没法知道数l里面究竟放了多元素,因ؓlength只是告诉你数l能攑֤元素,也就是说是数l对象的定wQ而不是它真正已经持有的元素的数量。但 是,创徏数组对象的时候,它所持有的reference都会被自动地初始化ؓnullQ所以你可以通过查数l的某个“槽位”是否ؓnullQ来判断它是 否持有对象。以此类推,primitive的数l,会自动来数字初始化ؓӞ字符初始化ؓ(char)0Qboolean初始化ؓfalse?br>     
  primitive容器
    容器cd能持有Object对象的reference。而数l除了能持有Objects的reference之外Q还可以直接持有primitive。当 然可以用诸如IntegerQDouble之类的wrappercR把primitive的值放到容器中QEq样LҎ怪的。此外, primitive数组的效率要比wrappercd器的高出许多?br>     当然Q如果你使用primitive的时候,q需要U“能随需要自动扩展的”容器类的灵zL,那就不能用数l了。你只能用容器来存储primitive的wrappercR?br>  
  q回一个数l?br>     假设你写了一个方法,它返回的不是一个而是一l东ѝ那么在Java中就可以q回的“就是一个数l”。与C++不同Q你永远也不必ؓJava的数l操心-Q只要你q需要它Q它p在;一旦你用完了,垃圾回收器会帮你把它打扫q净?br>  
  Arraysc?br>     java.util里面有一个Arraysc,它包括了一l可用于数组的staticҎQ这些方法都是一些实用工兗其中有四个基本ҎQ用来比较两? 数组是否相等的equals()Q用来填充的fill()Q用来对数组q行排序的sort()Q以及用于在一个已排序的数l中查找元素? binarySearch()。所有这些方法都对primitive和Objectq行了重载。此外还有一个asList()ҎQ它接受一个数l,然后 把它转成一个List容器?br>     虽然Arraysq是有用的,但它的功能ƈ不完整。D例来_如果它能让我们不用写for循环p直接打印数组Q那好了。此外,正如你所看到的fill ()只能用一个值填数组。所以,如果你想把随即生成的数字填进数组的话Qfill()是无能ؓ力的?br>  
  复制一个数l?br>     Java标准cd提供了一个System.arraycopy()的staticҎ。相比for循环Q它能以更快的速度拯数组。System.arraycopy()Ҏ有类型都作了重蝲?br>     对象数组和primitive数组都能拯。但是如果你拯的是对象数组Q那么你只拷贝了它们的referenceQ-对象本n不会被拷贝。这被成为浅拯Qshallow copyQ?br>  
  数组的比?br>     Z能比较数l是否完全相{,Arrays提供了经重蝲的equals()Ҏ。当Ӟ也是针对各种primitive以及Object的。两个数l要? 完全相等Q他们必L相同数量的元素,而且数组的每个元素必M另一个数l的相对应的位置上的元素相等。元素的相等姓,用equals()判断。(对于 primitiveQ它会用其wrappercȝequals()Q比如int使用Integer.equals()。)?br>  
  数组元素的比?br>     Java里面有两U能让你实现比较功能的方法。一是实现java.lang.Comparable接口Qƈ以此实现cZ自有的”比较方法。这是一个很? 的接口,它只有一个方法compareTo()。这个方法能接受另一个对象作为参敎ͼ如果现有对象比参数小Q它׃q回一个负敎ͼ如果相同则返回零Q如? 现有的对象比参数大,它就q回一个正数?br>     static randInt()Ҏ会生成一个介??00之间的正数?br>     现在架设Q有人给你一个没有实现Comparable接口的类Q或者这个类实现了Comparable接口Q但是你发现它的工作方式不是你所希望的,于是 要重新定义一个新的比较方法。Java没有强求你一定要把比较代码塞q类里,它的解决Ҏ是用“策略模式(strategy design patternQ”。有了策略之后,你就能把会变的代码封装到它自qc里Q即所谓的{略对象strategy objectQ。你把策略对象交l不会变的代码,然后用它q用{略完成整个法。这P你就可以用不同的{略对象来表CZ同的比较ҎQ然后把它们都交l? 同一个排序程序了。接下来p“通过实现Comparator接口”来定义{略对象了。这个接口有两个Ҏcompare()和equals()。但是除 非是有特D的性能要求Q否则你用不着d现equals()。因为只要是c,它就都隐含地l承自ObjectQ而Object里面已经有了一? equals()了。所以你可以用缺省的Object的equals()Q这样就已经满接口的要求了?br>     Collectionsc里专门有一个会q回与对象自有的比较法相反的Comparator的方法。它能很L地被用到CompType上面?br>     Collections.reverseOrder()q回了一个Comparator的reference?br>     compare()Ҏ会根据第一个参数是于Q等于还是大于第二个参数Q分别返回负整数Q零或是正整数?br>  
  数组的排?br>     有了内置的排序方法之后,你就能对M数组排序了,不论是primitive的还是对象数l的Q只要它实现了Comparable接口或有一个与之相关的Comparator对象p了?br>     Java标准cd所用的排序法已经作了优化Q-对primitiveQ它用的是“快速排序(QuicksortQ”,对对象,它用的是“稳定合q排? Qstable merge sortQ”。所以除非是prolier表明排序法是瓶颈,否则你不用ؓ性能担心?br>     
  查询有序数组
    一旦数l排完序Q你p用Arrays.binarySearch()q行快速查询了。但是切忌对一个尚未排序的数组使用binarySearch()Q因么做的结果是没意义的?br>     如果Arrays.binarySearch()扑ֈ了,它就q回一个大于或{于0的倹{否则它p回一个负|而这个负D表达的意思是Q如果你手动l护q个数组的话Q这个值应该插在哪个ؓ止。这个值就是:
    -(插入?-1
    “插入点”就是,在所有“比要找的那个值”更大gQ最的那个值的下标Q或者,如果数组中所有的值都比要扄值小Q它是a.size()?br>     如果数组里面有重复元素,那它不能保证会返回哪一个。这个算法不支持重复元素Q不q它也不报错。所以,如果你需要的是一个无重复元素的有序序列的话,那么 可以考虑使用本章后面所介绍的TreeSetQ支持【排序顺序“sorted order”】)和LinkedHashSetQ支持【插入顺序“sorted order”】)。这两个cM帮你照看所有细节。只有在遇到性能瓉的时候,你才应该用手动维护的数组来代替这两个cR?br>     如果排序的时候用CComparatorQ针对对象数l,primitive数组不允怋用ComparatorQ,那么binarySearch()的时候,也必M用同一个ComparatorQ用q个Ҏ的重载版Q?br>  
  数组部分的ȝ
    总而言之,如果你要持有一l对象,首选,同时也是效率最高的选择Q应该是数组。而且Q如果这是一lprimitive的话Q你也只能用数组。还有一些更? 一般的情况Q也是写程序的时候还不知道要用多对象,或者要用一U更复杂方式来存储对象情cؓ此,Java提供了“容器类Qcontainer classQ”。其基本cd有ListQSet和Map?br>     它们q有一些别的特性。比方说Set所持有的对象,个个都不同,Map则是一个“关联性数l(associative arrayQ”,它能在两个对象之间徏立联pR此外,与数l不同,它们q能自动调整大小Q所以你可以往里面放Q意数量的对象?br>

容器?br>   Java2的重新设计了1.0?.1里面那个表现差劲的容器类。新的设计更紧凑也更合理。同时它也补齐了容器cd的功能,提供了链表(linked listQ,队列QqueueQ和双向队列QdequesQ读成“decks”)q几U数据结构的功能?br>   Java2的容器类要解决“怎样持有对象”,而它把这个问题分成两c:
    1。CollectionQ通常是一l有一定规律的独立元素。List必须按照特定的顺序持有这些元素,而Set则不能保存重复的元素。(bag没有q个限制Q但是Java的容器类库没有实现它Q因为List已经提供q种功能了)
    2。MapQ一l以“键Q-值”(key-valueQŞ式出现的pair。初看上去,它应该是一个pair的CollectionQ但是真q么d? 话,它就会变得很滑稽Q所以还是把q个概念独立列出来ؓ好。退一步说Q真的要用到Map的某个自q时候,创徏一个Collection也是很方便的? Map可以q回“键QkeyQ的”SetQ值的CollectionQ或者pair的Set。和数组一PMap不需要什么修改,p很容易地扩展成多 l。你只要直接把Map的D成Map可以了Q然后它的值再是MapQ依此类推)?br>   Java的容器类分成两种基本cd。它们的区别在Q每个位|能攑֤对象。Collection只允许每个位|上放一个对象(q个名字有点误导Q因为容 器类库也常被l称为collectionsQ。它包括“以一定顺序持有一l对象”的ListQ以及“只能允许添加不重复的对象”的Set? ArrayList是一UListQ而HashSet则是一USet。你可以用add()Ҏ往Collection里面加对象?br>   Map保存的是“键QkeyQ-Q值”Ş式的pairQ很像是一个微型数据库?br>   Map又被UCؓ兌性数l(associative arrayQ。你可以用put()Ҏ往Map里面加元素。它接受键-Q值Ş式pair作参数?br>   fill()ҎqؓCollection和Map作了重蝲。输出在默认情况下用容器类的toString()Ҏ。打印出来的Collection? 用方括号括v来,元素与元素之间用逗号分开。Map会用花括hhQ键和g间用{号联v来(键在左边Q值在双Q?br>   List会老老实实地持有你所输入的所有对象,既不做排序也不做~辑。Set则每个对象只接受一ơ,而且q要用它自己的规则对元素q行重新排序Q一般情? 下,你关心的只是Set包没包括某个对象Q而不是它到底排在哪里Q-如果是那P你最好还是用ListQ。而Map也不接收重复的pairQ至于是不是? 复,要由key来决定。此外,它也有它自己的内部排序规则,不会受输入顺序媄响。如果插入顺序是很重要的Q那你就只能使用LinkedHashSet? LinkedHashMap了?br>  
  填充容器
    和Arrays一PCollection也有一个叫Collections的辅助类Q它包含了一些静态的实用工具ҎQ其中就有一个fill()。这? fill()也只是把同一个对象的reference复制到整个容器,而且它还只能为ListQ不能ؓSet和Map工作?br>

容器的缺点:不知道对象的cd
  Java的容器有个缺点,是往容器里面攑֯象的时候,会把对象的类型信息给弄丢了。这是因为开发容器类的程序员不会知道你要用它来保存什么类型的对象Q? 而让容器仅只保存特定cd的对象又会媄响它的通用性。所以容器被做成只有持有ObjectQ也是所有对象的根类的referenceQ这样它p持有? 何类型的对象了。(当然不包括primitiveQ因为它们不是对象,也没有承别的对象。)q是一个很了不LҎQ只是:
  1Q由于在对象放入容器的时候,它的cd信息被扔掉了Q所以容器对“能往里面加什么类型的对象”没有限制。比方说Q即使你惌它只持有catQ别Z能很L地把dog放进厅R?br>   2Q由于对象的cd信息没了Q容器只知道它持有的Object的referenceQ所以对象在使用之前q必进行类型{换?br>   好的一面是QJava不会让你误用放进容器里的对象。假设你往cat的容器里面扔了个dogQ然后要把这个容器里的所有对象都当cat来用Q当你把dog 的reference从cat的容器里面拉出来Qƈ且试囑ְ它{换成cat的时候,׃引发一个RuntimeException?br>   ArrayList的用法也是很单:先创Z个,用add()把对象放q去Q要用的时候再lget()传一个下标-Q就跟用数组差不多,只是不需要用? 括号了。ArrayList也有一个size()ҎQ它会告诉你容器里面有多对象,q样你就不会_心大意地过了界然后引发异常了?br>  
  有时即不正它也能q行
    有时Q即使不把对象{换成原先的类型,它好像也能正常工作。有一U情冉|较特D:String能从~译器哪里得C些能使之q稳工作的特D帮助。只要编? 器没能得到它所期望的String对象Q它׃调用toString()。这个方法aObject定义Q能被Q何Javac覆写。它所q回的String 对象Q会被用CQ何要用它的地斏V?br>     于是只要覆写了类的toString()ҎQ你p打印对象了?br>  
  做一个类型敏感的ArrayList
 
  参数化类型(Parameterized typesQ?br>
q代?br>   无论是哪U容器,你都得有办法既能放东西进去,也能拿东西出来。毕竟,容器的主要Q务就是存攑֯象。ArrayList的add()是用来放东西的Q? get()则是把对象拿出来的办法。ArrayList恨灵z;你可以随时提取Q何东西,q且换一个下标,马上p选择另一个元素?br>   “P代器Qiterator 又是一个设计模式)”是一个对象,它的d是,能在让“客L序在不知道,或者不兛_他所处理的是什么样的底层序列结构”的情况下,p在一个对象序列中 前后UdQƈ选取其中的对象。此外P代器q是一U通常所说的“轻量”的对象Q既创徏代h很小的对象?br>   Java的Iterator属于有q种限制的P代器。它做不了很多事情,除了Q?br>     1Q用iterator()Ҏ叫容器传l你一个Iterator对象。第一ơ调用Iterator的next()Ҏ的时候,它就会传l你序列中的W一个元素?br>     2Q用next()Ҏ获取序列中的下一个对象?br>     3Q用hasNext()Ҏ查询序列中是否还有其他对象?br>     4Q用remove()Ҏ删除q代器所q回的最后一个元素?br>     p么多了。这只是q代器的一个恨单的实现Q不q还是很强大Q对List来说Q还有一个更_y的ListIteratorQ?br>  
  不经意的递归QUnintended recursionQ?br>     ׃Java的标准容器类Q同其它cMP也是l承Object的,因此它们也有一个toString()Ҏ。这个方法已l被覆写了,所以它能生成一? 表示它自׃及所有它所保存的对象的String。比如ArrayList的toString()Ҏ׃遍历ArrayList的每个元素,然后调用? 们的toString()Ҏ。假设你要打印类的地址。好像最直接的办法就是用this。但是会出现很多异常Q解决的办法是去调用Object? toString()ҎQ它是q这zȝ。所以不要用thisQ应该写super.toString()?br>

容器分类?br>   Ҏ~程的需要,Collection和Map分别有好几个实现。实际上只有三种容器lgQ-MapQList和SetQ而每U又有两C个实现?br>   与存攑֯象有关的接口包括Collection, List, Set和Map。在理想情况下,l大多数代码应该只同q些接口打交道,只是在创建容器的时候才要精地指明它的切cd?br>   add()Q就像它的名字告诉我们的Q会把新的元素放qCollection。但是文里面特别仔l地声明Q“add()会确保容器包含指定的元素”。这 句话是说lSet的,因ؓ它只d原先没有的元素,对ArrayList或其他ListQadd()L“把它放q去”,因ؓListq不兛_它是不是? 存了相同的元素?br>   Collection都能用iterator()Ҏ产生一个Iterator。这里,我们用Iterator来遍历整个CollectionQ然后把他们打印出来?br>

Collection的功?br>   下面q张表给ZCollection的所有功能,也就是你能用Set和List做什么事Q不包括从Object自动l承q来的方法)。(Listq有一些额外的功能。)Map不是l承Collection的,所以我们会区别对待?br>
    boolean add(Object)Q确保容器能持有你传l它的那个参数。如果没有把它加q去Q就q回false。(q是个“可选”的ҎQ本章稍后会再作解释。)
    boolean addAll(Collection)Q加入参数Collection所含的所有元素。只要加了元素,p回true?br>     void clear()Q清除容器所保存的所有元素。(“可选”)
    boolean contains(Object)Q如果容器持有参数ObjectQ就q回true?br>     boolean containsAll(Collection)Q如果容器持有参数Collection所含的全部元素Q就q回true?br>     boolean isEmpty()Q如果容器里面没有保存Q何元素,p回true?br>     Iterator iterator()Q返回一个可以在容器的各元素之间Ud的Iterator?br>     boolean removeAll(Collection)Q删除容器里面所有参数Collection所包含的元素。只要删q东西,p回true。(“可选”)
    boolean retainAll(Collection)Q只保存参数Collection所包括的元素(集合Z“交集”的概念Q。如果发生过变化Q则q回true。(“可选”)
    int size()Q返回容器所含元素的数量?br>     Object[] toArray()Q返回一个包含容器中所有元素的数组?br>     Object[] toArray(Object[] a)Q返回一个包含容器中所有元素的数组Q且q个数组不是普通的Object数组Q它的类型应该同参数数组a的类型相同(要做cd转换Q?br>   注意Q这里没有能q行随机讉K的get()Ҏ。这是因为Collectionq包括Set。而Set有它自己的内部顺序(因此随即讉K事毫无意义的Q。所以如果你要检查Collection的元素,你就必须使用q代器?br>   接下来讲List, Set和Map的各U实CQ每讲一U容器,我都会(用星P告诉你默认情况下应该选用哪种实现?br>  
  List的功?br>     List的基本用法事相当但的。虽然绝大多数时候,你只是用add()加对象,用get()取对象,用iterator()获取q个序列的IteratorQ但Listq有一些别的很有用的方法?br>     实际上有两种ListQ擅长对元素q行随机讉K的,较常用的ArrayListQ和更强大的LinkedList。LinkedList不是为快速的随机讉K而设计的Q但是它却有一l更加通用的方法?br>       LiskQ接口)QList的最重要的特征就是有序;它会保以一定的序保存元素。List在Collection的基上添加了大量ҎQ之能在序 列中间插入和删除元素。(只对LinkedList推荐使用。)List可以刉ListIterator对象Q你除了能用它在List的中间插入和删除 元素之外Q还能用它沿两个Ҏ遍历List?br>       ArrayList*Q一个用数组实现的List。能q行快速的随机讉KQ但是往列表中间插入和删除元素的时候比较慢。ListIterator只能用在 反向遍历ArrayList的场合,不要用它来插入和删除元素Q因为相比LinkedListQ在ArrayList里面用ListIterator的系 l开销比较高?br>       LinkedListQ对序讉Kq行了优化。在List中间插入和删除元素的代h也不高。随问的速度相对较慢。(用ArrayList吧。)此外? q有addFirst()QaddLast()QgetFirst()QgetLast()QremoveFirst()和removeLast(){方 法(q些ҎQ接口和基类均未定义Q,你能把它当成栈(stackQ,队列QqueueQ或双向队列QdequeQ来用?br>     CQ容器只是一个存储对象的盒子。如果这个笑盒子能帮你解x有的问题Q那你就用不着取管它事怎么实现的(在绝大多数情况下Q这是用对象的基本? 念)。如果开发环境里面还有一些别的,会造成固定的性能开销的因素存在,那么ArrayList和LinkedList之间的性能差别׃变得不那么重? 了。你只需要它们中的一个,你甚臛_以想象有q样一U“完”的抽象容器Q它能根据用途,自动地切换其底层的实现?br>  
  用LinkedList做一个栈
    “栈QstackQ”有时也被称为“后q先出”(LIFOQ的容器。就是说Q最后一个被“压”进栈中的东西,会第一个“弹”出来。同其他Java容器一 P压进d弹出来的东西都是ObjectQ所以除非你只用Object的功能,否则必d弹v来的东西q行cd转换?br>     LinkedList的方法能直接实现栈的功能Q所以你完全可以不写Stack而直接用LinkedList?br>     如果你只惌栈的功能Q那么承就不太合适了Q因为承出来的是一个拥有LinkedList的所有方法的cR?br>  
  用LinkedList做一个队?br>     队列QqueueQ是一个“先q先出”(FIFOQ容器。也是Q你把一端把东西放进去,从另一端把东西取出来。所以你放东西的序也就是取东西的顺序? LinkedList有支持队列的功能的方法,所以它也能被当作Queue来用?br>     q能很轻易地用LinkedList做一个dequeQ双向队列)。它很像队列Q只是你可以从Q意一端添加和删除元素?br>
Set的功?br>   Set的接口就是Collection的,所以不像那两个ListQ它没有额外的功能。实际上Set确实实是一个CollectionQ-只不q行? 方式不同|了。(q是l承和多态性的完美q用Q表达不同地行ؓ。)Set会拒l持有多个具有相同值的对象的实例(对象的“值”又是由什么决定的呢?q个? 题比较复杂,我们以后会讲Q?br>     SetQ接口)Q加入Set的每个元素必L唯一的;否则QSet是不会把它加q去的。要惛_qSetQObject必须定义equals()Q这h? 标明对象的唯一性。Set的接口和Collection的一怸栗Set的接口不保证它会用哪U顺序来存储元素?br>     HashSet*Qؓ优化查询速度而设计的Set。要放进HashSet里面的Objectq得定义hashCode()?br>     TreeSetQ是一个有序的SetQ其底层是一颗树。这样你p从Set里面提取一个有序序列了?br>     LinkedHashSet(JDK 1.4)Q一个在内部使用链表的SetQ既有HashSet的查询速度Q又能保存元素被加进ȝ序Q插入顺序)。用Iterator遍历Set的时候,它是按插入顺序进行访问的?br>   HashSet保存对象的顺序是和TreeSet和LinkedHashSet不一L。这是因为它们是用不同的Ҏ来存储和查找元素的? QTreeSet用了一U叫U黑树的数据l构【red-black tree data structure】来为元素排序,而HashSet则用了“专为快速查找而设计”的散列函数。LinkedHashSet在内部用散列来提高查询速度Q? 但是它看上去像是用链表来保存元素的插入顺序的。)你写自己的类的时候,一定要CQSet要有一个判断以什么顺序来存储元素的标准,也就是说你必d? Comparable接口Qƈ且定义compareTo()Ҏ?br>  
  SortedSet
    SortedSetQ只有TreeSetq一个实现可用)中的元素一定是有序的。这使得SortedSet接口多了一些方法:
      Comparator comparator()Q返回Set锁用的Comparator对象Q或者用null表示它用Object自有的排序方法?br>       Object first()Q返回最的元素?br>       Object last()Q返回最大的元素?br>       SortedSet subSet(fromElement, toElement)Q返回Set的子集,其中的元素从fromElement开始到toElement为止Q包括fromElementQ不包括 toElementQ?br>       SortedSet headSet(toElement)Q返回Set的子集,其中的元素都应小于toElement?br>       SortedSet headSet(toElement)Q返回Set的子集,其中的元素都应大于fromElement?br>     注意QSortedSet意思是“根据对象的比较序”,而不是“插入顺序”进行排序?br>
Map的功?br>   ArrayList能让你用数字在一愕嘎对象序列里面q行选择Q所以从某种意义上讲Q它是将数字和对象关联v来。但是,如果你想Ҏ其他条g在一个对象序 列里面进行选择的话Q那又该怎么做呢Q栈是一个例子。它的标准是“选取最后一个被压入栈的对象”。我们常用的术语mapQdictionaryQ或 associative array是一U非常强大的Q能在序列里面进行挑选的工具。从概念上讲Q它看上d是一个ArrayListQ但它不用数字,而是用另一个对象来查找? 象!q是一U至关重要的~程技巧?br>   q一概念在Java中表CؓMap。put(Object key, Object value)Ҏ会往Map里面加一个|q且把这个值同键(你查找时所用的对象Q联pv来。给出键之后Qget(Object key)׃q回与之相关的倹{你也可以用containsKey()和containsValue()试Map是否包含有某个键或倹{?br>   Java标准cd里有好几UMapQHashMapQTreeMapQLinkedHashMapQWeakHashMapQ以? IdentityHashMap。它们都实现了Map的基本接口,但是在行为方式方面有着明显的诧异。这些差异体现在Q效率,持有和表C对象pair的顺 序,持有对象的时间长短,以及如何军_键的相等性?br>   性能时Map所要面对的一个大问题。如果你知道get()时怎么工作的,你就会发觉(比方_在ArrayList里面扑֯象会是相当慢的。而这正是 HashMap的强V它不是慢慢C个个地找q个键,而是用了一U被UCؓhash code的特D值来q行查找的。散列(hashQ时一U算法,它会从目标对象当中提取一些信息,然后生成一个表C个对象的“相对独特”的int? hashCode()是Object根类的方法,因此所有Java对象都能生成hash code。HashMap则利用对象的hashCode()来进行快速的查找。这h能有了急剧的提高?br>     MapQ接口)Q维持键Q-值的关系Q既pairsQ,q样p用键来找g?br>     HashMap*Q基于hash表的实现。(用它来代替Hashtable。)提供旉恒定的插入与查询。在构造函数种可以讄hash表的capacity和load factor。可以通过构造函数来调节其性能?br>     LinkedHashMap(JDK 1.4)Q很像HashMapQ但是用Iteratorq行遍历的时候,它会按插入顺序或最先用的序Qleast-recently-used (LRU)orderQ进行访问。除了用Iterator外,其他情况下,只是比HashMapE慢一炏V用Iterator的情况下Q由于是使用链表? 保存内部序Q因此速度会更快?br>     TreeMapQ基于红黑树数据l构的实现。当你查看键或pairӞ会发现它们时按顺序(ҎComparable或ComparatorQ我们过一? Ԍ排列的。TreeMap的特ҎQ你锁得到的时一个有序的Map。TreeMap是Map中唯一有subMap()Ҏ的实现。这个方法能让你获取q? 个树中的一部分?br>     WeakHashMapQ一个weak key的MapQ是为某些特D问题而设计的。它能让Map释放其所持有的对象。如果某个对象除了在Map当中充当键之外,在其他地斚w没有其reference的话Q那它将被当作垃圑֛收?br>     IdentityHashMap(JDK 1.4)Q一个用Q=Q而不是equals()来比较键的hash map。不是ؓ我们q_使用而设计的Q是用来解决Ҏ问题的?br>   散列是往Map里存数据的常用算法?br>  
  SortedMap
  SortedMapQ只有TreeMapq一个实玎ͼ的键肯定是有序的Q因此这个接口里面就有一些附加功能的Ҏ了?br>     Comparator comparator()Q返回Map所使用的comparatorQ如果是用Object内置的方法的话,则返回null?br>     Object firstKey()Q返回第一个键?br>     Object lastKey()Q返回最后一个键?br>     SortedMap subMap(fromKey, toKey)Q返回这个Map的一个子集,光从fromKey开始到toKey为止Q包括前者,不包括后者?br>     SortedMap headMap(toKey)Q返回这个Map的一愕嘎子集Q其键均于toKey?br>     SortedMap tailMap(fromKey)Q返回这个Map的一个子集,光均大于等于fromKey?br>   pair是按key的顺序存储的Q由于TreeMap有顺序的概念Q因此“位|”是有意义的Q所以你可以去获取它的第一个和最后一个元素,以及它的子集?br>  
  LinkedHashMap
    Z提高速度QLinkedHashMapҎ有东襉K做了hashQ而且遍历的时候(println()会遍历整个MapQ所以你能看到这个过E)q会 按插入顺序返回pair。此外,你还可以在LinkedHashMap的构造函数里面进行配|,让它使用Z讉K的LRUQleast-recently -usedQ算法,q样q没被访问过的元素(同时也是要删除的候选对象)׃出现在队列的最前头。这P省资源而写一个定时清理的E序变得很? 了?br>  
  散列法与Hash?br>     一个合适的equals()必须做到一下五点:
      1 反n性:对Q何x, x.equals(x)必须是true的?br>       2 对称性:对Q何x和yQ如果y.equals(x)是true的,那么
        x.equals(y)也必Ltrue的?br>       3 传递性:对Q何xQy和zQ如果x.equals(y)是true的,?br>         y.equals(z)也是true的,那么x.equals(z)也必Ltrue的?br>       4 一致性:对Q何x和yQ如果对象里面用来判断相{姓的信息没有修
        改过Q那么无用多次x.equals(y)Q它都必M致地q回
        true或false?br>       5 对于M非空的xQx.equals(null)必须q回false?br>     默认的Object.equals()只是单地比较两个对象的地址?br>     如果你想把子集写的类当HashMap的键来用的话Q你必LhashCode()和equalsQ)都给覆写了?br>  
  理解hashCode()
    如果你不覆写键的hashCode()和equals()的话Q散列数据结构(HashSetQHashMapQLinkedHashSetQ或LinkedHashMapQ就没法正确地处理键?br>     散列的h值就在于速度Q散列算法能很快地找Zѝ?br>     数组是最快的数据l构?br>
持有reference
  java.lang.refcd里有一套能增进垃圾回收器工作的灉|性的cR一旦碰C“对象达到要耗光内存”的时候,q些cd会闲的格外有用。有三个c? 是承抽象类Reference的:SoftReferenceQWeakReference和PhantomReference。如果待处理的对象只? 通过q些Referenceq行讉K的话Q那么这些Reference对象׃向垃圑֛收器提供一些不同别的暗事?br>  
  …?br>
ȝQ?br>   ȝJava标准cd的容器类Q?br>   1。数l把对象和数字Ş式的下标联系h。它持有的是cd定的对象,q样提取对象的时候就不用再作cd传递了。它可以是多l的Q也可以持有primitive。但是创Z后它的容量不能改了?br>   2。Collection持有单个元素Q而Map持有相关联的pair?br>   3。和数组一PList也把数字下标同对象联pv来,你可以把数组和Listx有序的容器。List会随元素的增加自动调整容量。但是List只能? 有Object referenceQ所以不能存放primitiveQ而且把Object提取出来之后Q还要做cd传递?br>   4。如果要做很多随问,那么LArrayListQ但是如果要再List的中间做很多插入和删除的话,应该用LinkedList了?br>   5。LinkedList能提供队列,双向队列和栈的功能?br>   6。Map提供的不是对象与数组的关联,而是对象和对象的兌?br>      HashMap看重的是讉K速度Q而TreeMap各国那看重键的顺序,因而它不如HashMap那么快。而LinkedHashMap则保持对象插入的序Q但是也可以用LRU法为它重新排序?br>   7。Set只接受不重复的对象。HashSet提供了最快的查询速度。而TreeSet则保持元素有序。LinkedHashSet保持元素的插入顺序?br>   8。没必要再在C码里使用旧类库留下来的VectorQHashtable和Stack了?br>   容器cd是你每天都会用到的工P它能使程序更介,更强大ƈ且更搞笑?br>

PS:坦白_q章虽然p了很多时间但是感觉看完跟没有看差不多Q太晕了。可能没有做书上例子的~故把。得快的再看一遍。好好的按照例子上的E序敲一遍?br>



                                                 2005q?3?9?11:55 PM

冉翔 2005-11-03 12:05 发表评论
]]>
TIJ阅读W记Q第十章Q?/title><link>http://www.tkk7.com/ranxiang/articles/17856.html</link><dc:creator>冉翔</dc:creator><author>冉翔</author><pubDate>Wed, 02 Nov 2005 09:50:00 GMT</pubDate><guid>http://www.tkk7.com/ranxiang/articles/17856.html</guid><wfw:comment>http://www.tkk7.com/ranxiang/comments/17856.html</wfw:comment><comments>http://www.tkk7.com/ranxiang/articles/17856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ranxiang/comments/commentRss/17856.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ranxiang/services/trackbacks/17856.html</trackback:ping><description><![CDATA[<!--StartFragment -->  <P>10Q检类?BR>  q行时类型识?run-time type identificationQ羃写ؓRTTI)?/P> <P>Z么会需要RTTI<BR>  collection是一U工P它只有一U用途,是要ؓ你保其它对象。因此出于通用性的考虑Q这些collection应该能持有Q何东ѝ所以它们持有Object?BR>  <BR>  Class对象<BR>    惌知道JAVA的RTTI是如何工作的Q你必首先知道程序运行的时候,cd信息是怎样表示的。这是由一U特D的Q保存类的信息的Q叫做“Class对象(Class object)”的对象来完成。实际上cȝ“常规”对象是由Class对象创徏的?BR>    E序里的每个c都要有一个Class对象。也是_每次你撰写ƈ且编译了一个新的类的时候,你就创徏了一个新的Class对象(而且可以q么_q个对象会存储在同名?class文g?。程序运行时Q当你需要创Z个U类的对象的时候,JVM会检查它是否装蝲了那个Class对象。如果没有, JVM׃L那个.class文gQ然后装载。由此也可知道,JavaE序在启动的时候ƈ没有完全装蝲Q这点同许多传统语言是不一L?BR>    <BR>    Class.forName("一个类的名?);<BR>    q是一个Class的staticҎ(所有的Class对象所共有?。Class对象同其它对象一P也可以用reference来操?q是装蝲器要q的)Q而要惌取其reference, forName()是一个办法。它要一个表C个类的名字的String作参敎ͼ一定要注意拼写喝大写Q)。这个方法会q回Class?referenceQ还有一个副作用Q看看这个String所说的那个c装载了没有Q要是还没有那就马上装蝲。如果Class.forName()没有扑ֈ它要装蝲的类Q就会抛Z个ClassNotFoundException?BR>    <BR>    Class常数<BR>    Javaq提供了一U获取Class对象的reference的方法:“class常数(class literal)”?BR>      cȝ名字.class;<BR>    q种写法不但更简单,而且也更安全Q因为它是在~译时做查的。此外由于没有方法调用,它的执行效率也更高一些?BR>    <BR>    Class常数不但能用于普通类Q也可以用于接口Q数l和primitivecd。此外,每种primitive的wrapperc还有一个标准的Q名?TYPE的数据成员。这个TYPE能返回“与q种primitive相关联的wrappercZ的Class对象的referenceQ就像这P<BR>    <BR>         ... {同?...<BR>    boolean.class    Boolean.TYPE<BR>    char.class       Character.TYPE<BR>    byte.class       Byte.TYPE<BR>    short.class      Short.TYPE<BR>    int.class        Integer.TYPE<BR>    long.class       Long.TYPE<BR>    float.class      Float.TYPE<BR>    double.class     Double.TYPE<BR>    void.class       Void.TYPE<BR>    <BR>    我喜Ƣ尽量用?class”,因ؓq种写法与普通类的保持一致?BR>  <BR>  转换之前先作?BR>    到目前ؓ止,你看到的RTTI的Ş式有Q?BR>      1。经典的cd转换Q如?Shape)”,q种转换要经qRTTI的检查。要是做了错误的转换Q它׃抛出ClassCastException?BR>      2.代表对象cd的Class对象。你可以在运行的时候查询Class对象Q以此来获取所需的信息?BR>    <BR>    如果不进行明的cd转换的话Q编译器时不会让你把对象赋给zcȝreference的?BR>  <BR>  Java里面q有W三URTTI的Ş式。这是instanceof关键词,它会告诉你对象是不是某个cȝ实例。它q回的是一个boolean倹{?BR>  <BR>  使用cd?BR>  <BR>  动态的instanceof<BR>    isInstance()能完全替代instanceof?BR>  <BR>  instanceof vs. Class的相{?/P> <P>RTTI的语?BR>  <BR>  Class.getInterfaces()Ҏ会返回一个Class对象的数l。数l中的对象分别表C它所实现的接口?BR>  如果你手上有一个Class对象Q你q能用getSuperclass()问出它最q的那个父类。当Ӟq会q回一个Class的referenceQ于是你可以接着问,E序q行的时候,你能以此发现对象的完整的关系?BR>  Class的newInstance()Ҏ像是另一Uclone()对象的方法。但是,你却可以用newInstance()凭空创徏Z个新的对象?BR>  printInfo()ҎQ它拿一个Class对象的reference作参敎ͼ用getName()提取cȝ名字Q用isInterface()判断它是不是接口。这P你就能仅凭Class对象找出所有你想知道的q个对象的信息了?/P> <P>ReflectionQ运行时的类信息<BR>  Java以JavaBeans的Ş式提供了Zlg的编E的支持?BR>  通过|络在远E机器上创徏对象q运行程序。这被成为“远E方法调?Remote Method Invocation~写是RMI)”。它能让一个JavaE序对象分布到很多机器上?BR>  除了Classc,q有一个类库,java.lang.reflect也支持reflection。这个类库里面有FieldQMethodQ和 Constructorc(它们都实CMember接口Q运行时QJVM会创Z些这U类的对象来代表未知cȝ各个成员。然后,你就能用 Constructor来创建新的对象,用get()和set()来读取和修改与Field队Ş爱女嘎相兌的成员数据,用invoke()Ҏ调用?Method对象相关联的Ҏ了。此外,你还能用getFields()QgetMethods()QgetConstructors()之类的方法,获取表示成员数据Q方法或构造函数的对象数组。由此,即便~译时什么信息都得不刎ͼ你也有办法能在运行时问出匿名对象的全部类型信息了?BR>  有一点很重要Qreflection不是什么妖术。当你用reflection与未知类的对象打交道的时候,JVM(会和普通的RTTI一?先看看这个对象是属于那个具体cd的,但是此后Q它q是得先装蝲Class对象才能工作。也是Q不是从本地还是从|络Q反正JVM必须拿到那个.class文g。所以RTTI同reflection的真正区别在于,RTTI是在~译时让~译器打开q且?class文g。换句话_你是在通过“正常”途径调用对象的方法。而对reflection来说Q编译时是得不到.class文g的;所以它是在q行时打开q检查那个文件?BR>  <BR>  一个提取类的方法的E序<BR>    一般来_你不太会直接使用reflection;Java之所以要有这U功能是要用它来支持一些憋的特性,比如对象的序列化和JavaBeans。不q在有些情况下,能动态提取类的信息还是很有用的?BR>    Class的getMethods()和getConstructors()Ҏ分别会返回一个Method和一个Constructor数组。这两个cd包括一些“能把它们所代表的方法的名字Q参敎ͼq回值全部拆解开来”的Ҏ。不q你也可以像q里所作的Q只用toString()去获取一个包括这个方法的全部特征{֐的String。剩下的代码是用来抽取命o行信息,以及判断Ҏ特征是否与你输入的字W串相匹配(用indexOf()Q,q且把匹配的Ҏ列出来的?/P> <P><BR>ȝQ?BR>  RTTI能让你用一个匿名的基类reference来获取对象的切cd的信息。在不懂多台Ҏ调用的时候,q么作是理所当然的,因此新手们会自然而然的想到它Q于是就用错了地方,对很多从面向q程的编E语a转过来的人来_刚开始的时候,它们q不习惯扔掉switch语句。于是当他们用RTTI来编E的时候,׃错过多态性所带来的编E和代码l护斚w的好处。Java的本义是让你在程序里面全E用多态性,知识在万不得已的情况下才使用RTTI?BR>  但是要想正确C用多台方法调用,你就必须要能控制基类的定义,因ؓ当你扩展E序的时候,可能会发现基c里面没有你惌的方法。如果这个基cL来自cd的,或是由别人控制的Q那么RTTI成解决Ҏ了:你可以承一个新的类Q然后加上你自己的方法。在E序的其他地方,你可以检出q个cdQ调用那些特D的Ҏ。这样做不会破坏多态性,也不影响E序的扩展性,因ؓ加一个新的类型不会要你去到处修改switch语句。但是,如果是在E序的主体部分加入要使用新特性的嗲马的话Q你必M用RTTI来检查对象的切cd了?BR>  RTTIq会被用来解x率问题。假设你写了一个很好的多台E序Q但是运行的时候发玎ͼ有个对象反映奇慢。于是,你就可以用RTTI把则个对象捡出来Q然后专门针对它的问题写代码以提高程序的q行效率Q不q编E的时候切忌去q早有话代码。这是一个很有诱惑的陷阱。最好还是先让程序跑hQ然后再判断一下它跑得是不是够快了。只有觉得它q不够快Q你才应该去着手解x率问题-Q用profiler?BR><BR><BR><BR><BR>                                                                                <!--StartFragment --> 2005q?3?9?12:55 PM </P><img src ="http://www.tkk7.com/ranxiang/aggbug/17856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ranxiang/" target="_blank">冉翔</a> 2005-11-02 17:50 <a href="http://www.tkk7.com/ranxiang/articles/17856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TIJ阅读W记Q第九章Q?/title><link>http://www.tkk7.com/ranxiang/articles/17855.html</link><dc:creator>冉翔</dc:creator><author>冉翔</author><pubDate>Wed, 02 Nov 2005 09:48:00 GMT</pubDate><guid>http://www.tkk7.com/ranxiang/articles/17855.html</guid><wfw:comment>http://www.tkk7.com/ranxiang/comments/17855.html</wfw:comment><comments>http://www.tkk7.com/ranxiang/articles/17855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ranxiang/comments/commentRss/17855.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ranxiang/services/trackbacks/17855.html</trackback:ping><description><![CDATA[<!--StartFragment -->  <P>9Q用异常来处理错?/P> <P>基本异常<BR>  “异常条?exceptional condition)”是一U能L正在q行的方法或其某一部分l箋q行下去的问题?BR>  <BR>  异常的参?BR>    所有的标准异常都有两个构造函敎ͼW一个是默认的构造函敎ͼW二个是要拿一个字W串当参数的?/P> <P>捕获异常<BR>  “守护区?guarded region)”是一D可能生异常的代码Qƈ且后面还跟着要处理这些异常的代码?BR>  <BR>  Try区块<BR>  <BR>  异常处理E序(exception handler)<BR>  <BR>  “中止”还是“l?/P> <P>创徏你自q异常<BR>   Thorowablec?Exception是从它那里承的)printStackTrace()Ҏ会返回“被调用的方法是l过怎样一个顺序到辑ּ常发生地点”的信息。缺省情况下Q这些信息会送到标准错误,但是q个Ҏ的重载版也允怽结果送到其他?BR>   对于异常cL_getMessage()有点像toString()?/P> <P>异常说明<BR>  会在~译时进行检查ƈ且强制得到处理的异常被称为checked exception.</P> <P>捕捉Lcd的异?BR>  重抛异常<BR>    fillInStackTrace()Q这个方法会当前栈的信息塞q旧的异常对象中Qƈq回一个Throwable对象?BR>  <BR>  异常?exception chaining)<BR>    JDK 1.4中所有的Throwable的子c都有一个能接受cause(原因)对象的构造函数。这个cause是用来保存前一个异常的?BR>    在Throwable的子cMQ只有三U基本的异常cL供了带cause参数的构造函敎ͼ它们是ErrorQ供JVM报告pȝ错误只用Q, Exception和RuntimeException。如果你要链接其他异常,那就不能用构造函敎ͼ而只能用initCause()Ҏ了?/P> <P>标准Java异常<BR>  RuntimeException表示~程错误Q?BR>    1。一U你无法预料的错误。比如不在你控制之内的null reference?BR>    2。一U由于“程序员忘了查它应该查的错误条g”而造成的错误(比如ArrayIndexOutOfBoundsExceptionQ你讉K数组的时候应该对数组的大做一个检查)。第一U情况下发生的异常,l常会演变成W二U情况下的问题?/P> <P>用finallyq行清理<BR>  如果你把try区放q一个@环,你就能构Z个程序运行之前必L的条g了。你也可以在循环里加上static的计数器Q或其它什么东西,让它退Z前多试几U方法。这样你p把程序的强壮性就能更上一个台阶?BR>  <BR>  finally是用来干什么的Q?BR>    当你需要把内存以外的东西设|到原先状态的时候,finally显得很有必要了?BR>    甚至是在“异常没有被当前q组catch子句所捕获”的情况下,finally也会在“异常处理机制在更高一层的q行环境中开始寻扑֤理程序”之前得到执行?BR>  <BR>  错误Q丢q异常</P> <P>加在异常上面的限?BR>  zcȝ构造函C能捕获Q何由基类构造函数抛出的异常?BR>  在承过E中Q编译器会对异常说明作强制要求,但异常说明本wƈ不属于方法的特征(signature)Q特征是由方法的名字与参数的cdl成的。因此,你不能根据异常说明来重蝲Ҏ。此外,一个出现在基类Ҏ的异常说明中的异常,不一定会出现在派生类Ҏ的异常说明里。这点同l承的规则有明显不同Q在l承中,基类的方法必d现在l承c里。换一句话_在承和覆写的过E中Q方法的“异常说明的接口”不是变大而是变小了-Q这正好和接口在l承时的情Ş相反?/P> <P><BR>构造函?BR>  所有的清理Q-除了内存清理之外Q-都不会自动发生?/P> <P>异常的匹?/P> <P>其它Ҏ</P> <P>异常q用的原?BR>  1。在合适的地方处理问题。(避免在自p不知道该如何处理的情况下L捉异常)?BR>  2。把问题解决掉,然后重新调用那个引v问题的方法?BR>  3。修正一下问题,然后l过那个Ҏ再l下厅R?BR>  4。用一些别的,不准备让q个Ҏq回的数字来q行计算?BR>  5。把当前q行环境下能作的事情全部做完Q然后把相同的异常抛到更高层?BR>  6。把当前q行环境下能做的事情全部做完Q然后抛一个不同的异常到更高层?BR>  7。中止程序?BR>  8。简化。(如果异常l构把事情搞得太复杂了,那用h回事非常痛苦也很烦hQ?BR>  9。把cd和程序做得更安全。(q即使在试作短期投资Q也是在为程序的健壮性作长期投资。)</P> <P><BR>ȝQJava异常处理的目的就是要让我们能用比现在更少的代码,以一U更单的方式来开发大型,可靠的程序,q且让你在开发过E中能更自信“你的程序里面没有未l处理地错误”。异怸是特别难学,但是却能l项目带来立杆见q效果?BR><BR><BR><BR><BR>                                                                                <!--StartFragment --> 2005q?3?5?3:31 PM </P><img src ="http://www.tkk7.com/ranxiang/aggbug/17855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ranxiang/" target="_blank">冉翔</a> 2005-11-02 17:48 <a href="http://www.tkk7.com/ranxiang/articles/17855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TIJ阅读W记Q第八章Q?/title><link>http://www.tkk7.com/ranxiang/articles/17854.html</link><dc:creator>冉翔</dc:creator><author>冉翔</author><pubDate>Wed, 02 Nov 2005 09:47:00 GMT</pubDate><guid>http://www.tkk7.com/ranxiang/articles/17854.html</guid><wfw:comment>http://www.tkk7.com/ranxiang/comments/17854.html</wfw:comment><comments>http://www.tkk7.com/ranxiang/articles/17854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ranxiang/comments/commentRss/17854.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ranxiang/services/trackbacks/17854.html</trackback:ping><description><![CDATA[<!--StartFragment -->  <P>8Q接?interface)与内部类(inner class)</P> <P>接口(interface)<BR>  可以把它惌成“纯的”abstractcR能让开发h员定义类的Ş式:Ҏ名,参数列表Q返回值的cdQ但是却没有Ҏ的正文。interface也可以包含数据成员,但是它天生就是static和final的。interface只提供Ş式,不谈实现?BR>  interface会被用作定义cM间的“协?protocol)”?BR>  当你implements一个interface的时候,你必Lq个interface的方法定义成public的。如果你不这么做Q那它就会编Epackage权限的,q样l过l承Q这些方法的讉K权限׃收到限制Q而这是Java的编译器所不允许的?BR>  <BR>  Java的“多重?multiple inheritance)”?BR>  只要基类的设计里面可以不包括Ҏ合成员变量的定义Q你应该优先用interface。只有在不得不定义方法或成员变量的情况下Q你才能把它Ҏabstractc,或者根据需要改成实体类?BR>  <BR>  合ƈ接口时的名字冲突<BR>  <BR>  用承扩展interface<BR>    你可以用l承Q往interface里面d新的ҎQ也可以用承把多个interface合ƈ成一个新的interface。在q两U情况下Q你所得到的都只是一个新的interface?BR>  <BR>  帔R的分l?BR>    ׃interface的数据成员自动就是static和final的,因此interface是一U非常方便的Q创Zl常量值的工具?BR>    interface的成员自动就是public的?BR>  <BR>  初始化接口中的数据成?BR>  <BR>  接口的嵌?/P> <P><BR>内部c?BR>  <BR>  内部cM上传<BR>    实际上,对象上传给它所实现的接口与它上传l基cL完全相同?BR>    普通类Q非内部c)是不能被定义成private或protected的;它们只可能是public或package权限的?BR>  <BR>  在方法和作用域里的内部类<BR>  <BR>  匿名内部c?BR>    如果你在定义匿名内部cȝ时候,q要用到外面的对象,那编译就会要求你把这个参数的reference生命成final的。如果你忘了Q编译的时候就会报错?BR>    实际上实力初始化q程是匿名内部cȝ构造函数。当Ӟ它的功能是有限的Q你不能重蝲实例初始化,因此你只能有一个构造函数?BR>  <BR>  与宿ȝ的关p?BR>    如果你创Z一个内部类Q那么这个内部类的对象,׃创徏它的“宿ȝ的对?enclosing object)”生了某种关系Q这样它p讉K宿主cd象的成员了-Q不需要Q何特别的授权。此外,内部c还能访问宿ȝ的所有元素?BR>  <BR>  嵌套c?BR>    如果你不需要这U“内部类对象和宿ȝ对象之间的”联p,那么你可以把内部cd义成static的。这通常被称作“嵌套类(nested class)”。嵌套类的意思是Q?BR>      1。无dȝ的对象就能创建嵌套类的对象?BR>      2。不能在嵌套cȝ对象里面讉K非static的宿ȝ对象?BR>    interface里面是不能有M代码的,但嵌套类却可以是interface的一部分?BR>  <BR>  引用宿主cȝ对象<BR>    除非你还已经创徏了宿ȝ的对象,否则Ҏ不可能创建内部类的对象。但是,如果你创建的是嵌套类(static的内部类)的话Q那׃需要宿ȝ对象的reference了?BR>  <BR>  在多层潜逃的c里向外讉K<BR>    当你在另一个类里创建多层嵌套的内部cȝ对象的时候,应当使用哪种语法。?new”语句指明了正确的作用域Q因此你无须在调用构造函数的语句里再去限定类的名字了?BR>  <BR>  l承内部c?BR>    你必Ml他宿主cd象的reference。此外,你还必须在构造函数里面用这U语法:<BR>      enclosingClassReference.super();<BR>  <BR>  内部cd以被覆写吗?<BR>    当你l承宿主cȝ时候,内部cȝ戏法到此ؓ止了。这两个内部cL怺肚里的两个实体,它们都有自己的名字空间?BR>  <BR>  本地内部c?Local inner classes)<BR>    用本地内部类来代替匿名内部类的唯一正当的理由就是,你需要一个有名字的构造函敎ͼq且/或者要重蝲q个构造函敎ͼ因ؓ匿名内部cd能进行实力初始化?BR>    选择本地内部c而不是匿名内部类的唯一原因是Q你必须创徏多个那种cȝ对象?BR>  <BR>  内部cȝ标识W?Inner class identifiers)</P> <P><BR>Z么要有内部类Q?BR>  每个内部c都可以独立地承某个“实?implementation)”。因此,内部cM会受“宿ȝ是否已经l承了别的实现”的U束?BR>  有了内部c,你就得到了如下的附加Ҏ:<BR>    1。内部类可以有多个实例,而每个又都可以有它自qQ与宿主cd象无关的状态信息?BR>    2。一个宿ȝ里可以放上好几个内部c,他们可以用各自不同的Ҏ来实现同一个interface或承同一个类?BR>    3。内部类对象创徏的时Z宿主cd象的创徏没什么关pR?BR>    4。内部类不存在什么让人头晕的“是”关p;他是一个独立的实体?BR>  <BR>  Closure与回?Closures & Callbacks)<BR>    closure是一U能调用的对象,它记录了创徏它的那个作用域的信息。内部类是一U面向对象的closureQ因为它不仅保存了宿ȝ的所有信息(“创建它的作用域”)Q而且q自动保存指向那个宿ȝ的对象的referenceQ更何况它还有权操控q个对象的所有成员,即他们是private 的?BR>  <BR>  内部cM控制框架(Inner classes & control frameworks)<BR>    “应用程序框?application framework)”是一个或一lؓ解决某种特定cd的问题而设计的cR控制框架是应用E序框架的一U,主要用于响应旉Q如果系l的首要人物是对事件作出响应,那么它就被称为“事仉动系l?event-driven system)”?/P> <P><BR>ȝQ相比绝大多数别的OOP语言Q接口和内部cȝ概念会更为复杂,但是和C++的MI相比QJAVA的接口和内部c还是简单的许多。虽Ӟq些Ҏ本w还是比较简单,但是它们具体用法属于设计的范畴了,q点同多态性非常相伹{?BR><BR><BR><BR><BR>                                                                                <!--StartFragment --> 2005q?3?5?3:29 PM </P><img src ="http://www.tkk7.com/ranxiang/aggbug/17854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ranxiang/" target="_blank">冉翔</a> 2005-11-02 17:47 <a href="http://www.tkk7.com/ranxiang/articles/17854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TIJ阅读W记Q第七章Q?/title><link>http://www.tkk7.com/ranxiang/articles/17853.html</link><dc:creator>冉翔</dc:creator><author>冉翔</author><pubDate>Wed, 02 Nov 2005 09:46:00 GMT</pubDate><guid>http://www.tkk7.com/ranxiang/articles/17853.html</guid><wfw:comment>http://www.tkk7.com/ranxiang/comments/17853.html</wfw:comment><comments>http://www.tkk7.com/ranxiang/articles/17853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ranxiang/comments/commentRss/17853.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ranxiang/services/trackbacks/17853.html</trackback:ping><description><![CDATA[<!--StartFragment -->  <P>7Q多态?/P> <P>再访上传(upcasting)<BR>  把对象的reference当作基类的reference来用Q被成ؓ上传(upcasting)?BR>  <BR>  把对象的cd忘掉<BR>  <BR>问题的关?BR>  <BR>  Ҏ调用的绑?binding)<BR>    后绑?late binding)是要在程序运行的时候,Ҏ对象的类型来军_该绑定哪个方法。后l定也被UCؓ“动态绑?dynamic binding)”或“运行时l定(run-time binding)”?BR>    除了static和finalҎ(privateҎ隐含有final的意?QJAVA的所有的Ҏ都采用后l定?BR>  <BR>  产生正确的行?BR>  <BR>  可扩展?BR>  <BR>  错误Q“覆写”private的方?/P> <P>抽象cd抽象Ҏ<BR>  <BR>  抽象Ҏ(abstract method)Q只有声明,没有正文?BR>  <BR>构造函C多态?BR>  <BR>  构造函数的调用序<BR>    复杂对象的构造函数的调用序这LQ?BR>      1。调用基cȝ构造函数。这是一个递归的过E,因此会先创徏l承体系的跟Q然后是下一U派生类Q依此类推,直到最后一个承类的构造函数?BR>      2。成员对象按照其声明的顺序进行初始化?BR>      3。执行承类的构造函数的正文?BR>  <BR>  l承与清?BR>    先进行派生类的清理,再进行基cȝ清理?BR>  多态方法在构造函C的行?BR>    一个好的构造函数应该,“用最的工作量把对象的状态设|好Q而且要尽可能地避免去调用Ҏ。”构造函数唯一能安全调用的ҎQ就是基cȝfinalҎ (q一条也适用privateҎQ因为它自动是final的?。他们不会被覆写Q因此也不会产生q种意外的行为?/P> <P><BR>用承来q行设计<BR>  U承与扩展<BR>  <BR>  下传与运行时的类型鉴?/P> <P><BR>ȝQ多态性是一U不能孤立的看待的特性(不像switch语句Q,相反只有攑֜cdpȝ“大背景”下Q它才有用武之地。要惛_~程中有效地使用多态性,以及面向对象的技术,那你必L展你的编E视野,不能只关注单个类的数据成员和消息Q而是要去理解cMcM间的共同性,以及他们之间的关pR虽然这个要求很高,但是q种努力是值得的,因ؓ它能加速程序的开发,改善代码的逻辑l织Q得程序更易于扩展Q同时维护代码也变得更方便了?/P> <P> </P>                                                                                <!--StartFragment --> 2005q?3?3?1:59 AM                               <P> </P><img src ="http://www.tkk7.com/ranxiang/aggbug/17853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ranxiang/" target="_blank">冉翔</a> 2005-11-02 17:46 <a href="http://www.tkk7.com/ranxiang/articles/17853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TIJ阅读W记Q第六章Q?/title><link>http://www.tkk7.com/ranxiang/articles/17852.html</link><dc:creator>冉翔</dc:creator><author>冉翔</author><pubDate>Wed, 02 Nov 2005 09:44:00 GMT</pubDate><guid>http://www.tkk7.com/ranxiang/articles/17852.html</guid><wfw:comment>http://www.tkk7.com/ranxiang/comments/17852.html</wfw:comment><comments>http://www.tkk7.com/ranxiang/articles/17852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ranxiang/comments/commentRss/17852.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ranxiang/services/trackbacks/17852.html</trackback:ping><description><![CDATA[<!--StartFragment -->  <P>6Q复用类</P> <P>合成所使用的语?BR>  如果惛_referenceq行初始化,那么可以在以下几个时间进行:<BR>    1。在定义对象的时候。这意味着在构造函数调用之前,它们已经初始化完毕了?BR>    2。在q个cȝ构造函数里?BR>    3。在卛_使用那个对象之前。这U做法通常被成为“偷懒初始化Qlazy initializationQ”。如果碰到创建对象的代h很高Q或者不是每ơ都需要创建对象的时候,q种做法p降低E序的开销了?BR>  <BR>  l承所使用的语法?BR>    l承设计斚w有一条通用准则Q那是把数据都设成private的,把方法都设成public的。当然碰到特D情况还要调_但是q还是一条非常有用的准则?BR>  <BR>  基类的初始化<BR>    构造行为是从积累“向外”发展的Q所以基cM在派生类的构造函数访问它之前先进行初始化?BR>  <BR>  带参数的构造函?BR>    Ҏ生类构造函数而言Q调用基cȝ构造函数应该是它做的第一件事?BR>  <BR>  捕获U篏构造函数抛出的异常?/P> <P><BR>把合成和l承l合h<BR>  虽然~译器会强制你对基类q行初始化,q且会要求你在构造函数的开始部分完成初始化。但是它不会查你是不是进行了成员对象的初始化Q因此你只能自己留神了?BR>  <BR>  保q行妥善地清?BR>    先按照创建对象的相反序q行cȝ清理。然后调用基cȝ清理Ҏ?BR>  <BR>  名字的遮?/P> <P><BR>用合成还是?BR>  l承要表辄是一U“是(is-a)”关p,而合成要表达的是“有(has-s)”关pR?BR>  <BR>  protected<BR>    Java的protected也提供package的权限?/P> <P>渐进式的开?/P> <P>上传(upcasting)QL安全的?/P> <P>合成q是l承Q再探讨?/P> <P>final关键?BR>  Final的数?BR>    对primitive来说Qfinal会将q个值定义成帔RQ但是对于对象的reference而言Qfinal的意思则是这个reference是常量。Java没有提供某个对象作成常量的Ҏ。这U局限性也体现在数l上Q因为它也是一个对象?BR>  <BR>  I白的final数据(Blank finals)<BR>    一定得为final数据赋|要么是在定义数据的时候用一个表辑ּ赋|要么是在构造函数里面进行赋倹{?BR>  <BR>  Final的参?BR>    Java允许你在参数表中生命参数是final的,你不能在Ҏ里让参数reference指向另一个对象?BR>  <BR>  FinalҎ<BR>  <BR>  final和private<BR>    privateҎ都隐含有final的意思?BR>  <BR>  Finalc?BR>    不允许别人去l承?BR>  <BR>  心使用final</P> <P><BR>初始化与cȝ装蝲<BR>  l承情况下的初始?/P> <P>ȝQ本章主要讲qCl承和合成的概念和用法及一些注意事V尽面向对象的变成会反复强调承,但是当你着手设计的时候,通唱情况下还是应该先考虑合成Q只有在必要的时候才使用l承。合成会更灵zR?BR><BR><BR><BR><BR>                                                                                <!--StartFragment --> 2005q?3?2?3:42 AM </P><img src ="http://www.tkk7.com/ranxiang/aggbug/17852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ranxiang/" target="_blank">冉翔</a> 2005-11-02 17:44 <a href="http://www.tkk7.com/ranxiang/articles/17852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TIJ阅读W记Q第五章Q?/title><link>http://www.tkk7.com/ranxiang/articles/17851.html</link><dc:creator>冉翔</dc:creator><author>冉翔</author><pubDate>Wed, 02 Nov 2005 09:43:00 GMT</pubDate><guid>http://www.tkk7.com/ranxiang/articles/17851.html</guid><wfw:comment>http://www.tkk7.com/ranxiang/comments/17851.html</wfw:comment><comments>http://www.tkk7.com/ranxiang/articles/17851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ranxiang/comments/commentRss/17851.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ranxiang/services/trackbacks/17851.html</trackback:ping><description><![CDATA[<!--StartFragment -->  <P>5Q隐藏实?/P> <P>packageQ类库的单元<BR>   package和importq两个关键词的作用是要把一个单独的全局名字I间分割开来?/P> <P>创徏独一无二的package名字</P> <P>一个自定义的工L?/P> <P>使用import来改变程序的行ؓ方式</P> <P>使用package的忠?BR>  q个package必须保存在由它的名字所指示的目录里Q而这个目录又必须在CLASSPATH下面?/P> <P><BR>JAVA的访问控制符<BR>  package讉K权限<BR>  publicQ访问接口的权限<BR>  privateQ你都C?BR>  protectedQ承的讉K权限</P> <P>接口(Interface)与实?implementation)<BR>  Z让代码显得更有条理,可能你选用q种风格Q就是讲public成员都放在类的开_接下来是protected成员Q然后是package权限的,最后是private成员?/P> <P>cȝ讉K权限<BR>  1。每个编译单元(文gQ只能有一个publiccR这么做的意思是Q每个编译单元只能有一个公开的接口,而这个接口就由其publiccL表示。你可以Ҏ需要,往q个文g里面dL多个提供辅助功能的package权限的类。但是如果这个编译单元里面有两个或两个以上publiccȝ话,~译器就会报错?BR>  2。publiccȝ名字必须和这个编译单元的文g名完全相同,包括大小写。所以对Widgetc,文g名必LWidget.javaQ不能是widget.java或WIDGET.java。如果你不遵守,~译器又要报错了?BR>  3。编译单元里面可以没有publicc,虽然q种情况不常见,但确实可以的Q这Ӟ你就能随意ؓ文g起名字了?BR>  <BR>  cd有两U访问权限:package权限和public?/P> <P><BR>ȝQ本章主题是怎样用类来构建类库:首先是怎样讲类装成类库,然后是,cL怎样控制它的成员的访问权限的?BR><BR><BR><BR>                                                                                <!--StartFragment --> 2005q?3?2?12:12 AM </P><img src ="http://www.tkk7.com/ranxiang/aggbug/17851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ranxiang/" target="_blank">冉翔</a> 2005-11-02 17:43 <a href="http://www.tkk7.com/ranxiang/articles/17851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TIJ阅读W记Q第四章Q?/title><link>http://www.tkk7.com/ranxiang/articles/17850.html</link><dc:creator>冉翔</dc:creator><author>冉翔</author><pubDate>Wed, 02 Nov 2005 09:42:00 GMT</pubDate><guid>http://www.tkk7.com/ranxiang/articles/17850.html</guid><wfw:comment>http://www.tkk7.com/ranxiang/comments/17850.html</wfw:comment><comments>http://www.tkk7.com/ranxiang/articles/17850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ranxiang/comments/commentRss/17850.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ranxiang/services/trackbacks/17850.html</trackback:ping><description><![CDATA[<!--StartFragment -->  <P>4Q初始化与清?/P> <P>用构造函数确保初始化<BR>  new表达式确实会q回q个新创建的对象和referenceQ但是构造函数本w不q回M倹{?/P> <P>Ҏ的重?BR>  区分l重载的Ҏ<BR>  对primitiveq行重蝲<BR>  用返回值重?BR>    不能用返回值来区分重蝲的方法?/P> <P>默认的构造函?/P> <P>this关键?BR>  this关键词只能用于方法内部,它负责返回调用这个方法的对象的reference?/P> <P>static的含?BR>  不能在staticҎ里调用非static的方法(虽然反过来是可以的)Q但是却可以不通过对象Q直接对c调用staticҎ?/P> <P>在构造函数里调用构造函?/P> <P>清理Qfinalization和垃圑֛?BR>  Z么要有finalize()Q?BR>    1。对象不一定会被垃圑֛收器回收?BR>    2。垃圑֛收不是拆?destruction)?BR>    3。垃圑֛收只与内存有兟?BR>  <BR>  你必M自进行清?BR>  <BR>  中止条g<BR>  <BR>  垃圾回收器是如何工作?BR>  <BR>  指定初始?BR>  <BR>  用构造函数进行初始化<BR>    初始化的序是由变量在类的定义里面的序锁决定的?BR>    变量的初始化会先于Q何方法,甚至是构造函数的调用?BR>    <BR>    静态数据的初始?BR>      如果未创徏cȝ对象Q因而其static的成员尚未初始化的话Q初始化会先处理其static成员Q再处理非static的对象。只有创建第一个对象时Qstatic成员被初始化Q此后static对象׃会再作初始化?BR>    <BR>    昄的静态初始化<BR>      静态初始化只运行一ơ?BR>    <BR>    非静态的实例初始?/P> <P><BR>数组的初始化<BR>  可以讉K的最大的数组下标是length-1<BR>  <BR>  多维数组</P> <P><BR><BR>ȝQ本章主要讲qCJAVA初始化方面的机制和一些规则和技巧,也对JAVA的内存回Ӟ垃圾处理机制做了一定的介绍和分析?BR><BR><BR><BR>                                                                                <!--StartFragment --> 2005q?3?1?6:08 AM </P><img src ="http://www.tkk7.com/ranxiang/aggbug/17850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ranxiang/" target="_blank">冉翔</a> 2005-11-02 17:42 <a href="http://www.tkk7.com/ranxiang/articles/17850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TIJ阅读W记Q第三章Q?/title><link>http://www.tkk7.com/ranxiang/articles/17848.html</link><dc:creator>冉翔</dc:creator><author>冉翔</author><pubDate>Wed, 02 Nov 2005 09:31:00 GMT</pubDate><guid>http://www.tkk7.com/ranxiang/articles/17848.html</guid><wfw:comment>http://www.tkk7.com/ranxiang/comments/17848.html</wfw:comment><comments>http://www.tkk7.com/ranxiang/articles/17848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ranxiang/comments/commentRss/17848.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ranxiang/services/trackbacks/17848.html</trackback:ping><description><![CDATA[<!--StartFragment -->  <P>3:控制E序程</P> <P>使用Javaq算W?BR>  优先U:先乘除后加减<BR>    赋?BR>      当你‘在对象之间’进行复制的时候,实际上你是在拯它的reference?BR>  Ҏ调用期间的aliasing</P> <P>  数学q算W?BR>  <BR>  正则表达?Regular expressions)<BR>  <BR>  自动递增与递减<BR>  <BR>  关系q算W?BR>    试对象的相{?BR>  <BR>  逻辑q算W?BR>    短接(short circuiting)<BR>  <BR>  位运符<BR>  <BR>  UMq算W?BR>  <BR>  三元if-elseq算W?BR>  <BR>  逗号q算W?/P> <P>  String和+q算W?BR>  <BR>  常见的用运符斚w的错?BR>  <BR>  cd转换W?BR>  <BR>  帔R(Literals)</P> <P>  Java没有"sizeof"</P> <P>  重访优先U?BR>  <BR>  q算W的ȝ<BR>    除了boolean之外Q所有的primitivecd都能被{换成其他的primitivecd?/P> <P><BR>执行控制<BR>  <BR>  true和false<BR>    “条件判?conditional)”必要能生一个booleanl果?BR>  return<BR>  循环语句<BR>    while<BR>    do-while<BR>    for<BR>  逗号q算W?BR>  break和continue<BR>    臭名昭著的“goto?BR>      1.普通的continue会退到内部@环的最开始,然后l箋执行内部循环?BR>      2.带标{continue会蟩转到标签Qƈ且重新进入直接跟在标{֐面的循环?BR>      3.break会从循环的“底部溜出去”?BR>      4.带标{break会从p个标{标识的循环的“底部溜出去”?BR>  <BR>  siwtch<BR>    Math.random()会生?.0Q它的值域是[0,1)?/P> <P><BR>ȝQ这一章讲qCl大多数的变成语a都有的基本特性:计算Q操作符优先U,cd转换Q选择与@环。还有一些小知识和容易犯错误的地方:P<BR><BR><BR><BR>                                                                                <!--StartFragment --> 2005q?3?0?5:40 AM </P><img src ="http://www.tkk7.com/ranxiang/aggbug/17848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ranxiang/" target="_blank">冉翔</a> 2005-11-02 17:31 <a href="http://www.tkk7.com/ranxiang/articles/17848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TIJ阅读W记Q第二章Q?/title><link>http://www.tkk7.com/ranxiang/articles/17847.html</link><dc:creator>冉翔</dc:creator><author>冉翔</author><pubDate>Wed, 02 Nov 2005 09:25:00 GMT</pubDate><guid>http://www.tkk7.com/ranxiang/articles/17847.html</guid><wfw:comment>http://www.tkk7.com/ranxiang/comments/17847.html</wfw:comment><comments>http://www.tkk7.com/ranxiang/articles/17847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ranxiang/comments/commentRss/17847.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ranxiang/services/trackbacks/17847.html</trackback:ping><description><![CDATA[<!--StartFragment --> 2:万物皆对?BR><BR>用reference操纵对象<BR><BR>你必d造所有的对象<BR><BR>  数据存在哪里Q?BR>    1。寄存器(registers)?BR>    2。栈(stack)?BR>    3。堆(heap)?BR>    4。静态存?static storage)?BR>    5。固定存?constant storage)?BR>    6。非内存的存?Non-RAM storage)Q流对象(streamed object)和persistent对象?BR><BR>特例Qprimitivecd<BR>  PrimitivecdQboolean, char, byte, short, int, long, float, double, void<BR>  WrappercdQBoolean, Character, Byte, Short, Integer, Long, Float, Double, Void<BR>  <BR>  高精度的数?BR>    BigInteger支持L_ֺ的整数。也是_它可以精地表示L大的自然敎ͼ所以运的时候不会丢׃Q何信息?BR>    BigDecimal能表CZQ意精度的点敎ͼ因此Q你可以用它来进行精度要求极高的货币兑换的计?BR><BR>  Java中的数组<BR><BR>你永q不需要清理对?BR>  作用?scope)<BR>  对象的作用域<BR><BR>创徏新的数据cdQ类<BR>  数据成员与方?field & method)<BR>  Primiteve成员的缺省|<BR>    Primitivecd      ~省?BR>    boolean            False<BR>    char               '\u0000'(null)<BR>    byte               (byte)0<BR>    short              (short)0<BR>    int                0<BR>    long               0L<BR>    float              0.0f<BR>    double             0.0d<BR><BR>ҎQ参数和q回?BR>    Ҏ(method)的基本的l成包括Ҏ的名字,参数Q返回类型,以及Ҏ的正文?BR>    q回cd是指调用Ҏ所q回的值的cd。参数列表则表示传给q个Ҏ的数据的cd和名字。方法的名字再配合其参数列表Q就可以唯一地标识一个方法?BR>    调用Ҏ通常被成为向对象发消息?BR><BR>  参数列表<BR>    Java传递对象的时候,实际上是在传reference?BR><BR><BR>构徏JavaE序<BR>  名字的可见?BR>    使用其他lg<BR>    static关键?BR>      当你声明某样东西是static的时候,你的意思是Q这Ҏ据或Ҏ没有被连到类的Q何一个实例之上。因此即使你从没创徏q那个类的对象,你也可以调用其staticҎ或者访问其static数据?BR><BR><BR>W一个JavaE序<BR>  ~译和运?BR><BR>注释和嵌入式的文?BR>  注释文档<BR>  嵌入式的HTML<BR>  标记举例<BR><BR>~程风格<BR><BR>ȝQ本章对JAVA最基础的一些概念做了介l。还有一些语法上的讲解,最后还l出一个完整的CZE序Q还配合了javadoc做了演示?nbsp;<BR><BR>                                                                                <!--StartFragment --> 2005q?3?9?6:11 PM <img src ="http://www.tkk7.com/ranxiang/aggbug/17847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ranxiang/" target="_blank">冉翔</a> 2005-11-02 17:25 <a href="http://www.tkk7.com/ranxiang/articles/17847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TIJ阅读W记Q第一章)http://www.tkk7.com/ranxiang/articles/17846.html冉翔冉翔Wed, 02 Nov 2005 09:22:00 GMThttp://www.tkk7.com/ranxiang/articles/17846.htmlhttp://www.tkk7.com/ranxiang/comments/17846.htmlhttp://www.tkk7.com/ranxiang/articles/17846.html#Feedback0http://www.tkk7.com/ranxiang/comments/commentRss/17846.htmlhttp://www.tkk7.com/ranxiang/services/trackbacks/17846.html 

1·对象?/P>

抽象的过E?/P>

Smalltalk的五特征代表了U的面向对象的编E方法:
1。万物皆对象?BR>2。程序就是一l相互之间传递消息,告诉对象该干些什么的对象?BR>3。每个对象都利用别的对象来组建它自己的记忆?BR>4。对象都有类型?BR>5。所有属于同一cd的对象能接受相同的消息?/P>

对象有接?/P>

对象会提供服?/P>

隐藏实现

复用实现

l承Q复用接?/P>

可凭借多态性相互替换的对象

abstract基类和interface

对象的创建,使用和生命周?/P>

Collection和P代器

单根l承体系

下传与模?泛型

保正确地清?/P>

垃圾回收器的效率与灵zL?/P>

异常处理Q与错误打交?/P>

q发

Persistence

Java ?Internet

Web是什么?

把Web当作巨型的服务器

客户端编E?/P>


JavaZ么能成功

pȝ能更易于表达和理?/P>

最大程度上利用cd

错误处理

~写大项?/P>

ȝQ第三次看TIJ了,W一ơ没看明白,W二ơ看了一般。这ơ重看,虽然只看了第一章,但是感觉自己又有了不收莗一定要再接再厉。爱JavaQ爱生活。感觉第一章没有什么需要评论的地方Q主要是理解OOP的思想和吹捧JAVA的好处,所以仅列了几个标题。后ll看Q准备写一些自q看法和感惟뀂。。自q自己加aQ嘿ѝ?BR>


                                                                                2005q?3?8?6:10 PM



冉翔 2005-11-02 17:22 发表评论
]]>
վ֩ģ壺 ĻmvƵ8| 18ͬ־videosվ| 91Ƶ| yellowƵ߹ۿ| ŮƷĻ| þþƷĻ鶹| ββ8xѾþ| Ʒsmվ | ɫAAVѲ| ˾ҹƷƵ߹ۿ| С˵ͼƬƵ| AVۺɫһ| www޾Ʒٸһ| 99Ƶ߾Ʒѹۿ6| 57paoƵ| aƵ߹ۿ| ĻƵ| ޾ƷŮ2020þ| ޸Ļ| ޹˾þþƷ| ŮͬavƬ߹ۿ| ͵ۺ| ޹Ʒһҳ | Ƶһ߹ۿ| þþƷAvӰƬ| ҹ߹ۿ| ͵޾Ʒ׺ˬ| ޲avĻ| պѸһëƬ| Դ߹ۿѸ| 999ھƷѹۿ| ĻȫĻ| ɫƷva߹ۿƵ | ôӲˬѲ| ƬƵһ| ҹƷþþþþapp| ޾Ʒ߲| 91avƵ| ޾Ʒ޿| ëƬַ߹ۿĻ | ȫһһëƬѿ|