java编程思想读书笔记----第五章 初始化与清理

1、清理:终结处理和垃圾回收

java里的对象并非总是被垃圾回收,换句话说:

  • 对象可能不被垃圾回收
  • 垃圾回收不等于“析构”
  • 垃圾回收只与内存有关

  一旦垃圾回收器开始准备好释放对象占用的存储空间是,会先调用其finalize()方法,并且在下一次垃圾回收动作发生是,才会真正回收对象占用的内存空间。因此,不应该将fianlize()方法作为通用的清理方法。
  finalize()被限制到一种特殊情况,即通过某种创建对象方式以外的方式为对象分配了存储空间。

2、成员初始化

  java尽力保证变量在使用前会被初始化。对于方法中的局部变量,java以编译时错误来贯彻这种保证;而对于类中的字段(成员变量),如果类中没有初始化,创建类的对象时会赋予默认值,java允许在定义类的字段时为其赋值(C++不可以)。

3、构造器初始化

  自动初始化是无法阻止的,会在构造器被调用之前发生。在类的内部,变量定义的先后顺序决定了自动初始化的顺序,即使变量定义分布在方法之间,也会在任何方法(包括构造器)被调用前初始化。

  静态初始化只有在必要的时候才会进行,包含静态数据的类第一次被创建(第一次访问静态数据)。

初始化的顺序是先静态变量(如果它们尚未因为前面的对象的创建过程而被初始化),后非静态变量。

对象创建过程,假设有一个Dog类

  1. java解释器查找路径,定位到Dog.class
  2. 载入Dog.class(创建一个class对象),所有关于静态初始化的动作被执行。静态初始化只有class对象加载的时候执行一次
  3. 当用new Dog()创建对象是,先在堆上分配一片存储空间
  4. 这段存储空间会被清零,这就自动地将对象的基本数据类型设置为默认值,引用设置为null
  5. 执行所有出现在字段定义处的初始化
  6. 执行构造器

4、数组初始化

  基本类型的数组在定义并分配存储空间后就完成了初始化,基本数据类型会被自动初始化成空值;非基本类型的数组在定义并非配存储空间后并未完成初始化,只是创建了一个数组引用,不能直接使用,必须创建新的类对象,并将对象赋值给引用,才算完成初始化进程。

  在重载方法中尽量不要使用可变参数。

你可能感兴趣的:(读书笔记)