10Q检类?BR> q行时类型识?run-time type identificationQ羃写ؓRTTI)?/P>
Z么会需要RTTI
collection是一U工P它只有一U用途,是要ؓ你保其它对象。因此出于通用性的考虑Q这些collection应该能持有Q何东ѝ所以它们持有Object?BR>
Class对象
惌知道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>
Class.forName("一个类的名?);
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>
Class常数
Javaq提供了一U获取Class对象的reference的方法:“class常数(class literal)”?BR> cȝ名字.class;
q种写法不但更简单,而且也更安全Q因为它是在~译时做查的。此外由于没有方法调用,它的执行效率也更高一些?BR>
Class常数不但能用于普通类Q也可以用于接口Q数l和primitivecd。此外,每种primitive的wrapperc还有一个标准的Q名?TYPE的数据成员。这个TYPE能返回“与q种primitive相关联的wrappercZ的Class对象的referenceQ就像这P
... {同?...
boolean.class Boolean.TYPE
char.class Character.TYPE
byte.class Byte.TYPE
short.class Short.TYPE
int.class Integer.TYPE
long.class Long.TYPE
float.class Float.TYPE
double.class Double.TYPE
void.class Void.TYPE
我喜Ƣ尽量用?class”,因ؓq种写法与普通类的保持一致?BR>
转换之前先作?BR> 到目前ؓ止,你看到的RTTI的Ş式有Q?BR> 1。经典的cd转换Q如?Shape)”,q种转换要经qRTTI的检查。要是做了错误的转换Q它׃抛出ClassCastException?BR> 2.代表对象cd的Class对象。你可以在运行的时候查询Class对象Q以此来获取所需的信息?BR>
如果不进行明的cd转换的话Q编译器时不会让你把对象赋给zcȝreference的?BR>
Java里面q有W三URTTI的Ş式。这是instanceof关键词,它会告诉你对象是不是某个cȝ实例。它q回的是一个boolean倹{?BR>
使用cd?BR>
动态的instanceof
isInstance()能完全替代instanceof?BR>
instanceof vs. Class的相{?/P>
RTTI的语?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>
ReflectionQ运行时的类信息
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>
一个提取类的方法的E序
一般来_你不太会直接使用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>
ȝ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>
2005q?3?9?12:55 PM
9Q用异常来处理错?/P>
基本异常
“异常条?exceptional condition)”是一U能L正在q行的方法或其某一部分l箋q行下去的问题?BR>
异常的参?BR> 所有的标准异常都有两个构造函敎ͼW一个是默认的构造函敎ͼW二个是要拿一个字W串当参数的?/P>
捕获异常
“守护区?guarded region)”是一D可能生异常的代码Qƈ且后面还跟着要处理这些异常的代码?BR>
Try区块
异常处理E序(exception handler)
“中止”还是“l?/P>
创徏你自q异常
Thorowablec?Exception是从它那里承的)printStackTrace()Ҏ会返回“被调用的方法是l过怎样一个顺序到辑ּ常发生地点”的信息。缺省情况下Q这些信息会送到标准错误,但是q个Ҏ的重载版也允怽结果送到其他?BR> 对于异常cL_getMessage()有点像toString()?/P>
异常说明
会在~译时进行检查ƈ且强制得到处理的异常被称为checked exception.
捕捉Lcd的异?BR> 重抛异常
fillInStackTrace()Q这个方法会当前栈的信息塞q旧的异常对象中Qƈq回一个Throwable对象?BR>
异常?exception chaining)
JDK 1.4中所有的Throwable的子c都有一个能接受cause(原因)对象的构造函数。这个cause是用来保存前一个异常的?BR> 在Throwable的子cMQ只有三U基本的异常cL供了带cause参数的构造函敎ͼ它们是ErrorQ供JVM报告pȝ错误只用Q, Exception和RuntimeException。如果你要链接其他异常,那就不能用构造函敎ͼ而只能用initCause()Ҏ了?/P>
标准Java异常
RuntimeException表示~程错误Q?BR> 1。一U你无法预料的错误。比如不在你控制之内的null reference?BR> 2。一U由于“程序员忘了查它应该查的错误条g”而造成的错误(比如ArrayIndexOutOfBoundsExceptionQ你讉K数组的时候应该对数组的大做一个检查)。第一U情况下发生的异常,l常会演变成W二U情况下的问题?/P>
用finallyq行清理
如果你把try区放q一个@环,你就能构Z个程序运行之前必L的条g了。你也可以在循环里加上static的计数器Q或其它什么东西,让它退Z前多试几U方法。这样你p把程序的强壮性就能更上一个台阶?BR>
finally是用来干什么的Q?BR> 当你需要把内存以外的东西设|到原先状态的时候,finally显得很有必要了?BR> 甚至是在“异常没有被当前q组catch子句所捕获”的情况下,finally也会在“异常处理机制在更高一层的q行环境中开始寻扑֤理程序”之前得到执行?BR>
错误Q丢q异常
加在异常上面的限?BR> zcȝ构造函C能捕获Q何由基类构造函数抛出的异常?BR> 在承过E中Q编译器会对异常说明作强制要求,但异常说明本wƈ不属于方法的特征(signature)Q特征是由方法的名字与参数的cdl成的。因此,你不能根据异常说明来重蝲Ҏ。此外,一个出现在基类Ҏ的异常说明中的异常,不一定会出现在派生类Ҏ的异常说明里。这点同l承的规则有明显不同Q在l承中,基类的方法必d现在l承c里。换一句话_在承和覆写的过E中Q方法的“异常说明的接口”不是变大而是变小了-Q这正好和接口在l承时的情Ş相反?/P>
构造函?BR> 所有的清理Q-除了内存清理之外Q-都不会自动发生?/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也是在为程序的健壮性作长期投资。)
ȝQJava异常处理的目的就是要让我们能用比现在更少的代码,以一U更单的方式来开发大型,可靠的程序,q且让你在开发过E中能更自信“你的程序里面没有未l处理地错误”。异怸是特别难学,但是却能l项目带来立杆见q效果?BR>
2005q?3?5?3:31 PM
8Q接?interface)与内部类(inner class)
接口(interface)
可以把它惌成“纯的”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>
Java的“多重?multiple inheritance)”?BR> 只要基类的设计里面可以不包括Ҏ合成员变量的定义Q你应该优先用interface。只有在不得不定义方法或成员变量的情况下Q你才能把它Ҏabstractc,或者根据需要改成实体类?BR>
合ƈ接口时的名字冲突
用承扩展interface
你可以用l承Q往interface里面d新的ҎQ也可以用承把多个interface合ƈ成一个新的interface。在q两U情况下Q你所得到的都只是一个新的interface?BR>
帔R的分l?BR> ׃interface的数据成员自动就是static和final的,因此interface是一U非常方便的Q创Zl常量值的工具?BR> interface的成员自动就是public的?BR>
初始化接口中的数据成?BR>
接口的嵌?/P>
内部c?BR>
内部cM上传
实际上,对象上传给它所实现的接口与它上传l基cL完全相同?BR> 普通类Q非内部c)是不能被定义成private或protected的;它们只可能是public或package权限的?BR>
在方法和作用域里的内部类
匿名内部c?BR> 如果你在定义匿名内部cȝ时候,q要用到外面的对象,那编译就会要求你把这个参数的reference生命成final的。如果你忘了Q编译的时候就会报错?BR> 实际上实力初始化q程是匿名内部cȝ构造函数。当Ӟ它的功能是有限的Q你不能重蝲实例初始化,因此你只能有一个构造函数?BR>
与宿ȝ的关p?BR> 如果你创Z一个内部类Q那么这个内部类的对象,׃创徏它的“宿ȝ的对?enclosing object)”生了某种关系Q这样它p讉K宿主cd象的成员了-Q不需要Q何特别的授权。此外,内部c还能访问宿ȝ的所有元素?BR>
嵌套c?BR> 如果你不需要这U“内部类对象和宿ȝ对象之间的”联p,那么你可以把内部cd义成static的。这通常被称作“嵌套类(nested class)”。嵌套类的意思是Q?BR> 1。无dȝ的对象就能创建嵌套类的对象?BR> 2。不能在嵌套cȝ对象里面讉K非static的宿ȝ对象?BR> interface里面是不能有M代码的,但嵌套类却可以是interface的一部分?BR>
引用宿主cȝ对象
除非你还已经创徏了宿ȝ的对象,否则Ҏ不可能创建内部类的对象。但是,如果你创建的是嵌套类(static的内部类)的话Q那׃需要宿ȝ对象的reference了?BR>
在多层潜逃的c里向外讉K
当你在另一个类里创建多层嵌套的内部cȝ对象的时候,应当使用哪种语法。?new”语句指明了正确的作用域Q因此你无须在调用构造函数的语句里再去限定类的名字了?BR>
l承内部c?BR> 你必Ml他宿主cd象的reference。此外,你还必须在构造函数里面用这U语法:
enclosingClassReference.super();
内部cd以被覆写吗?
当你l承宿主cȝ时候,内部cȝ戏法到此ؓ止了。这两个内部cL怺肚里的两个实体,它们都有自己的名字空间?BR>
本地内部c?Local inner classes)
用本地内部类来代替匿名内部类的唯一正当的理由就是,你需要一个有名字的构造函敎ͼq且/或者要重蝲q个构造函敎ͼ因ؓ匿名内部cd能进行实力初始化?BR> 选择本地内部c而不是匿名内部类的唯一原因是Q你必须创徏多个那种cȝ对象?BR>
内部cȝ标识W?Inner class identifiers)
Z么要有内部类Q?BR> 每个内部c都可以独立地承某个“实?implementation)”。因此,内部cM会受“宿ȝ是否已经l承了别的实现”的U束?BR> 有了内部c,你就得到了如下的附加Ҏ:
1。内部类可以有多个实例,而每个又都可以有它自qQ与宿主cd象无关的状态信息?BR> 2。一个宿ȝ里可以放上好几个内部c,他们可以用各自不同的Ҏ来实现同一个interface或承同一个类?BR> 3。内部类对象创徏的时Z宿主cd象的创徏没什么关pR?BR> 4。内部类不存在什么让人头晕的“是”关p;他是一个独立的实体?BR>
Closure与回?Closures & Callbacks)
closure是一U能调用的对象,它记录了创徏它的那个作用域的信息。内部类是一U面向对象的closureQ因为它不仅保存了宿ȝ的所有信息(“创建它的作用域”)Q而且q自动保存指向那个宿ȝ的对象的referenceQ更何况它还有权操控q个对象的所有成员,即他们是private 的?BR>
内部cM控制框架(Inner classes & control frameworks)
“应用程序框?application framework)”是一个或一lؓ解决某种特定cd的问题而设计的cR控制框架是应用E序框架的一U,主要用于响应旉Q如果系l的首要人物是对事件作出响应,那么它就被称为“事仉动系l?event-driven system)”?/P>
ȝQ相比绝大多数别的OOP语言Q接口和内部cȝ概念会更为复杂,但是和C++的MI相比QJAVA的接口和内部c还是简单的许多。虽Ӟq些Ҏ本w还是比较简单,但是它们具体用法属于设计的范畴了,q点同多态性非常相伹{?BR>
2005q?3?5?3:29 PM
7Q多态?/P>
再访上传(upcasting)
把对象的reference当作基类的reference来用Q被成ؓ上传(upcasting)?BR>
把对象的cd忘掉
问题的关?BR>
Ҏ调用的绑?binding)
后绑?late binding)是要在程序运行的时候,Ҏ对象的类型来军_该绑定哪个方法。后l定也被UCؓ“动态绑?dynamic binding)”或“运行时l定(run-time binding)”?BR> 除了static和finalҎ(privateҎ隐含有final的意?QJAVA的所有的Ҏ都采用后l定?BR>
产生正确的行?BR>
可扩展?BR>
错误Q“覆写”private的方?/P>
抽象cd抽象Ҏ
抽象Ҏ(abstract method)Q只有声明,没有正文?BR>
构造函C多态?BR>
构造函数的调用序
复杂对象的构造函数的调用序这LQ?BR> 1。调用基cȝ构造函数。这是一个递归的过E,因此会先创徏l承体系的跟Q然后是下一U派生类Q依此类推,直到最后一个承类的构造函数?BR> 2。成员对象按照其声明的顺序进行初始化?BR> 3。执行承类的构造函数的正文?BR>
l承与清?BR> 先进行派生类的清理,再进行基cȝ清理?BR> 多态方法在构造函C的行?BR> 一个好的构造函数应该,“用最的工作量把对象的状态设|好Q而且要尽可能地避免去调用Ҏ。”构造函数唯一能安全调用的ҎQ就是基cȝfinalҎ (q一条也适用privateҎQ因为它自动是final的?。他们不会被覆写Q因此也不会产生q种意外的行为?/P>
用承来q行设计
U承与扩展
下传与运行时的类型鉴?/P>
ȝQ多态性是一U不能孤立的看待的特性(不像switch语句Q,相反只有攑֜cdpȝ“大背景”下Q它才有用武之地。要惛_~程中有效地使用多态性,以及面向对象的技术,那你必L展你的编E视野,不能只关注单个类的数据成员和消息Q而是要去理解cMcM间的共同性,以及他们之间的关pR虽然这个要求很高,但是q种努力是值得的,因ؓ它能加速程序的开发,改善代码的逻辑l织Q得程序更易于扩展Q同时维护代码也变得更方便了?/P>
2005q?3?3?1:59 AM
6Q复用类
合成所使用的语?BR> 如果惛_referenceq行初始化,那么可以在以下几个时间进行:
1。在定义对象的时候。这意味着在构造函数调用之前,它们已经初始化完毕了?BR> 2。在q个cȝ构造函数里?BR> 3。在卛_使用那个对象之前。这U做法通常被成为“偷懒初始化Qlazy initializationQ”。如果碰到创建对象的代h很高Q或者不是每ơ都需要创建对象的时候,q种做法p降低E序的开销了?BR>
l承所使用的语法?BR> l承设计斚w有一条通用准则Q那是把数据都设成private的,把方法都设成public的。当然碰到特D情况还要调_但是q还是一条非常有用的准则?BR>
基类的初始化
构造行为是从积累“向外”发展的Q所以基cM在派生类的构造函数访问它之前先进行初始化?BR>
带参数的构造函?BR> Ҏ生类构造函数而言Q调用基cȝ构造函数应该是它做的第一件事?BR>
捕获U篏构造函数抛出的异常?/P>
把合成和l承l合h
虽然~译器会强制你对基类q行初始化,q且会要求你在构造函数的开始部分完成初始化。但是它不会查你是不是进行了成员对象的初始化Q因此你只能自己留神了?BR>
保q行妥善地清?BR> 先按照创建对象的相反序q行cȝ清理。然后调用基cȝ清理Ҏ?BR>
名字的遮?/P>
用合成还是?BR> l承要表辄是一U“是(is-a)”关p,而合成要表达的是“有(has-s)”关pR?BR>
protected
Java的protected也提供package的权限?/P>
渐进式的开?/P>
上传(upcasting)QL安全的?/P>
合成q是l承Q再探讨?/P>
final关键?BR> Final的数?BR> 对primitive来说Qfinal会将q个值定义成帔RQ但是对于对象的reference而言Qfinal的意思则是这个reference是常量。Java没有提供某个对象作成常量的Ҏ。这U局限性也体现在数l上Q因为它也是一个对象?BR>
I白的final数据(Blank finals)
一定得为final数据赋|要么是在定义数据的时候用一个表辑ּ赋|要么是在构造函数里面进行赋倹{?BR>
Final的参?BR> Java允许你在参数表中生命参数是final的,你不能在Ҏ里让参数reference指向另一个对象?BR>
FinalҎ
final和private
privateҎ都隐含有final的意思?BR>
Finalc?BR> 不允许别人去l承?BR>
心使用final
初始化与cȝ装蝲
l承情况下的初始?/P>
ȝQ本章主要讲qCl承和合成的概念和用法及一些注意事V尽面向对象的变成会反复强调承,但是当你着手设计的时候,通唱情况下还是应该先考虑合成Q只有在必要的时候才使用l承。合成会更灵zR?BR>
2005q?3?2?3:42 AM
5Q隐藏实?/P>
packageQ类库的单元
package和importq两个关键词的作用是要把一个单独的全局名字I间分割开来?/P>
创徏独一无二的package名字
一个自定义的工L?/P>
使用import来改变程序的行ؓ方式
使用package的忠?BR> q个package必须保存在由它的名字所指示的目录里Q而这个目录又必须在CLASSPATH下面?/P>
JAVA的访问控制符
package讉K权限
publicQ访问接口的权限
privateQ你都C?BR> protectedQ承的讉K权限
接口(Interface)与实?implementation)
Z让代码显得更有条理,可能你选用q种风格Q就是讲public成员都放在类的开_接下来是protected成员Q然后是package权限的,最后是private成员?/P>
cȝ讉K权限
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>
cd有两U访问权限:package权限和public?/P>
ȝQ本章主题是怎样用类来构建类库:首先是怎样讲类装成类库,然后是,cL怎样控制它的成员的访问权限的?BR>
2005q?3?2?12:12 AM
4Q初始化与清?/P>
用构造函数确保初始化
new表达式确实会q回q个新创建的对象和referenceQ但是构造函数本w不q回M倹{?/P>
Ҏ的重?BR> 区分l重载的Ҏ
对primitiveq行重蝲
用返回值重?BR> 不能用返回值来区分重蝲的方法?/P>
默认的构造函?/P>
this关键?BR> this关键词只能用于方法内部,它负责返回调用这个方法的对象的reference?/P>
static的含?BR> 不能在staticҎ里调用非static的方法(虽然反过来是可以的)Q但是却可以不通过对象Q直接对c调用staticҎ?/P>
在构造函数里调用构造函?/P>
清理Qfinalization和垃圑֛?BR> Z么要有finalize()Q?BR> 1。对象不一定会被垃圑֛收器回收?BR> 2。垃圑֛收不是拆?destruction)?BR> 3。垃圑֛收只与内存有兟?BR>
你必M自进行清?BR>
中止条g
垃圾回收器是如何工作?BR>
指定初始?BR>
用构造函数进行初始化
初始化的序是由变量在类的定义里面的序锁决定的?BR> 变量的初始化会先于Q何方法,甚至是构造函数的调用?BR>
静态数据的初始?BR> 如果未创徏cȝ对象Q因而其static的成员尚未初始化的话Q初始化会先处理其static成员Q再处理非static的对象。只有创建第一个对象时Qstatic成员被初始化Q此后static对象׃会再作初始化?BR>
昄的静态初始化
静态初始化只运行一ơ?BR>
非静态的实例初始?/P>
数组的初始化
可以讉K的最大的数组下标是length-1
多维数组
ȝQ本章主要讲qCJAVA初始化方面的机制和一些规则和技巧,也对JAVA的内存回Ӟ垃圾处理机制做了一定的介绍和分析?BR>
2005q?3?1?6:08 AM
3:控制E序程
使用Javaq算W?BR> 优先U:先乘除后加减
赋?BR> 当你‘在对象之间’进行复制的时候,实际上你是在拯它的reference?BR> Ҏ调用期间的aliasing
数学q算W?BR>
正则表达?Regular expressions)
自动递增与递减
关系q算W?BR> 试对象的相{?BR>
逻辑q算W?BR> 短接(short circuiting)
位运符
UMq算W?BR>
三元if-elseq算W?BR>
逗号q算W?/P>
String和+q算W?BR>
常见的用运符斚w的错?BR>
cd转换W?BR>
帔R(Literals)
Java没有"sizeof"
重访优先U?BR>
q算W的ȝ
除了boolean之外Q所有的primitivecd都能被{换成其他的primitivecd?/P>
执行控制
true和false
“条件判?conditional)”必要能生一个booleanl果?BR> return
循环语句
while
do-while
for
逗号q算W?BR> break和continue
臭名昭著的“goto?BR> 1.普通的continue会退到内部@环的最开始,然后l箋执行内部循环?BR> 2.带标{continue会蟩转到标签Qƈ且重新进入直接跟在标{面的循环?BR> 3.break会从循环的“底部溜出去”?BR> 4.带标{break会从p个标{标识的循环的“底部溜出去”?BR>
siwtch
Math.random()会生?.0Q它的值域是[0,1)?/P>
ȝQ这一章讲qCl大多数的变成语a都有的基本特性:计算Q操作符优先U,cd转换Q选择与@环。还有一些小知识和容易犯错误的地方:P
2005q?3?0?5:40 AM
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