Java编程思想笔记 第五章:初始化与清理

1.  在Java中,"初始化"和"创建"捆绑在一起,两者不能分离.

2.  在定义时就被初始化的String域,在对象被实例化时被赋值一次;通过构造方法初始化的String域,在对象被初始化时被赋值两次.

3.  区分重载方法:每个重载的方法都必须有一个独一无二的参数类型列表(参数类型,个数,次序不同都足以区分两个方法;在前面情况都相同的情况下,返回值类型不足以区分重载方法)

4.  为了能用简便,面向对象的语法来编写代码,编译器做了一些幕后工作----它暗自把"所操作对象的引用"作为第一个参数传递给被调用方法.这个引用有一个专门的关键字this;

当需要返回对当钱对象的引用时,常常在return语句里这样写:return this;

5.  在构造器中调用构造器,如果为this添加了参数列表,将产生对符合此参数列表的某个构造器的明确调用;但this只能调用一个构造器并且必须置于最起始处.

除构造器外,编译器禁止在任何方法中调用构造器.

6.  Java有垃圾回收器负责回收无用对象占据的内存资源.

7.  垃圾回收器只知道释放那些经由new分配的内存. 为了应对无法释放特殊内存对象的情况,Java允许在类中定义一个名为finalize()的方法.

"假定"finalize()方法工作原理是这样的:一旦垃圾回收期准备释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才真正回收对象占用的内存.

8.  一,对象可能不被垃圾回收.

  二,垃圾回收并不等于"析构".

  三,垃圾回收只与内存有关.  所以对对于与垃圾回收有关的任何行为来说(尤其是finalize()方法)它们也必须同内存及其回收有关.无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存.

finalize()的需求限制到一种特殊情况:通过某种创建对象方式以外的方式为对象分配了存储空间.即调用了本地C/C++的malloc()方法等.. 基本不会遇到,也就不用够多使用finalize()方法了.

finalize()还有另外一个用途:对象终结条件的验证.

9.  如果Java虚拟机并未面临内存耗尽的情况,它是不会浪费时间去执行垃圾回收以恢复内存的.

10.  "自适应的,分代的,停止-复制,标记-清扫"式垃圾回收器.

11.  Java虚拟机有"即时"(Just-In-Time,JIT)编译器技术.这种技术可以把程序全部或部分翻译成本地字节码(这本是Java虚拟机的工作),程序运行速度因此提升.

当需要装载某个类时(通常是为该类创建第一个对象时),编译器会先找到其.class文件,然后将该类的字节码装入内存.

此时,有两种方案选择:(一)即时编译所有代码,累计费时而且增加可执行代码长度

(二)惰性评估,即时编译只在必要的时候才编译代码,这样不执行的代码也许压根就不会被JIT编译.

12.  累的每个基本类型数据成员保证都会有一个初始值.方法的局部变量没有初始化会报"未初始化变量"错.

13.  无法阻止自动初始化的进行,它将在构造器被调用之前发生.

14.  在类的内部,变量定义的先后顺序决定了初始化的顺序.

15.  对象的创建过程,以名为Dog类为例:

  1.即使没有显式地使用static关键字,构造器实际上也是静态方法.因此当首次创建类型为Dog类的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件.

  2.然后载入Dog.class(这将创建一个Class对象),有关静态初始化的所有动作都将执行.

  3.当用new Dog()创建对象时,首先将在堆上为Dog对象分配足够的存储空间.

  4.这块存储空间会被清零,自动将Dog对象中的所有基本类型数据都设置成了默认值,而引用则被设置成了null.

  5.执行所有出现于字段定义出的初始化动作.

  6.执行构造器.

posted @ 2017-11-19 20:52  谢谢侬  阅读(161)  评论(0编辑  收藏  举报