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 IntergerLight Bulb:
用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