您的位置:首页 > 编程语言 > Java开发

Think in Java第5章 初始化与清理 (笔记)

2008-11-29 15:53 369 查看
 
很多C程序的错误是由于程序员忘记了初始化变量 。T_T<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

构造器 constructor 在船坚对象是被自动调用的特殊方法

5.1 构造器采用了与类名相同的名称 虽然其也是方法 但由于与类名完全相同 不用首字母小写

不接受任何参数的构建器叫做默认构建器 无参构造器

创建一个类 它包含一个未初始化的String饮用,论证该引用被Java初始化成了null

class StringRef

{String i;

System.out.print(i);

}

创建一个类 它包含一个在定义时就被初始化了的string域,以及另一个通过构造器初始化的String类

class StringRef

{

String i=new String (“NIHAO”);

StringRef(String s)

{

This.i=s;

}

System.out.print(i);

}

 

如果有了形参 除形参参数以外的所有形式不会被接受 比如 Tree (int i) 那么 Tree t = Tree()就不会接受别的形式了

5.2 方法重载

方法重载就是利用不同的形式参数形式,赋予方法不同的功能和结果。

方法调用的时候根据相应的参数形式调用对应的方法。 非常简单。

比如 print(i)如果i是int,则调用print(int i)如果i是String 则调用 print(String i) 如果是print(I,6) 则调用print(int i, int 6)

5.2.1           区分重载方法

同上

5.2.2
12d4f
           设计基本类型的重载

如方法中参数是char且找不到相对应的方法与之对应,编译器就把char自动转成int型

如果输入的实际参数较大,就通过类型转换来进行窄化转换

恒等转换(相同容量的两个数据类型之间的赋值);
拓宽转换(小容量类型赋值给大容量类型);
窄化转换(大容量赋值给小容量类型).

5.2.3           以返回值区分重载方法

如果定义一个新的值套用方法 比如 int x=f( ) 那我们可以根据f( )的返回值来判定我们需要的是那种方法 {return 3;} 但如果没有这种条件 f( )还是不行的

5.3             默认构造器

当没有构造器的对象被调用时 编译器自动生成默认构造器

但已经有构造器的时候 编译器不会自动套用构造器

5.4             this 关键字

this指的是调用方法的那个对象

只有需要明确指出当前对象的引用的时候 才需要this, 否则可以自动调用

5.4.1           在构造器中调用构造器

this 只能调用一个构造器 不能同时构造两个 另外必须将构造器调用置于最起始处 否则会报错

5.4.2           static的含义

static 方法就是没有this的方法,在static的方法的内部不能调用非静态方法,反过来倒是可以的,并且可以在没有创建任何对象的情况下,仅仅通过类本身就可以调用static方法。

当置入static方法的时候便可以访问其他static方法或者域

static有点不面向对象的意思

5.5             清理:终结处理和垃圾回收

垃圾回收器只能负责回收由new获得的内存区域

如果用特别的方法获得一块特殊的内存区域 就需要用finalize( )来回收

finalize( )的工作原理是:

一旦准备好释放对象所占用的内存空间 将首先先调用其finalize( )方法,然后下次进行回收的时候,将其回收

1.  对象可能不被垃圾回收

2.  垃圾回收并不等于析构

3.  垃圾回收只与内存有关

总的来说 java的垃圾回收非常主动, 当内存不够的时候java才会回收finalize指定的资源,原因是垃圾回收也是消耗,没必要用的时候则不用来节约开支。

finalize一般来说是因为手动指定及分配了内存地址

5.5.2           你必须实施清理

c++中由于不清理内存会出现内存泄漏,对象留在内存中

java中不需要

5.5.3           终结条件

当一个对象打开了一个文件,然后对象被清除的时候,此文件就应该被关上,否则便成为隐患。system.gc( )可以强制关闭内存,利用自己定义的finalize( )发现缺陷。

个人理解好比system.gc( )是电灯开关, finalize( )是关灯须知。调用system.gc( )的时候要看看finalize( )关灯须知的条件是否都合理了才能关灯。

5.5.4           垃圾回收器如何工作

垃圾回收机制的原因在于:当内存中充满了各个对象的时候,就像一个传送带般,寻找一个对象需要遍历从头到需要的对象,这样需要时间,但如果把所有对象紧凑排列,遍历时间会大大缩短,去掉无用对象并压缩空间,遍历时间也会缩短。

好比一个大院, 院子里边好多用户, 每个人只认识自己的邻居, 你找人就要从头问 ,然后他邻居 ,然后他邻居的邻居, 最终找出人来。

要是大家住的紧凑, 就快多了,因为互相都认识。

 

清理机制有两种不同模式,一种是停止复活机制, Java就像个居委会大妈,没事了就遍历所有对象, 把活的记录在案 ,然后复制到另一个堆里边去 ,就像生活区里好多屋子没人住了 ,把住的人都抓起来送到另一个小点的生活区去, 然后没事再溜达 ,再送,送来送去就没多少人了。

问题在于, 送人的时候要两个院子。

               可能人家没什么变换 ,你还要送来送去。

另外送人的时候 ,所有的人必须停下来被送 ,不能再干活了。

java还有种模式叫做标记清理, 就是找到所有的房子 ,有人住的留下, 没人住的清理掉。

要是清理的房子多了,房子之间都没人了。 就再用第一种模式把人们转移到另一个院子,这样又紧凑了。

还有个代数,就好比计数,张三天天有人找,就弄个大号,李四总没人找,就弄个小号,清理的时候,先清理小号的,因为没人认识。用处小。

附加技术 Just-in-time ,即时,什么时候用,什么时候拉人进来住。

lazy evaluation必要时才编译代码,不执行就不编译。执行次数越多越快。

5.6            成员初始化

方法的局部变量成员未被初始化就对其进行调用并运算会报错。

类的局部变量成员未被初始化时程序会给其默认值。

引用如果没有被初始化给指,就会得到null.

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />5.6.1 指定初始化

byte b=47; 没什么好说的

调用方法的参数可以是对象或者方法的返回值,但一定要是初始化过的。

5.7            构造器初始化

变量初始化和构造器初始化,变量初始化先运行。

5.7.2           静态数据的初始化

静态初始化旨在必要时刻才会进行(被调用)

先静态,然后非静态对象。

5.7.3           显式的静态初始化

5.7.4           非静态实力初始化

5.8            数组初始化 int[ ] a1; int[ ]={1,2,3}

Random.nextInt( 20) 返回0到20之间的一个int

Arrays.tostring(a) 返回数组a的所有值以下变得形式

[a1.a2.a3.a4] 基本类型会自动生成出示值 类的话不行 比如Integer不行。

5.8.1 可变参数列表

static void printArray(Object[ ] args) {

for(Object obj : args)

system.out.print(obj + “”);

system.out.println;

}

如果没有toString( )方法的话,会打印出其类的名字@地址。

static void printArray(Object… args){}

(Object[ ]) 将后边的数组变成Object数组。

args.getclass( ) 将会返回其class

当有重载发生的时候,不带参数的调用会发生问题,这时候可以用一个非可变参数来解决问题

5.9            枚举类型 enum

枚举类型就是给定一个取值范围,然后自己定义等于其中的一个值

enum.values( )返回所有值

enum.ordinal( )返回所有值的顺序

enum可以配合swith使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息