《java编程思想》学习笔记— 初始化与清理

5.一、用构造器确保初始化

一、构造器命名问题:使用类名,,缘由以下:java

(1)所取得任何名字均可能与类的某个成员名相冲突。数组

(3)调用构造器是编译器的责任,因此必须让编译器知道应该调用哪一个方法。(初始化期间要自动调用构造器)this

二、在java中,“初始化”和“建立捆绑在一块儿,二者不能分离。”对象

5.二、方法重载

一、当建立一个对象时,也就给此对象分配到的存储空间取了一个值。所谓方法则是给某个动做取得名字,经过名字,你能够引用全部的对象和方法。生命周期

二、为了让方法名相同而形式参数不一样的构造器同时存在,必须用到方法重载。内存

5.2.1.区分重载方法编译器

一、每个重载的方法都必须有一个独立无二的参数类型列表。虚拟机

5.2.2涉及基本类型的重载编译

一、基本类型能从一个“较小”的类型自动提高至一个“较大”的类型,此过程一旦牵涉到重载,可能会形成一些混淆。class

二、若是传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据类型就会被提高char会提高到int型。

三、若是传入的实际参数较大,就得经过类型转换来执行窄化转换。若是不这样作,编译器就会报错。

5.2.3以返回值区分重载方法(行不通)

一、由于有时并不关心方法的返回值,好比此时只是会调用方法而忽略其返回值。

5.3默认构造器

一、要是你没有提供任何构造器,编译器会默认给你建立一个无参构造器;若是已经定义了构造器,编译器就不会再给你建立,此时若是你不本身定义一个无参构造器直接调用,编译器回报错。

5.4 this关键字

一、调用对象的方法,即“发送消息给对象”,编译器作了一些幕后工做,它暗自把“所操做对象的引用”做为第一个参数传递给被调用的方法。

二、 (1)this关键字只能在方法内部使用,表示对“调用法法的那个对象”的引用。

(2)若是在方法内部调用同一个类的另外一个方法,就没必要使用this。

(3)当须要返回当前对象的引用时,就经常在return语句里里这样写:return this;

5.4.一、在构造器中调用构造器

一、若是为this添加参数列表,那么就有了不一样的含义。这将产生符合此参数列表的某个构造器的明确调用。

二、尽管能够用this调用一个构造器,但却不能调用两个,此外,必须将构造器调用置于最起始处,不然编译器会报错。

三、除构造器以外,编译器禁止在其余任何方法中使用this调用构造器。

5.4.2static的含义

一、static方法就是没有this的方法,在static方法内部能能调用非静态方法,放过来到时能够。

5.五、清理:终结处理和垃圾回收

5.5.1 finalize()的用途何在

一、垃圾回收器只知道释放那些经由new分配的内存。对于其余方式分配的内存,java容许在类中顶一个个名为finalize()的方法。它的工做原理是:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,而且在下一次垃圾回收动做发生时,才会真正回收对象占用的内存。

二、java里的对象并不是老是被垃圾回收

(1)对象可能不被垃圾回收

(2)垃圾回收并不等于“析构”

(3)垃圾回收只与内存有关

三、在你再也不须要某个对象以前,若是必须执行某些动做,那么你得本身去作。

5.5.2 你必须实施清理

一、若是java虚拟机并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存的

5.5.3终结条件

5.3.4 垃圾回收器如何工做

一、引用计数器,当有引用连接至对象上时,引用计数加1

二、对于任何“活”的对象,必定能最终追溯到其存活堆栈或静态存储区之中的引用。

三、找到存活的对象,能够用中止-复制的方法:

(1)先暂停程序的运行(因此它不属于后台回收模式),而后将全部的存活的对象从当前堆复制到另外一个堆,没有被复制的所有都是垃圾。

(2)复制回收器,效率低,缘由以下:首先,得有两个堆,而后得在这两个分离的堆之间来回倒腾,从而得维护比实际须要多一倍的空间。其次,问题在于复制,程序进入稳定状态以后,可能只会昌盛少许的垃圾,甚至没有垃圾,这样复制很浪费。此时能够转到另外一种回收模式,即自适应。

四、当须要装载某个类(一般是在为该类建立第一个对象)时,编译器会先找到.class文件,而后将该类的字节码装入内存。此时,有两种方案可供选择。

(1)一种就是让即便编译器编译素有代码。这种作法有两个缺陷:这种加载动做散落在整个程序生命周期内,累加起来要花更多时间;而且会增长可执行代码的长度(字节码要比即时编译器展开后的本地机器码小不少),这将致使页面调度,从而下降程序的速度。

(2)另外一种称为惰性评估,意思是即便编译器只在必要的时候才编译代码。

5.六、成员初始化

一、java尽力保证:全部变量在使用前能获得恰当的初始化。对于方法的局部变量,java以编译时错误的形式来贯彻这种保证。

二、对于类的数据成员,会保证都会有一个初始值。

5.6.1 指定初始化

能够在定义类成员的变量的地方为其赋值。

5.七、构造器初始化

一、没法阻止自动初始化的进行,它将在构造器被调用以前发生。

5.7.1初始化顺序

在类的内部,变量定义的前后顺序决定了初始化的顺序。即便变量定义散步于方法定义之间,他们仍旧会在任何地方(包括构造器)被调用以前获得初始化。

5.7.2静态数据的初始化

一、static关键字不能应用于局部变量,所以它只能做用于域

二、初始化的顺序是先静态对象(若是它们还没有因前面的对象建立过程而被初始化),然后是“非静态”对象。

三、总结一下对象的建立过程 (1)即便没有显式地使用static关键字,构造器实际上也是静态方法。所以,当首次建立类的对象时,或者类的静态方法/静态域首次被访问时,java解释器必须查找类路径,以定位.class文件。

(2)而后载入.class文件,有关静态初始化的全部动做都会执行。

(3)当用new建立对象的时候,首先将在堆上的对象分配足够的存储空间。

(4)这块存储空间会被清零,这就自动地将对象的全部基本类型数据设置成了默认值,而引用则被设置成了null。

(5)执行全部出现于字段定义处的初始化动做。

(6)执行构造器。

5.7.3 显示的静态初始化

5.7.4非静态实例初始化

5.8数组初始化

一、数组的两种定义方式:int [] a 和 int a[]

二、初始化

(1)int [] a1= {1,2,3,4}

(2)int [] a2;a2=a1

5.8.1可变参数列表

一、有了可变参数,就不再用显式地编写数组语法了,当你指定参数时,编译器实际上会为你去填充数组。

二、将0个参数传递给可变参数列表是可行的,当具备可选的尾随参数时,这一特性就会颇有用。

5.九、枚举类型

一、在你建立enum时,编译器会自动添加一些有用的特性。

(1)toString():显示某个enum实例的名字。

(2)ordinal():表示某个特定enum常量的声明顺序。

(3)static values():用来按照enum常量的声明顺序,产生由这些常量值构成的数组。

相关文章
相关标签/搜索