JAVA编程思想笔记——初始化和清理(1)

1 用构造器确保初始化

        构造器采用与类相同的名字。主类的名字和文件名要相同。

        从概念上讲,初始化 和 创建 是彼此独立的,然而,在JAVA中,初始化 和 创建 是捆绑在一起的,两者不能分离。

        构造器是一种特殊类型的方法,因为它没有返回值。这与返回值为空(void)明显不同。对于返回值为空,尽管方法本身不会自动返回什么,但是仍可选择让它返回别的东西。构造器则不会返回任何东西。

2 方法重载

        构造器是强制重载方法名的另一个原因。       

        区分重载的方法:每个重载的方法都必须有一个独一无二的参数类型列表。参数顺序也可以区分两个方法,但是不推荐这么做。

        基本数据类型从较小的类型自动提升至一个较大的类型。但是如果传入的实际参数较大,就要通过强制类型转换进行窄化转换。

                转换顺序为:char -> int -> long -> float -> double;  byte -> short -> int ......

3 默认构造器

        又称为无参构造器。

        如果已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器。

4 this关键字

        this关键字返回了对当前对象的引用。通常写this的时候,都是指”这个对象“或”当前对象“,而且它本身表示对当前对象的引用
        应用情景:
1 将当前对象传递给其他方法
2 在构造器中调用构造器  除构造器之外,编译器禁止在其他任何方法中调用构造器

5 static

  • static方法就是没有this的方法。在static方法的内部不能调用非静态方法,但是反过来可以。
  • 可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法

6 清理:终结处理和垃圾回收

        垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块特殊内存,因为这块内存不是通过创建获得的
        finalize()方法:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。
注:在C++中,对象一定会被销毁(析构函数),而Java中的对象却并非总是被垃圾回收。需要注意三点:
  • 对象可能不被垃圾回收
  • 垃圾回收并不等于“析构”
  • 垃圾回收只与内存有关
        所谓的特殊情况,即是通过某种创建对象方式以外的方式为对象分配了内存空间。这时需要finalize()方法。主要是指在分配内存时可能采用了类C的做法,而非Java中通常做法。这种情况主要发生在使用“本地方法”的情况下,本地方法是一种在JAVA中调用非JAVA代码的方法。
        总结一句话,finalize()函数不是进行普通的清理工作的合适场所,因为它的使用情况非常特殊。

一个例子,之前在不应该的地方糊涂的:
class WebBank {
	boolean loggedIn = false;
	WebBank(boolean logStatus) {
		loggedIn = logStatus;
	}
	void logIn() {
		loggedIn = true;
	}
	void logOut() {
		loggedIn = false;
	}
	protected void finalize() {
		if(loggedIn)
			System.out.println("Error: still logged in");
		// Normally, you'll also do this:
		// super.finalize(); // Call the base-class version
	}
}

public class TerminationConditionEx {
	public static void main(String[] args) {
		WebBank bank1 = new WebBank(true);
		WebBank bank2 = new WebBank(true);
		// Proper cleanup: log out of bank1 before going home
		bank1.logOut();
		// Drop the reference, forget to cleanup:
		new WebBank(true);
		// Force garbage collection and finalization:
		System.gc();
	}	
}

上面的代码之所以会有error警告输出,是因为new WebBank(true);出来的对象没有引用(虽然Java的垃圾回收技术不是简单地检查引用数,这个接着就会讲到),所以在强制进行垃圾回收的时候,会检测它的loggedIn状态,另外两个不会。


Java不允许创建局部对象,必须使用new创建对象。

垃圾回收机制
        引用记数是一种简单但速度很慢的垃圾回收技术。并且不能处理循环引用这种情况。
        Java的垃圾回收所依据的思想为对任何“活”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。
        Java的垃圾回收机制的概括可以为:自适应的、分代的、停止-复制、标记-清扫式垃圾回收器。
posted @ 2013-05-16 20:20  suzhou  阅读(262)  评论(0编辑  收藏  举报