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