??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲日韩区在线电影,亚洲成人黄色在线,亚洲国产精品日韩av不卡在线 http://www.tkk7.com/selina/category/538.html<hr>
<div align="center"><a href="http://www.tkk7.com/selina/">..::[Selina ?AlleNny]::..</a></div>
<br>
Sunny day with the rain together<br>
像苦与甜交织的景?lt;br>
春天的花冬天的寒?lt;br>
都是色彩~纷的h?lt;br>
<br>
Sunny day with the rain together<br>
旉转动着古老的~䆾<br>
黑暗的夜明亮的早?lt;br>
那都是我们丰盛的旅程<br>
<br>
<div align="center"><a >Turn Left Turn Right</a></div> zh-cn Tue, 14 Aug 2007 16:06:17 GMT Tue, 14 Aug 2007 16:06:17 GMT 60 既有D又有熊掌——浅ListOrderedMap http://www.tkk7.com/selina/archive/2007/08/14/136692.htmlSelina Selina Tue, 14 Aug 2007 07:30:00 GMT http://www.tkk7.com/selina/archive/2007/08/14/136692.html http://www.tkk7.com/selina/comments/136692.html http://www.tkk7.com/selina/archive/2007/08/14/136692.html#Feedback 2 http://www.tkk7.com/selina/comments/commentRss/136692.html http://www.tkk7.com/selina/services/trackbacks/136692.html 要有序可以用ListQ要便于查找可以用MapQ那既要有序又便于查扑֑Q?br>
最q我遇Cq样一个问题,Java没有l我们提供现成的c,我们完全可以自己开发个cȝ承List和MapQJava原来有不可以同时承List和Map的BugQ因此特意去看了下这个Bug的状态——ClosedQ呵呵,应该是很老的版本才有的问题,用新版本的朋友不用担心会遇到q个问题Q,但是完全没必要白花那个力气,因ؓApache?strong>Commons Collections的Jar包里已经为我们提供了一个相当完备的cL满我们q样的要求完全是lԒ有余。因此我们现在要做的仅仅是引入Jar包,然后使用q个现成的好东西—?strong>ListOrderedMap可以啦?br>
让我们来看看代码Q?/font>
ListOrderedMap list = new ListOrderedMap(); for ( int i = 0 ; i < objs.length; i ++ ) { list.put(objs[i].getId(), objs[i]); }
初始化很单吧Q没有一Ҏ术难度,往里边放数据和Map没一点区别,需要注意的是Map我们可以在初始化的时候加上类型,比如Map<String, String>Q但是ListOrderedMap不可以,p么点差别Q要记得哦。但是这个差别也是ListOrderedMap让h最不满意的地方Q因说明他是cd不安全的?br>
接下来,看看我们都用CListOrderedMap的哪些方法:
int themeId = ((Obj) list.getValue( 0 )).getThemeId(); int index = list.indexOf(key); if (index == list.size() - 1 ) { obj = (Obj) list.getValue( 0 ); } else if (index != - 1 ) { obj = (Obj) list.getValue(index + 1 ); }
getValue(int index) 直接ҎIndex取得ValueQ当然也可以直接ҎIndex取得Key|Ҏ名可不是getKey(int index)Q而是直接get(int index) 可以啦。接着我们惛_到当前Key值后面一个Key值所对应的ValueQ首先用indexOf(Object key) 取得IndexQ然后计其后面的Index再根据此Index取倹{如果想取得当前Key值后面一个Key|则不必要先取IndexQ这么麻烦,ListOrderedMap里有直接的方法可以取得当前Key值的前一个Key值和后一Key|分别?strong>previousKey(Object key)Ҏ?strong>nextKey(Object key)ҎQ返回nullDC到_或尾Q了Q或者没有找到和当前Key值匹配的Key?nbsp;。个至于q边Z么要有If和Else ifQ原因很单,和一般的索引一Pq回值是-1pC没有找到。我们在q里做了一个@环,而且我的q个ListOrderedMap的数列是保长度大于0的,所以我把index==list.size()-1的判断放在了前边Q如果不能确定长度是否大?Q还是先判断q回值是否ؓ-1为好?br>
本文只简单介l了ListOrderedMap的几U比较实用的ҎQ其他方法用方法可以参考Apache|站上的相关APIQ?a >http://commons.apache.org/collections/api-release/index.html
]]>手机上J2ME?D~程Q简单创?D立方?/title> http://www.tkk7.com/selina/archive/2006/03/10/34622.htmlSelina Selina Fri, 10 Mar 2006 03:07:00 GMT http://www.tkk7.com/selina/archive/2006/03/10/34622.html http://www.tkk7.com/selina/comments/34622.html http://www.tkk7.com/selina/archive/2006/03/10/34622.html#Feedback 0 http://www.tkk7.com/selina/comments/commentRss/34622.html http://www.tkk7.com/selina/services/trackbacks/34622.html 阅读全文 ]]> 「读书笔记」Thinking in Java 3rd Edition - 8: Interfaces & Inner Classes http://www.tkk7.com/selina/archive/2005/07/28/8600.htmlSelina Selina Thu, 28 Jul 2005 02:47:00 GMT http://www.tkk7.com/selina/archive/2005/07/28/8600.html http://www.tkk7.com/selina/comments/8600.html http://www.tkk7.com/selina/archive/2005/07/28/8600.html#Feedback 0 http://www.tkk7.com/selina/comments/commentRss/8600.html http://www.tkk7.com/selina/services/trackbacks/8600.html 8: Interfaces & Inner ClassesQ接口与内部c) 接口QinterfaceQ?/FONT> 当你implements一个interface的时候,你必Lq个interface的方法定义成public的。如果你不这么做Q那它就会变成package权限的,q样l过l承Q这些方法的讉K权限׃受到限制Q而这是Java的编译器所不允许的?BR>Java的“多重扎?BR> interface既给了你abstractcȝ好处Q又l了你interface的好处,因此只要基类的设计里面可以不包括妇女q法和成员变量的定义Q你应该优先用interface?BR>合ƈ接口时的名字冲突 在合q的接口里面放上同名ҎQ通常也会破坏E序的可L?BR>用承扩展interface 通常情况下,extends只能用于c,但是׃一个interface可以由多个接口拼接而成Q因此创建新的interface的时候可以用extends来表C其多个“基接口Qbase interfacesQ”。interface的名字要由逗号分隔?BR>帔R的分l?BR> interface是一U非常方便的Q创Zl常量值的工具?BR>q种Ҏ通常被称Z用“神奇数字”,q且使得代码的维护变得非常困难?BR>初始化接口中的数据成?BR> q些数据都不是接口的组成部分,相反它们保存在这个接口的静态存储区内?BR>接口的嵌?/EM> 实现private接口成了一U“强制你区定义那个接口的ҎQ但是又不让你添加Q何类型信息(也就是说不允怸传)”的手段了?BR>接口与接口也可以嵌套Q不q接口的规则仍然有效——特别是接口的所有元素都必须是public的这条,因此嵌套在接口中的接口也都自动是public的,它们不能是private的?BR>特别要注意的是,实现接口的时候,不一定要实现嵌套在里面的接口。同样private接口只能在定义它的类里实现?BR>内部c?BR> 内部cL一U非常有价值的Ҏ,它能让你在逻辑上将怺从属的类l织hQƈ且在cȝ内部控制讉K权限。但是切讎ͼ内部cd合成是截然不同的Q这一炚w帔R要?BR>内部cM上传 普通类Q非内部c)是不能被定义成private或protected的;它们只可能是public或package权限的?BR>在方法和作用域里的内部类 内部cd以被创徏在方法内部,甚至是Q何一个作用领域。这么做有两个理由: 1. 像前面所说的Q你在实现某个接口,q样你才能创建ƈ且返回这个接口的reference?BR>2. 你正在处理一个复杂的问题Q需要创Z个类Q但是又不想让大安知道q有q么一个类?BR>匿名内部c?/EM> 如果你在定义匿名内部cȝ时候,q要用到外面的对象,那编译就会要求你把这个参数的reference声明成final的。如果你忘了Q编译的时候就会报错?BR>实际上实例初始化q程是匿名内部cȝ构造函数。当Ӟ它的功能是有限的Q你不能重蝲实例初始化,因此你只能有一个构造函数?BR>与宿ȝ的关p?BR>嵌套c?/EM> 如果你不需要这U“内部类对象和宿ȝ对象之间”的联系Q那么你可以把内部类定义成static的。潜逃类的意思是Q?BR>1. 无须宿主cȝ对象p创徏嵌套cȝ对象?BR>2. 不能在嵌套类的对象里面访问非static的宿ȝ对象?BR>普通内部类的成员数据和Ҏ只能到类的外围这一层,因此普通的内部c里不能有static数据Qstatic数据成员或嵌套类。但是,q些东西嵌套c里都可以有?BR>普通(非staticQ的内部c需要用特D的this reference来与宿主cd象保持联pR而嵌套类不需要这个this referenceQ这׃得它与staticҎ有些怼了?BR>引用宿主cȝ对象 在多层嵌套的c里向外讉K l承内部c?/EM> {到要创建构造函数的时候,默认的构造函数玩不{了,你必Ml他宿主cd象的reference。此外,你还必须在构造函数里面用这U语法: enclosingClassReference.super(); q样才能提供那个必须的referenceQ而程序也才能~译通过?BR>内部cd以被覆写吗? 本地内部c(Local inner classesQ?BR> 选择本地内部c而不是匿名内部类的唯一原因是Q你必须创徏那种cȝ对象?BR>内部cȝ标识W(Inner class identifiersQ?/EM> Z么要有内部类Q?BR> 每个内部c都可以独立地承某个“实玎ͼimplementationQ”。因此,内部cM会受“宿ȝ是否已经l承了别的实现”的U束?BR>1. 内部cd以有多个实例Q而每个又都可以有它自qQ与宿主cd象无关的状态信息?BR>2. 一个宿ȝ里可以放上好几个内部c,它们可以用各自不同的方式来实现同一个interface或承同一个类?BR>3. 内部cd象创建的时机与宿ȝ对象的创建没什么关pR?BR>4. 内部cM存在什么让人头晕的“是”关p;他是一个独立的实体?BR>Closure与回调(Closures & CallbacksQ?/EM> 创徏内部cȝ时候,别去扩展或者修改宿ȝ的接口?BR>内部cM控制框架QInner classes & control frameworksQ?BR> 1. 在一个类里完整地实现整个控制框架Q这样就把“实现”里的所有独一无二东西全部都给装h了。内部类则用来表C各U解军_体问题所需的action()?BR>2. 内部cd以让q个实现看上M至于太古怪,因ؓ它还可以直接讉K宿主cȝ所有成员。要不是q样的话Q代码就会变得非常杂乱,q样到最后你肯定会去找一个替代方案的?BR>ȝ l习 ]]>「读书笔记」Thinking in Java 3rd Edition - 7: Polymorphism http://www.tkk7.com/selina/archive/2005/07/26/8469.htmlSelina Selina Tue, 26 Jul 2005 04:58:00 GMT http://www.tkk7.com/selina/archive/2005/07/26/8469.html http://www.tkk7.com/selina/comments/8469.html http://www.tkk7.com/selina/archive/2005/07/26/8469.html#Feedback 0 http://www.tkk7.com/selina/comments/commentRss/8469.html http://www.tkk7.com/selina/services/trackbacks/8469.html 7: PolymorphismQ多态性) 再访上传QupcastingQ?/FONT> 把对象的cd忘掉 问题的关?BR> Ҏ调用的绑?BR> 当绑定发生在E序q行之前Ӟ如果有的话,是q译器或连接器负责Q被UC“前l定Qearly bindingQ”?BR>“后l定Qlate bindingQ”的意思是要在E序q行的时候,Ҏ对象的类型来军_该绑定哪个方法。后l定也被UCؓ“动态绑定(dynamicQ”或“运行时l定Qrun-time bindingQ”?BR>除了static和finalҎQprivateҎ隐含有final的意思)QJava的所有的Ҏ都采用后l定。也是_通常情况下你不必考虑是不是应该采用后l定——它是自动的?BR>产生正确的行?BR>可扩展?BR>错误Q“覆写”private的方?BR> 只有非private的方法才能被覆写Q别用基cȝprivateҎ的名字去命名zcȝҎ?BR>抽象cd抽象Ҏ 如果cd含一个或多个抽象ҎQ那么这个类必被定义成abstract的。(否则~译器就会报错了。) 创徏一个不包含abstractҎ的abstractc,是完全可以的。这U技巧可以用于“不必创建abstract的方法,但是又要止别h创徏q个cȝ对象”的场合?BR>构造函C多态?BR> 构造函C是多态的Q实际上他们都是staticҎQ只是声明的时候没有直_?/FONT> 构造函数的调用序 复杂对象的构造函数的调用序Q?BR>1. 调用基类的构造函数。这是一个递归q程Q因此会先创建承体pȝ根,然后是下一U派生类Q以此类推,直到最后一个承类的构造函数?BR>2. 成员对象按照其声明的序q行初始化?BR>3. 执行l承cȝ构造函数的正文?BR>l承与清?/EM> 对象与对象之间有可能会有依赖关系Q因此清理的序应该与初始化的顺序相反。对数据成员而言Q这是说它们的清理序应该与声明的序相反Q因为数据的初始化是按照声明的顺序进行的Q。对基类而言Q它采用了C++拆构函数的Ş式)Q你应该先进行派生类的清理,再进行基cȝ清理?BR>多态方法在构造函C的行?BR> 如果你在构造函数里面调用了动态绑定的ҎQ那么它会用那个覆写后的版本?BR>一个好的构造函数应该,“用最的工作量把对象的状态设|好Q而且要尽可能地避免去调用Ҏ。”构造函数唯一能安全调用的ҎQ就是基cȝfinalҎ。(q一条也适合privateҎQ因为它自动是final的。)它们不会被覆写,因此也不会生这U意外的行ؓ?BR>用承来q行设计 使用l承来表C为的不同Q而用成员数据来表CZ同的状态?BR>U承与扩展 下传与运行时的类型鉴?BR> ȝ l习
「读书笔记」Thinking in Java 3rd Edition - 8: Interfaces & Inner Classes
]]>「读书笔记」Thinking in Java 3rd Edition - 6: Reusing Classes http://www.tkk7.com/selina/archive/2005/07/20/8024.htmlSelina Selina Wed, 20 Jul 2005 01:49:00 GMT http://www.tkk7.com/selina/archive/2005/07/20/8024.html http://www.tkk7.com/selina/comments/8024.html http://www.tkk7.com/selina/archive/2005/07/20/8024.html#Feedback 0 http://www.tkk7.com/selina/comments/commentRss/8024.html http://www.tkk7.com/selina/services/trackbacks/8024.html 6: Reusing ClassesQ复用类Q?BR> W一U非常简单:在新的类里直接创建旧的类的对象。这被称为合成(compostionQ?BR>W二U方法更为精妙。它会创Z个新的,与原来那个类同属一U类型的cR你全盘接受了就cȝ形式Q在没有对它做修改的情况下往里面d了新的代码。这U神奇的做法被称为承(inheritanceQ?BR>合成所使用的语?/FONT> 如果你想对referenceq行初始化,那么可以在以下几个时间进行: 1. 在定义对象的时候。这意味着在构造函数调用之前,它们已经初始化完毕了?BR>2. 在这个类的构造函数里?BR>3. 在即用那个对象之前。这U做法通常被称为“偷懒初始化Qlazy initalizationQ”。如果碰到创建对象的代h很高Q或者不是每ơ都需要创建对象的时候,q种做法p降低E序的开销了?BR>l承所使用的语?BR> l承设计斚w有一条通用准则Q那是把数据都设成private的,把方法都设成public的。当然碰到特D情况还要进行调_但是q还是一条非常有用的准则?BR>基类的初始化 构造行为是从基cZ向外”发展的Q所以基cM在派生类的构造函数访问它之前先进行初始化?BR>带参数的构造函?BR> 如果cL有默认的构造函敎ͼ也就是无参数的构造函敎ͼQ或者你要调用的基类构造函数是带参数的Q你必ȝsuper关键词以及合适的参数明确地调用基cȝ构造函数?BR>Ҏ生类构造函数而言Q调用基cȝ构造函数应该是它做的第一件事?BR>捕获基类构造函数抛出的异常 ~译器会强制你将基类构造函数的调用攑֜zcȝ构造函数的最前面?BR>把合成和l承l合h 虽然~译器会强制你对基类q行初始化,q且会要求你在构造函数的开始部分完成初始化Q但是它不会查你是不是进行了成员对象的初始化Q因此你只能自己留神了?BR>保q行妥善地清?BR> 先按照创建对象的相反序q行cȝ清理。(一般来_q要求留着基类对象以供讉K。)然后调用基类的清理方法?BR>最好不要依赖垃圑֛收器dM与内存回收无关的事情。如果你要进行清理,一定要自己写清理方法,别去用finalize()?BR>名字的遮?BR> 用合成还是?/FONT> 合成与扉K能让你将子对象植入新的类Q合成是昑ּ的,l承是隐含的Q?BR>合成用于新类要用旧cȝ功能Q而不是其接口的场合。也是_把对象嵌q去Q用它来实现新类的功能,但是用户看到的是新类的接口,而不是嵌q去的对象的接口。因此,你得在新c里嵌入private得就cd象?BR>有时Q让用户直接讉K新类的各个组成部分也是合乎情理的Q这是_成员对象定义成public?BR>l承要表辄是一U“是Qis-aQ”关p,而合成表辄是“有Qhas-aQ”关pR?BR>protected 对用戯言Q它是private的,但是如果你想l承q个c,或者开发一个也属于q个package的类的话Q就可以讉K它了。(Java的protected也提供package的权限。) 最好的做法是,数据成员设成private的;你应该永q保留修改底层实现的权利Q然后用protected权限的方法来控制l承cȝ讉K权限?BR>渐进式的开?/FONT> 上传 Z么叫“上传”? 把派生类传给基类是沿着l承囑־上送,因此被称为“上传(upcastingQ”。上传L安全的,因ؓ你是把一个较具体的类型{换成较ؓ一般的cd。也是说派生类是基cȝ集QsupersetQ。它可能会有一些基cL没有的方法,但是它最要有基cȝҎ。在上传q程中,cȝ接口只会减小Q不会增大?BR>合成q是l承Q再p q用l承的时候,你应该尽可能的保守,只有在它能带来很明显的好处的时候,你才能用。在判断该用合成还是承的时候,有一个简单的办法Q就是问一下你是不是会把新cM传给基类。如果你必须上传Q那么承就是必ȝQ如果不需要上传,那么p再看看是不是应该用承了?BR>final关键?/FONT> 设计和效?BR>final的三U用途:数据QdataQ,ҎQmethodQ和c(classQ?BR>final的数?BR> 帔R能用于下列两个情况: 1. 可以是“编译时的常量(compile-time constantQ”,q样再也不能改了?BR>2. 也可以是q行时初始化的|q个g以后׃惛_改了?BR>如果是编译时的常量,~译器会把常量放到算式里面;q样~译的时候就能进行计,因此也就降低了运行时的开销。在Java中这U常量必Lprimitive型的Q而且要用final关键词表C。这U常量的赋值必d定义的时候进行?BR>一个既是static又是final的数据成员会只占据一D内存,q且不可修改?BR>对primitive来说Qfinal会将q个值定义成帔RQ但是对于对象的reference而言Qfinal的意思则是这个reference是常量。初始化的时候,一旦将referenceq到了某个对象,那么它就再也不能指别的对象了。但是这个对象本w是可以修改的;Java没有提供某个对象作成常量的Ҏ。(但是你可以自己写一个类Q这样就可以把类当作帔R了。)q种局限性也体现在数l上Q因为它也是一个对象?BR>I白的final的数据(Blank finalsQ?/EM> Java能让你创建“空白的final数据Qblank finalsQ”,也就是说把数据成员声明成final的,但却没给初始化的倹{碰到这U情况,你必dq行初始化,在世用空白的final数据成员Q而且~译器会强制你这么做。不q,I白的final数据也提供了一U更为灵zȝq用final关键词方法,比方_现在对象里的final数据p在保持不变性的同时又有所不同了?BR>你一定得为final数据赋|要么是在定义数据的时候用一个表辑ּ赋|要么是在构造函数里面进行赋倹{ؓ了确保final数据在用之前已l进行了初始化,q一要求是强制的?BR>Final的参?BR> Java允许你在参数表中声明参数是final的,q样参数也变成final了。也是_你不能在Ҏ里让参数 reference指向另一个对象了?BR>FinalҎ 使用finalҎ的目的有二。第一QؓҎ上“锁”,q制zc进行修攏V第二个原因是效率?BR>final和private 如果Ҏ是private的,那它׃属于基类的接口。它只能是被类隐藏h的,正好有着相同的名字的代码。如果你在派生类里创Z同名的public或protectedQ或package权限的方法,那么它们同基cM可能同名的方法,没有M联系。你q没有覆写那个方法,你只是创Z一个新的方法?BR>Finalc?/EM> 把整个类都定义成final的(把final关键词放到类的定义部分的前面Q就{于在宣布,你不会去l承q个c,你也不允许别人去l承q个cR?BR>finalcȝ数据可以是final的,也可以不是final的,q要׃来决定。无论类是不是final的,q一条都适用于“将final用于数据的”场合。但是,׃finalcȝ致了l承Q覆写方法已l不可能了,因此所有的Ҏ都隐含地变成final了?BR>心使用final 初始化与cd装蝲 W一ơ用static数据的时候也是进行初始化的时候。装载的时候,static对象和static代码D会按照它们字面的顺序(也就是在E序中出现的序Q进行初始化。当然static数据只会初始化一ơ?BR>l承情况下的初始?/EM> 1. 装蝲E序。先装蝲zc,然后装蝲基类?BR>2. 执行“根基类Qroot base classQ”。先是基cȝstatic初始化,然后是派生类的static初始化?BR>3. 创徏对象。首先,primitive都会被设成它们的~省|而reference也会被设成null。然后,调用基类的构造函敎ͼ再调用派生类的构造函数?BR>ȝ l习
「读书笔记」Thinking in Java 3rd Edition - 7: Polymorphism
]]>「读书笔记」Thinking in Java 3rd Edition - 5: Hiding the Implementation http://www.tkk7.com/selina/archive/2005/07/12/7553.htmlSelina Selina Tue, 12 Jul 2005 09:38:00 GMT http://www.tkk7.com/selina/archive/2005/07/12/7553.html http://www.tkk7.com/selina/comments/7553.html http://www.tkk7.com/selina/archive/2005/07/12/7553.html#Feedback 0 http://www.tkk7.com/selina/comments/commentRss/7553.html http://www.tkk7.com/selina/services/trackbacks/7553.html 5: Hiding the ImplementationQ隐藏实玎ͼ packageQ类库的单元 创徏独一无二的package名字 Java的约定是package名字的第一部分应该是类的创的Internet域名的反写?BR>使用JAR文g的时候会有一点变化。除了要告诉它该到哪里去找这个JAR文gQ你必须文件名攑ֈCLASSPATH里面?BR>冲突 一个自定义的工L?BR>使用import来改变程序的行ؓ方式 使用package的忠?BR> Java的访问控制符 package讉K权限 如果你想让别讉K到这个成员,那唯一办法是Q?BR>1. 把这个成员做成public的。这样Q何hQQ何地方就都能讉K到它了?BR>2. 不放M讉K控制W,赋予q个成员package权限Q然后往package里面攑օ它类。这Pq个package的其它类p讉Kq个成员了?BR>3. l承c除了能讉K父类的public成员之外Q还可以讉K其protected成员Q但是不能访问private成员Q。只有当两个c都同属一个package的时候,它才能访问package成员?BR>4. 提供“访问器/修改器”方法(accessor/mutatorҎQ也被称为“get/set”方法)。以OOP的观点衡量,q是最合理的做法,而且也是JavaBean的基?BR>publicQ访问接口的权限 默认的package Java会认cL件是属于q个目录的“默认”的Q因此对q个目录里边的其它文件来_它们都是package权限的了?BR>privateQ你都C刎ͼ 始终如一C用privateq是很重要的Q特别是遇到多线E的时候?BR>protectQ承的讉K权限 接口QInterfaceQ与实现QimplementationQ?BR> cȝ讉K权限 1. 每个~译单元Q文Ӟ只能有一个publiccR这么做的意思是Q每个编译单元只能有一个公开的接口,而这个接口就由其publiccL表示。你可以Ҏ需要,往q个文g里面dL多个提供辅助功能的package权限的类。但是如果这个编译单元里面有两个或两个以上的publiccȝ话,~译器就会报错?BR>2. publiccȝ名字必须和这个编译单元的文g名完全相同,包括大小写。如果你不遵守,~译器又要报错了?BR>3. ~译单元里面可以没有publicc,虽然q种情况不常见,但却是可以的。这是,你就能随意ؓ文g起名字了?BR>ȝ l习
「读书笔记」Thinking in Java 3rd Edition - 6: Reusing Classes
]]>「读书笔记」Thinking in Java 3rd Edition - 4: Initialization & Cleanup http://www.tkk7.com/selina/archive/2005/07/11/7493.htmlSelina Selina Mon, 11 Jul 2005 03:52:00 GMT http://www.tkk7.com/selina/archive/2005/07/11/7493.html http://www.tkk7.com/selina/comments/7493.html http://www.tkk7.com/selina/archive/2005/07/11/7493.html#Feedback 0 http://www.tkk7.com/selina/comments/commentRss/7493.html http://www.tkk7.com/selina/services/trackbacks/7493.html 4: Initialization & CleanupQ初始化与清理) 用构造函数确保初始化 注意Q编E风D求的Ҏ的首字母要小写的要求不适用于构造函敎ͼ因ؓ构造函数的名字必须与类的名字完全相同?BR>构造函数是一U特D的ҎQ它没有q回倹{这一点同void型的Ҏ有着本质上的区别Qvoid型的Ҏ什么都不返回,但这是你军_的,你也可以让它q回些什么。而构造函数则什么都不返回,而且你别无选择Qnew表达式确实会q会q回q个新创建的对象的referenceQ但是构造函数本w不q回M|。如果构造函数能有返回|而且你还可以选择q个|那么~译器就要问了,它应该怎样处置q个q回倹{?BR>Ҏ的重?/STRONG> 区分l过重蝲的方?/EM> 即是参数顺序的颠倒也以两个方法区分开来。(不过Q通常情况下别用这U办法,因ؓq会产生难以l护的代码。)对primitiveq行重蝲 如果实参Q真正调用方法的那个参数Q的cd比Ş参(Ҏ的定义中所声明的参敎ͼ的类型小Q那么数据会先提升?BR>如果你传的参数比它大Q那么你只能把它{换成q个cd的倹{把cd的名字放在括号里p了。不q么做,~译器就会报错?BR>用返回值重?/EM> 调用Ҏ的时候是可以忽略q回值的。由于你q不兛_Ҏ调用所q回的|而只惛_用其副作用,因此q通常被称为“ؓ利用其副Ҏ而调用方法(calling a method for its side effectQ”。因此,不能用返回值来区分重蝲的方法?BR>默认的构造函?BR> 如果你写了一个没有构造函数的c,那么~译器会自动Z创徏一个默认的构造函数。但是,只要定义了构造函敎ͼ不管带不带参敎ͼQ编译器׃会再自动合成默认的构造函C?BR>this关键?BR>this关键词只能用于方法内部,它负责返回调用这个方法的对象的reference。记住,如果你想在别的类的方法里调这个类的方法,那么无须使用thisQ直接调用就是了。当前对象的this会自动地用于其它Ҏ。this只应用于那些Q你明确指明要用对象的reference的特D情c?BR>在构造函数里调用构造函?BR> 可以用this调用一个构造函敎ͼ但是不能调用两个。此外,你还得在E序的最前面调用构造函敎ͼ否则~译器就会报错?BR>参数s的名字和cȝ数据成员s的名字相同,于是׃生了二义性。你可以用this.s来解册个问题。它表示你要用类的数据成员?BR>~译器不会让你在Ҏ里调用构造函敎ͼ除非它自己就是构造函数?BR>static的含?BR> cȝstaticҎ只能讉K其它staticҎ和static数据成员?BR>staticҎ有全局函数的意思,因此它不是面向对象的Q你不能用staticҎ向对象发消息Q因为它没有this。如果你发现用了很多staticҎQ那么你大概得重新思考一下你的设计策略了?BR>清理Qfinalization和垃圑֛?BR> 1. 对象不一定会被垃圑֛收器回收?BR>2. 垃圾回收不是拆构QdestructionQ?BR>Z么要有finalize()? 3. 垃圾回收只与内存有关?BR>不论对象是以什么方式创建的Q内存释N是由垃圾回收器负责的。只有在一些非常特D的场合才会需要用到finalize()Q这U场合就是内存是以创建对象以外的形式被分配给对象时?BR>你必M自进行清?BR> CQ垃圑֛收和finalize()都是靠不住的。只要JVMq没到快要耗尽内存的地步,它是不会费旉来回收垃圾以恢复内存的?BR>中止条g 垃圾回收器是如何工作?/EM> 自适应的,分代的,停止和拷贝,标识和清扫?BR>成员的初始化 如果变量是在Ҏ内部定义的局部变量,q种保障pCؓ~译时的错误信息?BR>指定初始?BR>用构造函数进行初始化 你ƈ没有排除自动的初始化Q它在构造函数运行之前就已经完成了?BR>初始化的序 变量的定义可能分散在cd义的各个地方Qƈ且与Ҏ的定义相互交错,但是变量的初始化会先于Q何方法,甚至是构造函数的调用?BR>静态数据的初始?/EM> 只有创徏了第一个对象之后(或者第一ơ访问static成员的时候)Q它们才会被初始化。此后,static对象׃会再作初始化了。如果先前没有创q种对象Q因而其static的成员尚未初始化的话Q初始化会先处理其static成员Q再处理非static的对象?BR>1. W一ơ创建Dogcȝ对象Q构造函数实际上是staticҎQ,或者第一ơ,讉KDogcȝstatic的方法或字段的时候,Java解释器会要搜寻classpathQ找到Dog.class?BR>2. 装蝲了Dog.class之后Q创ZClass对象之后Q,会对所有的static数据q行初始化。这L一个装?Class对象的时候,会先q行static成员的初始化?BR>3. 用new Dog()创徏新对象的时候,Dog对象的构E会先在堆里为对象分配够的内存?BR>4. q块内存先被清零Q这样就自动地把Dog对象的primitivecd的成员赋上缺省的|对于数字是Ӟ或者是相应的boolean和charQ,reference设成null?BR>5. 执行定义成员数据时所作的初始化?BR>6. 执行构造函数。这可能会牵涉到相当多的zdQ特别时有承的时候?BR>昑ּ的静态初始化 非静态的实例初始?/EM> q种语法为匿名内部类Qanonymous inner classQ的初始化提供了必不可少的支持?BR>数组的初始化 多维数据 ȝ l习
「读书笔记」Thinking in Java 3rd Edition - 5: Hiding the Implementation
]]>「读书笔记」Thinking in Java 3rd Edition - 3: Controlling Program Flow http://www.tkk7.com/selina/archive/2005/07/08/7337.htmlSelina Selina Fri, 08 Jul 2005 02:35:00 GMT http://www.tkk7.com/selina/archive/2005/07/08/7337.html http://www.tkk7.com/selina/comments/7337.html http://www.tkk7.com/selina/archive/2005/07/08/7337.html#Feedback 0 http://www.tkk7.com/selina/comments/commentRss/7337.html http://www.tkk7.com/selina/services/trackbacks/7337.html 3: Controlling Program FlowQ控制程序流E) 使用Javaq算W?BR> 几乎所有的q算W都只能作用于primitive。但是?’,?=’,以及?=’是例外Q它们可以作用于M对象Q由此也是对象方面一个很让h头晕的问题。)此外QStringcM支持?’和?=’?BR>优先U?BR>赋?/EM> primitive赋值的时候,是将内容从一个地方直接拷贝到另一个地斏V?BR>操控对象得通过reference来进行操作。当你“在对象之间”进行赋值得时候,实际上你是在拯它得reference?BR>Ҏ调用期间的aliasing 数学q算W?BR>正则表达式(Regular expressionsQ?BR>单元的加号和减号q算W?BR>自动递增与递减 对于前置递增和前|递减Q(也就?+a?-aQ,操作q程是会先计再q回。对于后|递增和后|递减Q(也就是a++和a--Q,操作步骤是先q回再计?BR>关系q算W?BR>试对象的相{?/EM> ==?=比较的是对象的reference。要x较这两个对象的实际内容,必须使用每个c都有的Q专门的equals()ҎQprimitives没有Q因?=?=q得很好)?BR>equals()的缺省行为是比较reference?BR>逻辑q算W?BR>短接 位运符 位运符可以?qv来用Q以表示同时q行计算和赋|&=Q|=和^=都是合法的。(至于~Q它既然是一个单元运符Q也׃需要同=l在一起了。) Booleancd会被当作只有一位的|所以它多少有点不同。你可以q行与,或,以及异或q算Q但是不能进行非q算Q可能是Z防止同逻辑非相hQ。对于booleanQ位q算用逻辑q算的在功能上是相同的,只是它没有短接。此外boolean的位q算里有一个逻辑q算所没有的异或?BR>UMq算W?/EM> 它只能用于整数型的primitive数据?BR>三元if-elseq算W?BR>逗号q算W?BR> Java里面Q唯一一个把逗号当运符用的地方是for循环?BR>String?q算W?BR>常见的用运符斚w的错?BR>cd转换q算W?/EM> 到所谓的narrowing conversion的时候(也就是说Q当你将一个能保存较多信息的数据类型,转换成一个保存不了这么多信息的数据类型时Q,它会产生一个异常。编译器会强制你明确地进行{换,实际上它的潜台词是“这么做可能很危险——如果你一定要做,那么h地告诉我”?BR>对于widening conversionQ就不必q行昑ּ转换了,因ؓ新类型可以存储比旧类型更多的信息Q所以什么都丢不了?BR>Java允许你对除boolean之外的其它primitivecd的数据进行Q意的转换Q而boolean则根本不能{换?BR>cL不允许{换的。要让他们相互{换,必须要有Ҏ的方法。(String是一个特例。此外,所有对象都可以在它的类p(family of typesQ里面上下传递。)帔RQLiteralsQ?BR> CQC++或者Java里面都没有两q制帔R值的表示Ҏ?BR>跟在帔R值后面的那个数字表明了它的类型。大写或者小写的L表示longQ大写或者小写的F表示floatQ而大写或者小写的D表示double?BR>~译器通常会把用指数表C的数字当成doubleQ所以在lfloat赋值如果没有后~的f的话Q它׃l你一个错误信息,告诉你你必须double转换成float?BR>提升 Java没有“sizeof?BR>重访优先U?BR> Ulcer Addicts Really Like C A lot.
Mnemonic
Operator type
Operators
Ulcer
Unary
+ - ++--
Addicts
Arithmetic(and shift)
* / % + - << >>
Really
Relational
> < >= <= == !=
Like
Logical(and bitwise)
&& || & | ^
C
Conditional(ternary)
A > B? X: Y
A Lot
Assignment
= (and compound assignment like *= )
q算W的ȝ boolean的限制性是很强的。你只能赋给它true和falseq两个|而且只能试它的真或假,你不能把boolean值加hQ或者进行其它什么操作?BR>q行数学q算的时候,charQbyteQ以及shortQ都会先q行提升Q而运结果也是intQ因此如果想把它赋还l原先那个变量的话,旧必L地q行cd转换Q属于会丢失信息的narrowing conversionQ?BR>执行控制 true和false if-else return 循环语句 do-while while与do-while的唯一区别是Q即使第一ơ判断的l果是falseQdo-while的statement也会臛_q行一ơ?BR>for for循环通常被用于“计数”的d?BR>你可以在for语句里定义多个变量,但必L相同cd的?BR>只有for语句才有在“控制表辑ּ”里定义变量的能力。千万别在其它选择语句或@环语句里q么做?BR>逗号q算W?BR>break和continue break会忽略尚未执行的循环代码Qƈ且退出@环?BR>continue会蟩q尚未执行的代码Q中断本ơ@环,再进入下一周期的@环?BR>臭名昭著的“goto?/EM> 在Java里,唯一能放标签的地方,是在@环语句的外面。而且必须直接䏀—@环语句和标签之间不能有Q何东ѝ而这么做的唯一理由是Q你会嵌套多层@环或选择。因为通常情况下break和continue关键词只会中断当前@环,而用了标{之后,它就会退到label所在的地方?BR>1. 普通的continue会退到内部@环的最开始,然后l箋执行内部循环?BR>2. 带标{continue会蟩转到标签Qƈ且重新进入直接跟在标{面的循环?BR>3. break会从循环的“底部溜出去”?BR>4. 带标{break会从p个标{标识的循环的“底部溜出去”?BR>在Java里,能让你用标{唯一理由是Q在嵌套循环的同时还要用break和continue退出多层@环?BR>switch 在case语句里,单引hh的字W在用于比较的时候,会返回整数倹{?BR>计算l节 float或double转换成整数的时候,它L其后面的小数截厅R?BR>Math.random()会生?.0Q或者用数学术语Q它的值域是[0,1)?BR>ȝ l习
「读书笔记」Thinking in Java 3rd Edition - 4: Initialization & Cleanup
]]>「读书笔记」Thinking in Java 3rd Edition - 2: Everything is an Object http://www.tkk7.com/selina/archive/2005/07/07/7255.htmlSelina Selina Thu, 07 Jul 2005 03:32:00 GMT http://www.tkk7.com/selina/archive/2005/07/07/7255.html http://www.tkk7.com/selina/comments/7255.html http://www.tkk7.com/selina/archive/2005/07/07/7255.html#Feedback 0 http://www.tkk7.com/selina/comments/commentRss/7255.html http://www.tkk7.com/selina/services/trackbacks/7255.html 2: Everything is an ObjectQ万物皆对象Q?BR> 用reference操控对象 数据存在哪里 1. 寄存器(registersQ?BR>2. 栈(stackQ?BR>3. 堆(heapQ?BR>4. 静态存储(static storageQ?BR>5. 固定存储Qconstant storageQ?BR>6. 非内存的存储QNon-RAM storageQ?BR>特例Qprimitivecd
Primitive
type
Size
Minimum
Maximum
Wrapper
type
boolean
?/P>
?/P>
?/P>
Boolean
char
16-bit
Unicode 0
Unicode 216 -1
Character
byte
8-bit
-128
+127
Byte
short
16-bit
-215
+215 ?
Short
int
32-bit
-231
+231 ?
Integer
long
64-bit
-263
+263 ?
Long
float
32-bit
IEEE754
IEEE754
Float
double
64-bit
IEEE754
IEEE754
Double
void
?/P>
?/P>
?/P>
Void
高精度的数?/EM> BigInteger支持L_ֺ的整数?BR>BigDecimal能表CZQ意精度的点数?BR>Java中的数组 你永q不需要清理对?/FONT>作用?/EM> 对象的作用域 创徏新的数据cdQ类 数据成员与方?BR>primitive成员的缺省?BR>
Primitive type
Default
boolean
false
char
‘\u
byte
(byte)0
short
(short)0
int
0
long
0L
float
0.0f
double
0.0d
Ҏ、参数和q回?/FONT> Ҏ的名字再配合其参数列表,可以唯一地标识一个方法?BR>参数列表 构徏JavaE序 名字的可见?BR>使用其它lg static关键?BR> 对于非static的数据来_每个对象都会有一份,static的数据则变成乐每个类只有一个?BR>同其它方法一PstaticҎ夜可以创建或使用它本w这个类型的对象Q所以staticҎ常常被用来管理本cd的对象,它就像是q些对象的“牧h”?BR> W一个JavaE序~译和运?BR> 注释和嵌入式的文?BR>注释文档 语法 Javadoc有两U主要的用法Q嵌入式的HTML和用“文档标讎ͼdoc tagsQ”?BR>“独立的文档标记QStandalone doc tagsQ”是一些由‘@’打头的命oQ它们会被放在注释行的开头。(但是打头的个?’则被忽略了。) “内嵌式的文档标讎ͼinline doc tagsQ”则可以出现在Q何地方,它也是由‘@’开始的Q但是要用花括号括v来?BR>嵌入的HTML 所有类型的注释文档——类Q变量,以及Ҏ——都支持嵌入的HTML?BR>标记举例 @seeQ引用其它类 {@link package.class#member label} {@docRoot} {@inheritDoc} @version @author 你可以放多个作者标讎ͼ但是必须q箋放。在HTML文g里,所有作者信息都攑֜一赗?BR>@since @param @param标记可以有好几个Q每个标记表CZ个参数?BR>@return @throws @deorecated Deprecate标记用户不再使用q个Ҏ,因ؓ未来q个Ҏ可能会从程序里面取出。客L序用了@deprecated标记的方法会D~译器报一个警告消息?BR>文档举例 ~程风格 Code Conventions for the Java Programming Language所推荐的风格是Q用W一个字母大写来表示q是cȝ名字。如果类名由多个单词l成Q那么它们应该连在一P也就是说Q名字里面不要有下划U)Qƈ且其中的每个单词的第一个字母要大写Q这U风格有时被UCؓ“camel-casting”。其它东西:ҎQ数据成员(成员变量Q,对象的referenceQ其推荐的风格是Q除了首字母写Q其它部分与cd完全相同?BR> ȝ l习
「读书笔记」Thinking in Java 3rd Edition - 3: Controlling Program Flow
]]>「读书笔记」Thinking in Java 3rd Edition - 1: Introduction to Objects http://www.tkk7.com/selina/archive/2005/07/05/7149.htmlSelina Selina Tue, 05 Jul 2005 08:30:00 GMT http://www.tkk7.com/selina/archive/2005/07/05/7149.html http://www.tkk7.com/selina/comments/7149.html http://www.tkk7.com/selina/archive/2005/07/05/7149.html#Feedback 0 http://www.tkk7.com/selina/comments/commentRss/7149.html http://www.tkk7.com/selina/services/trackbacks/7149.html 1: Introduction to ObjectsQ对象简介) 抽象的过E?BR> 问题I间的元素同它在解决I间的表q称为“对象”。(此外q需要一些在问题I间q无对照的对象。) 面向对象的编E(Object-oriented programmingQ羃写是OOPQ方法: 1. 万物皆对象?BR>2. E序是一l相互之间传递消息,告诉Ҏq些什么的对象?BR>3. 每个对象都利用别的对象来l徏它自q记忆?BR>4. 对象都有cd?BR>5. 所有属于同一cd的对象都能接受相同的消息?BR>对象有状态、行为和标识?BR>对象有接?BR> cL一l具有相同特征(数据元素Q和行ؓQ功能)的对象,所以实际上cL一U数据类型?BR>区别Q类是程序员决特定问题而定做的Q而数据类型是Z表示机器的存储单元而设计的Q它是现成的Q是E序员无可奈何时的选择?BR>对象会提供服?/FONT> 优点Q能提高对象的内聚性(cohesionQ。内聚性高是高质量的Y件设计的一个基本要求:是说Y件的各种lgQ比如对象,也可以是Ҏ或类库)应该能很好的“组装在一起”?BR>隐藏实现 public表示后面跟着的东西谁都能用?BR>而private关键词则表示Q除非是cȝ创徏者用q个cȝҎq行讉KQ否则没讉K到这个元素。private是竖在你与客L序员之间的一堵墙。那些要讉Kprivate成员的hQ会在编译的时候得C个错误?BR>protected关键词很像privateQ它们的区别在于Q承类能够讉Kprotected成员Q但是不能访问private成员?BR>Javaq有个“缺省”的讉K权限Q如果你没用上面三个的话Q那是指它了。通常把它成ؓpackage讉K权限。因为同属这个package的类可以讉Kq个package中其它类的“缺省权限”的成员Q但是出了这个packageQ它们就都是private的了?BR>复用实现 ׃是用已有的类来合成新的类Q因此这一概念被成为合成(compositionQ如果这个对象是动态的Q通常把它成ؓ聚合aggregationQ。通常合成称为“有Qhas-aQ”关p,像“车有引擎”?BR>合成h极大的灵zL?BR>l承Q复用接?/FONT> 你有两种办法来区分新的派生出来的cd那个原来的基cR?BR>1. 直接往zc里加新的方法?BR>2. 也是更重要的区分Ҏ是在新的cM修改基类Ҏ的行为。这被称写(overrideQ那个方法?BR>“是”与“像”的关系 1. l果是能用派生类的对象直接替换基cȝ对象。可以把q种情况x完全替换Qpure substitutionQ,通常被称为替换原则(substitution principleQ。从某种意义上讲Q这是用承的理想Ҏ。通常我们把基cdzcȝq种关系UC是(is-aQ关pR?BR>2. 基类q是可以被新的类所替代Q但是这U替换是不完全的Q因为的Ҏ无法通过基类的接口访问。这可以被称为“像Qis-like-aQ”关pR?BR>可凭借多态性相互替换的对象 非OOP的编译器的做法被UCؓ前绑定(early bindingQ。在OOP中,不到q行的时候,E序没法定代码的地址Q所以向泛型对象发送一个消息的时候,p用到一些特别的手段。ؓ了解册个问题,OOP语言是用了后l定Qlate bindingQ的概念?BR>派生类当作它的基类来用的过E称Z传(upcastQ?BR>abstract基类和interface abstractҎ只能存在于abstractc里。如果有个类l承了abstractc,那么它要么实现这个方法,要么也是一个abstractcRabstractҎ能让你将Ҏ攑ֈ接口而不必ؓ它写一些无意义的代码?BR>interface关键词更是对abstractcȝ概念的深化,它不允许你实CQ何方法。interface是个很趁手也很常用的工具Q因为它能彻底地接口与实现分离开来。此外如果你愿意Q还可以l承多个接口Q因l承多个常规或是抽象cL不允许的?BR>对象的创建,使用和生命周?/STRONG> 1. 在写代码的时候决定将对象攑ֈ栈里Q有时会被称为automatic或scoped的变量)或是静态的存储区域。(C++Q速度快) 2. 在一个被UCؓ堆的内存池里动态地创徏对象。(JavaQ灵zL高Q?BR>Q在栈中分配存储I间通常只需一个汇~指令,把栈指针向下Ud行了Q想把指针指回来也只要一条指令。而堆的存储分配则取决于存储机制的设计。)Collection和P代器 Listc(以持有线性序列) Mapc(也称为关联性数lassociative arraysQ将一个对象同另一个对象关联v来) Setc(不持有两个相同的对象Q?BR>单根l承体系 JavaQ实际上除了C++所有其它OOP语言Q的回答是,是的Q而这个最l的基类叫Object.下传与模?泛型 沿着l承囑下传l一个更为具体的cdQ这U方式称Z传(downcastQ?BR>上传很安全,下传十有八九是不安全的?BR>参数化类型(parameterized typeQ是一U能够根据需要由~译器自动指z型的cR(C++Qtemplate/JavaQgenericsQ?BR>保正确地清?/EM> Java设计了一个垃圑֛收器来处理释攑ֆ存的问题Q仅此而已Q不包括清除对象的其它方面)?BR>垃圾回收器的效率与灵zL?/EM> C++Q编E复杂性较?BR>JavaQ效率和适用性较?BR>异常处理Q与错误打交?/FONT> 管在面向对象的语言中异帔R常以对象的形式出现Q但异常处理q不是一U面向对象的Ҏ。异常处理在面向对象的语a问世之前已l有了?BR>q发 Java能锁定Q何对象的内存Q毕竟这也是一U共享资源)Q这样同一时刻只有一个线E能够访问这些内存。这是由synchronized关键词来做的。其它资源就得靠E序员自己来锁定了。通常可以创徏一个表C资源的对象Q然后让U程在访问资源之前先查一下?BR>Persistence 轻量U的presistence既可以通过对象的序列化Qobject serializationQ,也可以通过数据对象QJava Data ObjectQ简UJDOQ来实现?BR>Java和Internat Web是什么? 客户/服务器系l?BR>把Web当作巨型的服务器 客户端编E?BR>插g 脚本语言 Java .NET和C# 安全?BR>Internet和Intranet 服务器端~程 应用E序 JavaZ么能成功 pȝ能更易于表述和理?BR>最大程度上利用cd 错误处理 ~写大项?BR> Javaq是C++Q?BR>ȝ
「读书笔记」Thinking in Java 3rd Edition - 2: Everything is an Object
]]>
վ֩ģ壺
鶹Ʒѿ |
ŮƵƵȫƵ |
av뾫ƷװƬ |
91Ƶ |
AVպAVһ |
ɫĻAV |
vƷƵ400 |
߾Ʒһ |
Ʒһ
|
ٸһ˳ |
ؼëƬߴȫѲ |
2022ҹһ |
ѹۿAVƬ |
Թ24
|
69ӰԺëƬѹۿƵ |
ɫ˵ |
ƷƬ |
ȫһҹëƬ |
ˬִ̼һ߳ |
պĻһ |
avһ |
պƵѹۿ |
91ѹԲ2021 |
һAëƬѹۿþþƷ
|
ҹ717 |
Ʒþþþþþ
|
ƬAëƬ |
ۺһƷ |
ۺϾƷ㽶þ97 |
˾þۺӰԺ |
ػaëƬƵ |
˿Ƶ |
˵Ӱ |
þþþþƷӰԺ |
aƬ77777kkkk |
Ůһ |
AëƬ |
ѻɫַ |
ҹƵѹۿ |
ɫwww |
rhгijվ |