JAVA筆記【20131206】

對象構造

一、重載

類中方法名相同,參數不同即重載。返回類型可以不同也可以相同。Java中允許重載任何方法。

二、初始化

默認初始化:

        在一個類的構造器裏,如果沒有顯式的給域賦予初值,就會自動的被賦予默認值。

        數值:0 布爾值:false 對象:null

構造器初始化:

        如果在編寫一個類時沒有編寫構造器,則系統會提供一個默認的構造器,採用默認值對實例域進行初始化。

        但如果類中提供了構造器,再使用默認的構造器就會編譯錯誤。

public Employee(String name , float salary)
{
	this.name=name;
	this.salary=salary;
}

       當然一個構造器也可以調用同一個類的另外一個構造器,這樣對於構造器公用部分只需要編寫一次即可。


public Employee(float salary)
{
	this.("Employee"+nextId,salary); //此處就會調用上面的public Employee(String name , float salary)構造器
	nextId++;
}


顯式域初始化:

        所謂顯式域初始化,即在類定義的時候爲每個域賦予一個初始的值。這樣在構造器被執行之前會先執行實例域的賦值。

public class Employee
{
	private String name = "";
	private float salary = 0 ;
	
	public Employee()
	{
	}
}

         當然初始化值也不一定非得是常量,也可以通過調用方法來進行初始化。

public class Employee
{
	static int getId()
	{
		int r = nextId;
		nextId++;
		return r
	}
	private int id = getId();
	
	private static int nextId = 1 ;
}

初始化塊:

        所謂初始化塊,也即在類的聲明中包含代碼塊,在類構造對象的時候,這些代碼塊就會被執行。

public class Employee
{
	private int id ;
	
	{ //實例域初始化塊
		id = nextId;
		nextId++;
	}
}

       靜態域初始化塊,在塊標示static即可

static
{
	Random generator = new Random();
	nextId = generator.nextInt(10000);
}

       靜態域初始化可以編寫沒有main方法的的程序:

public class Test18
{
	static     //靜態域初始化塊
	{
		System.out.println("No Main");	
		System.exit(0);  //避免拋出的異常
	}
}

三、析構器與finalize方法

Java有自動的垃圾回收器,不需要人工回收內存,所以Java不支持析構器。

但對於其它資源,可以通過爲類提供finalize方法處理。finalize方法在一個類被垃圾回收器回收之前被調用。

但由於垃圾回收器是自動回收的,所以不知道finalize方法的執行時間是未知的,對於短缺的資源不建議使用finalize方法。

public class Test19
{
	public static void main(String[] args)
	{
		Test19 test = new Test19();
		test = null;   //對象test已經沒有意義了
		System.gc();   //手動調用垃圾回收器,雖然手動調用了,但也不能保證垃圾回收器會立即回收。
	}
	
	public void finalize()
	{
		System.out.println("被垃圾回收器回收了...");
	}
}

從運行結果可以看出,雖然System.gc()被調用了,但也不會立即垃圾回收。當垃圾回收的時候finalize方法被執行



一些資源在使用完畢後需要立刻關閉釋放的,需要人工管理。一般會提供類似dispose或者close方法來做相應的清理工作,如果一個類提供了這樣的方法,則在對象不用的時候一定要調用該方法。


四、包

包的導入:

直接導入包可以避免在每個類名之前需要寫完整路徑。

import java.util.* ;

當發生命名衝突時,例如java.util.*和java.sql.*中都包含Date類,這時候就需要指定使用的是哪個Date,如下就指定了java.util.Date

import java.util.*;

import java.sql.*;

import java.util.Date;

如果兩個Date類型都需要的話,那只能在每個類聲明上加上完整路徑。

靜態導入:

導入靜態方法和靜態域(不常用)

import static java.lang.System.*;

導入後就可以直接

out.println("-------");

exit(0);


五、類設計技巧(Java2核心技術)

1、一定將數據設爲私有

2、一定要對數據初始化

3、不要在類中使用過多的基本數據類型

4、不是所有的域都需要獨立的域訪問器和域更改器

5、使用標準格式進行類的定義

6、將職責過多的類進行拆分

7、類名和方法名要體現它們的職責




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章