Topic: 我的 thinking in java 的读书报告 |
Print this page |
1.我的 thinking in java 的读书报告 | Copy to clipboard |
Posted by: litant Posted on: 2004-05-23 22:53 最近看了think in java ,并作了一些笔记,拿出来共享,希望大家都提点意见。 Think in java 读书报告 第一部分:基础知识 一.程序执行时如何放置对象? Ø Stack(栈/堆栈):不可以存放对象,但可以存放reference和基本类型(int, float等)。 特点:Java编译器必须能够完全掌握它所编译的程序中“存在stack里头的所有数据的实际大小和存活时间”。 Ø Heap(堆):用来存放所有Java对象。 特点:编译器不需知道究竟从heap中分配多少空间爱你,也不需要知道从heap中分配的空间究竟需要存活多少时间。 缺点:从heap中分配空间,比从stack中分配空间所耗费的时间要多很多。 Ø 静态存储空间(static storage):将某个对象内的特定成员设为静态即可存于此处。 二.基本类型(primitive types) Ø 基本类型所占的空间大小如下表: 基本类型 所占空间大小 外覆类型 默认值 Boolean - Boolean False Char 16bit Character Null Byte 8bit Byte (byte)0 Short 16bit Short (short)0 Int 32bit Integer 0 Long 63bit Long 0L Float 32bit Float 0.0f Double 64bit Double 0.0d Void - void Ø 基本类型的特殊处理: n 对于基本类型,Java不以new来分配空间 n 此类变量直接存放数据值,并置于stack中。 三.关键字static Ø static data(静态数据成员): 不管产生多少个对象,或是没有对象产生,这些数据成员的存储空间只有一份(因为static数据在class装载时就生成)。(non-static数据成员每个对象各有一份) Ø static method(static函数):在不建立任何对象的情况下,可以调用static函数。 Ø static method只能调用其他static函数和static数据成员,不可以调用non-static函数和non-static数据成员。 Ø static method 很像c中的全局函数。 五.关键字final (p209) 5.1 final data Ø 常量种类: n 编译器常量 ² 此类常量必须是基本类型 ² 定义此类常量的同时,必须给定其值 ² 特点是永不改变 n 执行期常量:初值在运行期才可以确定 Ø final作用于不同型别 n 基本类型: 让value(数值)保持不变 n object reference:让reference保持不变。 Ø final数据的初始化地点 n 定义该final的变量处: n 其所在类的构造函数中->称为black finals:所以导致final数据在每个对象中都有所不同,但是在该对象的生存区间中保持不变。 5.2 final method Ø 作用 n 锁住这个函数,使derived class 无法改变其意义, n 效率:将某个函数声明为final,编译器将撒哟有对此函数的调用动作转化为inline 函数。 Ø 注: class中的private函数自然而然是final。 5.3 final class Ø 声明不想继承该class 四.赋值,指派,别名 4.1几个基本概念 Ø 基本型别的赋值:将某个值赋值到另一个值身上。如A=B,然后修改A,B不会波及。 Ø 对象之间的赋值:将某个对象的reference从某处复制到另一处。这样会导致别名现象。 Ø 别名问题:多个reference被绑至同一个对象上,也即同一个内存地址上。 4.2解决别名的方法:clone-----制作某个对象的局域性副本。 Ø clone分类: 浅层clone(shallow clone): 深层clone(deep clone): Ø 某个类实现克隆能力: n 实现clonable接口 n clone()函数不需声明位public n clone()函数开始处必须先调用super.clone() u super.clone()要负责分配内存空间,并位逐一copy u super.clone()执行前检查classs是否是clonable. 五.流程控制 Ø break:跳出循环 Ø continue:跳出当次跌代,回到循环起始处。 第二部分:初始化和清除 一.初始化 1.1 构造函数的基本语法:(略) n Defaule构造函数 如果所开发的class不具有任何的构造函数,编译器会自动合成一个Default构造函数。 如果自行定义了任何一个构造函数,编译器就不会为你合成default构造函数。 1.2 初始化 n New的作用 1. 为对象分配内存空间 2. 调用构造函数。 n 无继承情况的对象生成过程L(以dog.class为例)P160 1. 当某个类别为Dog的对象被首次产生出来,或当class Dog的static函数或static数据成员首次被访问。Java置疑器找出Dog.class 2. 一旦Dog.class被装载(这样就产生一个Class对象),他的所有static初始动作会被执行起来。 3. 当你new Dog(),建构过程会先为Dog对象在heap上分配足够的存储空间。 4. 这块heap空间会被清为零,并自动将对象内所有基本类型的数据设为缺省值,将reference设为null 5. 执行所有出现于数据定义处的初始化动作。 6. 执行构造函数。(这里将有很多动作) n 继承与初始化(p216): class A extends B 1.当执行A时,启动装载器,装载过程由于关键字extends的存在,得知A拥有base class,于是装载B 2.等A的所有父类装载了以后,初始化所有静态变量,顺序从基类到子类。 3.产生对象:如上3,4,5,6;顺序都是按照从基类到子类。 n 引入多态后的初始化(p235) 1. 调用base class 构造函数, 2. 根据各个成员的声明循序,调用各个成员的初值设定式 3. 调用derived class 构造函数本体。 1.3 Array的初始化 Ø Array的声明: int[] a; 此时仅拥有一个reference,代表某个array,但并没有对应空间。 Ø 基本类型的array的初始化 1.Int a[] = {1, 2, 3, 4, 5, 6} 编译器就确定了array元素的个数 2.int a[] = new int[N]; 运行期确定array元素的个数,不知道array需要多少元素的情况 Ø object array的初始化过程:包括用new产生一个array: Integer a = new Interger[N] : 然后用new来生成array的元素, a[i] = new Interger: 用new生成元素的两种方法,如下: 1. 编译期确定了array的element的个数: ² Integer[] a = {new Integer(1), new Integer(2), new Integer(3)} ² Integer[] b = new Integer[]{new Integer(1), new Integer(2), new Integer(3)}; 2.用循环设定:(略) 二.清理-垃圾回收器(Garbage collection),终结(finalization) 当垃圾回收器打算开始释放你的对象所占用的存储空间是,会先调用finalize()函数,并且在下一次垃圾回收发生时才回收该对象所占用的内存。 1.1 终结(finalization) Ø 使用情况:只有在采用native method时,才有可能用到finalization Ø 另一作用:观察垃圾回收过程。 2.2 垃圾回收器(garbage collection) Ø 作用:回收在程序中再也用不着的对象的内存空间。(在heap中操作)。 Ø 运作方式: n 基本理念:根据“存活于static或static storage上”的reference而追踪到的对象,才算是生命尚存的对象。 n 垃圾回收机制: u stop-and-copy(停止而后复制):先将执行中的程序暂停下来,然后将所有找到的对象从原本的heap复制到另一个heap中,并将所有垃圾舍弃不顾。当对象被复制导新的heap,系以头尾相连的方式排列,于是新的heap排列紧凑。 缺点1:因为需要有两个heaps,所以需要的内存数量大。一般的解决方法从heap中分配出所需的chunks,然后把数据从chunk复制到另一个chunks 缺点2:程序进入稳定状态以后,可能会产生少量垃圾,但是复制式回收器仍然会将内存从某处复制到另一处。 u mark-and-sweep(标示后清理):每当找到一个存活对象,便设定该对象内的flag,当整个表示程序都完成了,清理动作才会开始。在清理过程中,不复存活的对象会被释放。 u JVM一般结合以上两个机制:如果“所有对象皆长期存活”而变得效率不佳,则转换至mark-and-sweep模式,同理,如果heap断裂情况太严重,又会转换至stop-and-copy模式。 第三部分:面向对象 一.访问权限饰词(access specifiers) Ø public n 关键字表示:public n 访问权限:任何人在任何地方都可以访问 Ø protected n 关键字表示:Protected n 访问权限: 1. 任何继承自此一class的derived class,可以访问。 2. 位于同一个package内的其他classes, 可以访问。 Ø friendly n 关键字表示:无关键字 n 访问权限:同一个Package内的其他classes可以访问friendly成员。 Ø private n 关键字表示:private n 访问权限:除了“当事人所在的class,没有任何人可以访问这个成员”。 二.Class的访问权限 (TIJp189) class不能为private或protected。如果你不希望其他任何人取用某个class,请将其所有构造函数声明为private,这样以来便可以阻止任何人产生其对象,唯有一个列外,那就是在class static成员中可以办到。 三.重复运用Classes Ø 两大方法: n 组合:在新的class中产生既有Class的对象。 n 继承: n 如何在组合和继承之间的进行选择: 选择组合:嵌入某个对象,希望在新的class中实现你想你想要得功能,非其接口。 选择继承:使用某个既有class ,然后开发该class的一个特化版本。 基本原则是用组合。 Ø 继承的几个重要主题 n 语法:(略) n 基类的初始化:在子类(derived class)中调用基类(base class)的构造函数。 1. 不带引数的构造函数: ² Java编译器会自动在derived class构造函数中插入对base class构造函数的调用。 ² 显示调用super函数。必须位于基类构造函数的最开始处 2. 带引数的构造函数: ² 必须调用关键字Super,并搭配适当的引数列。必须位于基类构造函数的最开始处 n 构造函数调用顺序:从最基础的基类开始。 n 关于重载(overload)和覆写(overric) 如果在derived class中重载某个在base class中出现的函数,不会遮蔽该函数在base class中的任何版本。只有通过在derived class中覆写base class中的函数,开能遮蔽该函数在base class的版本。 四.多态 10.1 几个关键的概念 Ø 向上转型(upcasting): 将某个object reference 视为一个reference to base type。 Ø 绑定(binding): 建立 method call 和 method body的关联。 Ø 先期绑定(early binding):绑定动作发生于程序执行前 Ø 后期绑定(late binding):绑定动作将在执行期才根据对象性别而进行。 注:java中的所有函数,除了被声明为final者,皆使用后期绑定。 五. 抽象类和抽象函数 Ø 当你想要通过共通接口来操作一组classes时,便可撰写abstract class,Derived class中所有与“base class所声明之标记式”相符的函数,都会通过动态绑定的机制来调用。 Ø 抽象类不能实例化 Ø 含有抽象函数的类,必须声明为抽象类 Ø 抽象函数:抽象函数只有声明,没有本体。 |
2.Re:我的think in java 的读书报告 [Re: litant] | Copy to clipboard |
Posted by: freecode Posted on: 2004-05-24 09:41 kao,读书能读到这个程度,向你学习。 |
3.Re:我的think in java 的读书报告 [Re: litant] | Copy to clipboard |
Posted by: litant Posted on: 2004-05-24 14:08 只是学习习惯不一样而已,我喜欢边看,边做笔记。见笑了 |
4.Re:我的think in java 的读书报告 [Re: litant] | Copy to clipboard |
Posted by: j2ee_ejb Posted on: 2004-05-24 14:23 呵呵,不错,很好的习惯阿 但有一点说得有点欠妥 当类装载器装载指定的类时 并不一定就把static(类变量)进行初始化了 有可能初始化,有可能在生成第一个对象的时候才初始化:) 具体情况看看ClassLoader的两个方法,呵呵 |
5.Re:我的think in java 的读书报告 [Re: litant] | Copy to clipboard |
Posted by: PrimeJava Posted on: 2004-05-25 08:38 读书做笔记是很好的习惯,因为大多数人不是“一目十行 过目不忘”的,所以读书笔记可以让你更快的把书中的要点温习一遍。但是对于没看过书的(确切的说是对相关知识不了解的)则作用不是很大。 |
6.Re:我的think in java 的读书报告 [Re: litant] | Copy to clipboard |
Posted by: michaelbeyond Posted on: 2004-07-12 14:53 呵呵,我把TIJ打印出来,直接在打印纸张上做笔记。 |
7.Re:我的think in java 的读书报告 [Re: litant] | Copy to clipboard |
Posted by: dreamchenwen Posted on: 2004-07-22 21:15 获益良多。 |
8.Re:我的think in java 的读书报告 [Re: litant] | Copy to clipboard |
Posted by: josy Posted on: 2004-07-23 10:34 向楼主致敬! |
9.Re:我的 thinking in java 的读书报告 [Re: litant] | Copy to clipboard |
Posted by: 你要飞 Posted on: 2004-08-04 19:58 我刚准备读呢。 楼主很不错呦 |
10.Re:我的 thinking in java 的读书报告 [Re: litant] | Copy to clipboard |
Posted by: neverlose Posted on: 2004-08-05 14:20 写的不错 支持一下 |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |