java初始化和清理
- C++ 引入了构造器的概念,这是一个特殊的方法,每创建一个对象,这个方法就会 被自动调用。Java 采用了构造器的概念,另外还使用了垃圾收集器(Garbage Collector, GC)去自动回收不再被使用的对象所占的资源。
- 在 Java 中,类的设计者通过构造器 保证每个对象的初始化。构造器名称与类名相 同。
- 方法重载是必要的,它允许方法具有相同的方法名但接收的参数不同。
- 每个被重载的方法必须有独一无二的参数列表。你甚至可以根据 参数列表中的参数顺序来区分不同的方法,尽管这会造成代码难以维护。
- 如果你创建一个类,类中没有构造器,那么编译器就会自动为你创建一个无参构造器。
- this 关 键字只能在非静态方法内部使用。当你调用一个对象的方法时,this 生成了一个对象引用。你可以像对待其他引用一样对待这个引用。如果你在一个类的方法里调用其他该类中的方法,不要使用 this,直接调用即可,this 自动地应用于其他方法上了。
- this 关键字只用在一些必须显式使用当前对象引用的特殊场合。例如,用在 return 语句中返回对当前对象的引用
- this 关键字在向其他方法传递当前对象时也很有用
- 当你在一个类中写了多个构造器,有时你想在一个构造器中调用另一个构造器来避免代码重复。你通过 this 关键字实现这样的调用。
- static 方法中不会存在 this。你不能在静态方法中调用非静态方法(反之可以)。静态方法是 为类而创建的,不需要任何对象。事实上,这就是静态方法的主要目的,静态方法看起 来就像全局方法一样,但是 Java 中不允许全局方法,一个类中的静态方法可以被其他 的静态方法和静态属性访问。一些人认为静态方法不是面向对象的,因为它们的确具有 全局方法的语义。使用静态方法,因为不存在 this,所以你没有向一个对象发送消息。
- 在类中使用static修饰的静态方法会随着类的定义而被分配和装载入内存中;而非静态方法属于对象的具体实例,只有在类的对象创建时在对象的内存中才有这个方法的代码段。
- Java 允许在类中定义一个名为 finalize() 的方法。 它的工作原理 “假定” 是这样的:当垃圾回收器准备回收对象的内存时,首先会调 用其 finalize() 方法,并在下一轮的垃圾回收动作发生时,才会真正回收对象占用的 内存。所以如果你打算使用 finalize() ,就能在垃圾回收时做一些重要的清理工作。
- 之所以有 finalize() 方法,是因为在分配内存时可能采用了类似 C 语言 中的做法,而非 Java 中的通常做法。这种情况主要发生在使用 “本地方法” 的情况下, 本地方法是一种用 Java 语言调用非 Java 语言代码的形式。本地方法目前只支持 C 和 C++,但是它们可以调用 其他语言写的代码,所以实际上可以调用任何代码。在非 Java 代码中,也许会调用 C 的 malloc() 函数系列来分配存储空间,而且除非调用 free() 函数,不然存储空间永 远得不到释放,造成内存泄露。但是,free() 是 C 和 C++ 中的函数,所以你需要在 finalize() 方法里用本地方法调用它。
- Java 虚拟机采用了一种自适应的垃圾回收技术。
- 一种垃圾回收技术叫做停止-复制(stopand-copy)。顾名思义,这需要先暂停程序的运行(不属于后台回收模式),然后将所有 存活的对象从当前堆复制到另一个堆,没有复制的就是需要被垃圾回收的。另外,当对 象被复制到新堆时,它们是一个挨着一个紧凑排列,然后就可以按照前面描述的那样简 单、直接地分配新空间了。
- 另一种垃圾回收模式称为标记-清扫。“标记-清扫” 所依据的思路仍然是从栈和静态存储区出发,遍历所有的引用,找出 所有存活的对象。但是,每当找到一个存活对象,就给对象设一个标记,并不回收它。 只有当标记过程完成后,清理动作才开始。在清理过程中,没有标记的对象将被释放, 不会发生任何复制动作。“标记-清扫” 后剩下的堆空间是不连续的,垃圾回收器要是希 望得到连续空间的话,就需要重新整理剩下的对象。
- Java 虚拟机会监视,如果所有对象都很稳定,垃圾回收的效率降低的话,就切 换到 “标记-清扫” 方式。同样,Java 虚拟机会跟踪 “标记-清扫” 的效果,如果堆空间出 现很多碎片,就会切换回 “停止-复制” 方式。
- 类的每个基本类型数据成员保证都会有一个初始值。
- 在类中变量定义的顺序决定了它们初始化的顺序。即使变量定义散布在方法定义 之间,它们仍会在任何方法(包括构造器)被调用之前得到初始化。
- 如果一个字段是静态的基本类型,你没 有初始化它,那么它就会获得基本类型的标准初值。如果它是对象引用,那么它的默认 初值就是 null。
- 初始化的顺序先是静态对象(如果它们之前没有被初始化的话),然后是非静态对 象,
- 即使没有显式地使用 static 关键字,构造器实际上也是静态方法。
- 如果你创建了一个非基本类型的数组,那么你创建的是一个引用数组。
- 你可以在单个参数列表中将类型混合在一起,自动装箱机制会有选择地把 int 类型的参数提升为 Integer。