對象構造
一、重載
類中方法名相同,參數不同即重載。返回類型可以不同也可以相同。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、類名和方法名要體現它們的職責