又读Thinking in Java

来源:互联网 发布:嫁入豪门后的生活知乎 编辑:程序博客网 时间:2024/05/16 10:01

前几天又把Thinking in Java的第五章看了一遍,当然,又是收获多多,虽然没有去年第一次看到这本书时的兴奋——当时每天很晚下班回宿舍后都是必看一点的,但是也捡起了不少忘掉的东西。


本章的标题是:初始化与清理


首先讲述了构造器的由来:在使用对象前,我们都必须确保该对象经过了初始化,那么可以在每个类中定义一个方法:initialize()(这名字让人想到了很多设计都用到了名为init()的这个方法),每次我们使用对象前都先调用一下此方法。那么问题来了:如果我们忘记了调用怎么办呢?出现了问题则必须要有相应的对策来解决,所以人们想到了构造器,让所有需要初始化的工作都在构造器中完成。那么构造器又是个什么东西呢?作者也没有说,就直接谈到了构造器。按照我的理解就是:构造器就是一个方法或者说是一个入口,这个方法是用来创建对象的。然后人们就想办法设计了这个方法(构造器),定义了一些规则:与类同名,无返回值……这里作者提到了一句:new表达式确实返回了对新建对象的引用,但是构造器本身并没有任何返回值。这句话可以让人好好想想为什么构造器没有返回值了。


创建对象时:先在内存中分配存储空间,然后调用构造器。


方法重载:Overload。同一个类中多个方法名相同,但参数列表不同。

重载就是为了偷懒(方便)。

构造器是一个方法,当然也可以重载。

重载的唯一区分方式:独一无二的参数类型列表。

访问权限、返回值类型、抛出的异常都不能决定该方法是不是重载的。思考个问题:static方法与同名的实例方法是重载的吗?


this关键字:

this只能在方法内部使用,表示调用该方法的那个对象。在构造器中使用this()方法调用其他构造器。


static关键字:static修饰的属性与方法属于类所有,该类所有对象共享之。


重点来了:清理内存和垃圾回收

创建对象时有一个初始化过程(虽然该过程被构造器所替代了),那么放弃使用该对象时也应该有个与之对应的销毁过程,于是人们为每个类定义了一个finalize()方法,每次释放该对象所占用的内存空间时先调用该方法然后再清理该内存。

记得学C++时有个析构函数,貌似是类名方法前加个~,每次要自己调用该方法来做清理工作,然后Java为了提高开发人员的工作效率,不再这么做了,程序员不需要自己调用finalize方法,由Java内部的垃圾回收器根据他们自己定义的条件去执行。

主要讲垃圾回收器的工作原理:书上也没写个绝对的方法,只是提到了这么几种思路。

1、引用计数法:每个对象都有一个引用计数器,每次有引用连接到该对象时将计数器加1,当引用断开与该对象的连接时计数器减1,当计数器为0时则将该对象占用的空间释放。但是有个缺陷,如果有循环引用,即如果A引用了B,而B又引用了A,那么这就成了个死结,判断起来太麻烦,所以这种方法从未被实现过。

2、自适应的技术:遍历所有的引用,查找活着的对象,然后清理。这也有两种实现的方法:一、停止然后复制(stop-and-copy):就是将所有存活着的对象复制到一个新的堆中,然后清理原来的堆,这样要更新所有的引用;二:标记清扫(mark-and-sweep):标记存活的对象,然后将未标记的对象都清理掉,这样会产生很多碎片空间。两种方法各有利弊,当然要结合起来用咯。这就涉及到了更多操作系统方面的知识,记得学操作系统时也是讲过内存管理的。

再就是提到了一种即时编译器技术JIT(Just-In-Time):为了提高效率,使用时才编译class文件成机器码。


成员初始化也是一个很重要的点。

写一个过程吧:首先载入.class文件→创建Class的对象,代表该类文件→所有static成员或代码块执行初始化→new一个对象→在堆上分配空间,然后清零该片空间→所有实例变量设置成默认值(8中基本类型+引用类型)→执行字段定义处的初始化动作→执行构造器


数组与可变参数列表


枚举enum


嗯,就这些了吧~

希望有人能好好交流下,每次看完东西觉得学到了很多,但是一段时间不用就忘了,其实觉得当老师是一份不错的工作,时刻滚固着再然后用一下,再然后想一下就会有新东西新想法出来了~其实不是有很多成功的人都是当过老师嘛~马云、俞敏洪、李阳……(*^__^*) 嘻嘻……自己YY一下




0 0