??xml version="1.0" encoding="utf-8" standalone="yes"?>
1 在定义对象的时候。这意味着在调用构造函C前,他们已经初始化完毕了?br> 2在这个类的构造函数里?br> 3在即用那个对象之前。如果碰到创建对象的代h很高Q或者不是每ơ都需要创建对象的时候,q种做法p降低E序的开销?br> l承所使用的方?br> l承的时?必须使用extends关键词和基类的名字。之后新cd会自动获得基cȝ全部成员和方法。承不会限定只能用基cȝҎ。也可以往zc里加入新的Ҏ?br> 基类的初始化
当创Z个派生类的对象的时候,q个对象立门q有一个基cȝ对象。这个对象同基类自己创徏的对象没有Q何的差别。只是从外面看来q个对象是被包裹在派生类的对象里面?br> 基类的初始化只有一个方法能保证Q调用基cȝ构造函数来q行初始化,只有q样才能掌握怎样才能正确地进行初始化的信息和权限。java会让zcȝ构造函数自动地调用基类的构造函数?br> 带参数的构造函?br> 调用带参数的构造函数必M用super关键词以及合适的参数明确调用基类的构造函数?br> 保q行妥善地清?br> 一般情况下java会将需要清理的对象留给垃圾回收器去处理Q它不会d的进行清理。由于不知道垃圾回收器甚么时候启动,也不知道会不会启动,所有需要进行清理,必L地写一个专门干qg事情的方法,Z应付异常Q还要将q个Ҏ攑օfinally子句里面厅R不要去调用finalizeҎ?br> 用合成还是?br> 一般来_合成用于新类要用旧cȝ功能Q而不是其接口的场合,也就是说把对象嵌q去Q用它来实现新类的功能,但用L到的是新cȝ接口Q而不是嵌q去的对象的接口Q因此在新类里嵌入private的旧cd象,有时Z让用L接访问新cȝ各个l成部分也可以嵌入public的旧cd象。通常都应该将基类的成员数据定义ؓprivitecd。承表辄是一U?#8220;是(isQaQ?#8221;关系Q合成表辄?#8220;有(hasQaQ?#8221;关系Q对于一些需要对外部世界隐藏Q但要对它的l承cd攄基类 可以使用protected来定义那些开攄部分。最好的做法是,数据成员设成private 的;你应该永q保留修改底层实现的权利。然后用protected 权限的方法来控制l承cȝ讉K权限?br> 渐进式的开?br> l承的优点之一是Q它支持渐进式的开?incremental develop)。添加新的代码的时候,不会l老代码带来bugQ实际上新的bug 全都被圈在新代码里。通过l承已有的,已经能正常工作的c,然后再添加一些数据成员和Ҏ(以及重新定义一些原有的Ҏ)Q你可以不去修改那些可能q有人在用的老代码,因而也׃会造成bug 了。一旦发CbugQ你q道它肯定是在C码里。相比要M改老代码,C码会短很多,读v来也更简单。承实质上是在表达q样一U关p:“新的cL一U旧的类”?br> 上传
l承最重要的特征不在于它ؓ新类提供了方法,而是它表达了新类同基cM间的关系。这U关pd以被归纳Z句话“新类是一U原有的cR?#8221; (upcasting)”。上传L安全的,因ؓ你是把一个较具体的类型{换成较ؓ一般的cd。也是说派生类是基cȝ集(superset)。它可能会有一些基cL没有的方法,但是它最要有基cȝҎ。在上传q程中,cȝ接口只会减小Q不会增大。这是Z么编译器会允怽不作M明确的类型{换或Ҏ表示p行上传的原因了?br> 合成q是l承Q再探讨
在判断该使用合成q是l承的时候,有一个最单的办法Q就是问一下你是不是会把新cM传给基类。如果你必须上传Q那么承就是必ȝQ如果不需要上传,那么p再看看是不是应该用承了?br> final 关键?br> final 的三U用途:数据(data)Q方?method)和类(class)?br>Final 的数?br> 很多~程语言都有通知~译?#8220;q是Dc常?constant)?数据”的手Dc常量能用于下列两种情况Q?br>1. 可以?#8220;~译时的帔R(compile-time constant)”Q这样就再也不能改了?br>2. 也可以是q行时初始化的|q个g以后׃惛_改了?br>如果是编译时的常量,~译器会把常量放到算式里面;q样~译的时候就能进行计,因此也就降低了运行时的开销。在Java 中这U常量必Lprimitive 型的Q而且要用final 关键词表C。这U常量的赋值必d定义的时候进行?br> 一个既是static 又是final 的数据成员会只占据一D内存,q且不可修改?br> 当final 不是指primitiveQ而是用于对象的reference 的时候,意思就有点搞了。对primitive 来说Qfinal 会将q个值定义成帔RQ但是对于对象的reference 而言Qfinal 的意思则是这个reference 是常量。初始化的时候,一旦将reference q到了某个对象,那么它就再也不能指别的对象了。但是这个对象本w是可以修改的;Java 没有提供某个对象作成常量的Ҏ?但是你可以自己写一个类Q这样就能把cd做常量了?q种局限性也体现在数l上Q因为它也是一个对象?br> I白的final 数据 (Blank finals)
Java 能让你创?#8220;I白的final 数据(blank finals)”Q也是说把数据成员声明成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样参数也编Efinal了。也是_你不能在Ҏ里让参数reference 指向另一个对象了?br> Final Ҏ
使用final Ҏ的目的有二。第一QؓҎ?#8220;?#8221;Q禁止派生类q行修改。这是出于设计考虑。当你希望某个方法的功能Q能在承过E中被保留下来,q且不被覆写Q就可以使用q个Ҏ?br>W二个原因就是效率。如果方法是final 的,那么~译器就会把调用转换?#8220;内联?inline)”。当~译器看到要调用final Ҏ的时候,它就?Ҏ判断)舍弃普通的Q?#8220;插入Ҏ调用代码?#8221;~译机制(参数压入栈Q然后蟩L行要调用的方法的代码Q再跛_来清I栈Q再处理q回?Q相反它会用Ҏ本n的拷贝来代替Ҏ的调用。当然如果方法很大,那么E序׃膨胀得很快,于是内联也不会带来什么性能的改善,因ؓq种改善相比E序处理所耗用的时间是微不道的。Java 的设计者们暗示q,Java 的编译器有这个功能,可以地判断是不是应该final Ҏ做成内联的。不q,最好还是把效率问题留给~译器和JVMd理,而只把final 用于要明地止覆写的场合?br>final 和private
private Ҏ都隐含有final 的意思。由于你不能讉Kprivate 的方法,因此你也不能覆写它。你可以lprivate Ҏ加一个final 修饰W,但是q样做什么意义也没有。这个问题有可能会造成混ؕQ因为即使你覆写了一个private Ҏ(它隐含有final 的意?Q看上去它还是可以运行的Q而且~译器也不会报错?br> 只有是基cL口里的东西才能被“覆写”。也是_对象应该可以被上传到基类Q然后再调用同一个方?q一点要C一章才能讲得更清楚?如果Ҏ是private 的,那它׃属于基类的接口。它只能是被类隐藏h的,正好有着相同的名字的代码。如果你在派生类里创Z同名的public 或protectedQ或package 权限的方法,那么它们同基cM可能同名的方法,没有M联系。你q没有覆写那个方法,你只是创Z一个新的方法。由于private Ҏ是无法访问的Q实际上是看不见的,因此q么作除了会影响cȝ代码l构Q其它什么意义都没有?br> Final c?br> 把整个类都定义成final ?把final 关键词放到类的定义部分的前面)q于在宣布Q你不会ȝ承这个类Q你也不允许别hȝ承这个类。换a之,Zcȝ设计考虑Q它再也不需要作修改了,或者从安全角度出发Q你不希望它再生出子cR?br> 注意Qfinal cȝ数据可以是final 的,也可以不是final 的,q要׃来决定。无论类是不是final 的,q一条都适用?#8220;final 用于数据?#8221;场合。但是,׃final cȝ止了l承Q覆写方法已l不可能了,因此所有的Ҏ都隐含地变成final 了。你可以为final cȝҎ加一个final 修饰W,但是q一h什么意义?br> 心使用final
看来Q设计类的时候将Ҏ定义成final 的,会是一个很明智的决定。可能你会觉得没Z要覆写你的方法。有时确实是q样?
使用import导入一个完整的cLcd。package的名U是独一无二?Q不要import两个同名的类否则会引起冲H?br> java的访问控制符Q类只能被定义public ?packageQ默认的没有定义讉K控制W的Q,而类内部数据成员和方?被定义public的可以被Mc都能访问,被定义protected的数据成员或Ҏ只能被该cȝ子类讉KQ定义package的数据成员或Ҏ只能被同一目录下的c访问,private的成员或Ҏ只能被类的内部数据成员或Ҏ讉K?br> cȝ讉K权限Q每个编译单元只能有一个publicc,只是Z保证每个~译单元只能有一个公共接口,可以Ҏ需要往q个~译单元里添加package权限的类Qpublic的类必须和这个编译单元一L文g?nbsp;