9.4 JDK API包名綜述
在整個JDK API中,大約包含1、200個包,總體來看,包名第一個名稱主要有三種:java、javax和org。其中以java開頭的包名是JDK的基礎語言包,以javax開頭的屬於JDK擴展包(其中x是extend的簡寫),而以org開頭的則是第三方組織提供的功能包(org是organization的簡寫)。而在JDK API中還包含了一些以com.sun開頭的包名,這些是SUN公司提供的一些功能包,由於這些包中的類隨著JDK版本的更改變化很大,不具備兼容性,所以未在標准的JDK API文檔中進行公開。
在本章接下來的內容中,首先介紹常用的類的功能以及基本使用,這些介紹主要涵蓋java.lang包和java.util包中的內容。
9.5 java.lang包
java.lang包是Java基礎語言包(其中lang是language(語言)的簡寫),該包中包含Java語言所需要的基本的功能類、接口等信息,是進行Java語言編程的基礎。
由於在進行Java語言編程時,該包的使用特別頻繁,所以在Java語言中,該包是被默認引入的。
下面就介紹一下該包中常見類的功能以及相關使用。
9.5.1 Object
Object類Java語言的靈魂,因為所有的類(除了Object類),都是該類的子類,即使不書寫繼承,系統也會自動繼承該類,所以Object是整個Java語言繼承樹的唯一一個根,這就是Java語言特色的單根繼承體系。包括數組也實現了該類中的方法。
由於Java語言的這種單根繼承體系,所以整個Java語言的結構中很方便的實現了很多復雜的特性,例如多線程等控制,也可以很方便的對於整個Java語言體系進行更新。
由於Object類是Java語言中所有類的父類,所以Object類中的方法將出現在每個類的內部,熟悉該類中的常見方法中的使用,是每個程序員學習的基礎。
1、equals方法
equals方法實現的功能是判斷兩個對象的內容是否相同。Object類中該方法的實現很簡單,Object類中equals方法實現的代碼如下(說明:該代碼可以從JDK安裝目錄下的src.zip中找到):
public boolean equals(Object obj) {
return (this == obj);
}
在Object類中方法的實現比較簡單,如果真正需要在項目中進行比較時,這個equals方法的作用是無法達到實際的要求的。所以如果在項目中涉及的類需要比較該類型的對象時,則必須覆蓋equals方法。
下面以一個簡單的類為示例,編寫一個簡單的equals方法,源代碼如下:
/**
* equals方法編寫示例
*/
public class MyEquals {
/**對象成員變量*/
String name;
/**基本數據類型成員變量*/
int n;
/**
* 判斷對象內容是否相同
* @param obj 需要比較的對象
*/
public boolean equals(Object obj){
//如果比較的內容是自身
if(obj == this){
return true;
}
//對象類型不同
if(!(obj instanceof MyEquals)){
return false;
}
//轉換成當前類類型
MyEquals m = (MyEquals)obj;
/*依次比較對象中每個變量*/
//name屬性不同
if(!name.equals(m.name)){
return false;
}
//n屬性不同
if(!(n == m.n)){
return false;
}
//如果都相同,則返回true
return true;
}
}
在實際比較時,首先判斷是否是自身,然後再判斷對象的類型是否符合要求,可以使用instanceof關鍵字進行判斷,該運算符的語法格式為:
對象名 instanceof 類名
如果對象名是後續類名類型的對象,則結果為true,否則為false。
如果類型符合要求,然後就可以依次比較對象中每個屬性的值是否相同了,如果有一個屬性的值不相同則不相等。
2、finalize方法
finalize方法的作用和前面介紹的構造方法的概念剛好相反,構造方法的作用是初始化一個對象,而finalize方法的作用是釋放一個對象占用的內存空間時,會被JVM自動調用的方法。
說明:finalize方法的作用和C++中析構函數的作用一樣。
如果在對象被釋放時,需要執行一些操作的話,則可以在該類中覆蓋finalize方法,然後在方法內部書寫需要執行的代碼即可。
3、hashcode方法
hashcode方法的作用是獲得一個數值,該數值一般被稱作散列碼,使用這個數值可以快速判斷兩個對象是否不相同,主要應用於集合框架中類的快速判斷。
兩個內容相同的對象,其hashcode方法的返回值必須相同,而兩個不相同的對象其hashcode的值可能相同。
如果自己編寫的類需要存儲到集合類中,則覆蓋該方法可以提高集合類的執行效率。
4、toString方法
toString方法是顯示對象內容時會被系統自動調用的方法,當輸出一個對象的內容時,系統會自動調用該類的toString方法,例如輸出Object類型的對象obj,則以下兩組代碼的功能是一樣的:
System.out.println(obj);
System.out.println(obj.toString());
而Object類中的toString類實現比較簡單,其源代碼為:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
如果需要自己的類的對象按照一定的格式進行輸出,則可以在自己設計的類內部覆蓋toString方法,然後設計需要的輸出格式即可。
至於Object類中的其它方法,下面做一個基本的介紹:
l clone方法:復制對象。也就是創建一個和該對象的內容完全一樣的對象,新的對象擁有獨立的內存空間。
l getClass方法:主要獲得對象的類型,該方法主要用於反射技術的實現。
另外的wait、notify和notifyAll等方法在是為了實現多線程的需要而實現的,將在後續的多線程技術中進行詳細的介紹。
9.5.2 Math
Math類是一個數學工具類,在Java語言中,常用的數學常數和數學方法都在該類內部,而且無論是常數還是方法都是static類型的,方便程序員進行實際的使用。
下面示例代碼是調用Math類中的abs方法實現求數字的絕對值的實現代碼:
/**
* Math類基本使用
*/
public class MathDemo {
public static void main(String[] args) {
int m = -10;
int n = Math.abs(m);
System.out.println("絕對值是:" + n);
}
}
由於Math類的方法作用比較簡單,這裡就不一一舉例了,具體的方法請參閱JDK API文檔。