類實例化可生成對象,實例方法就是對象方法,實例變數就是對象屬性。一個對象的生命周期包括三個階段:創建、使用和銷毀。 創建對象 創建對象包括兩個步驟:聲明和實例化。 聲明 聲明對象與聲明普通變數沒有區別,語法格式如下: 其中type是引用類型,即類、介面和數組。示例代碼如下: 該語句聲明瞭字元串類型對 ...
類實例化可生成對象,實例方法就是對象方法,實例變數就是對象屬性。一個對象的生命周期包括三個階段:創建、使用和銷毀。
創建對象
創建對象包括兩個步驟:聲明和實例化。
1.聲明
聲明對象與聲明普通變數沒有區別,語法格式如下:
type objectName;
其中type是引用類型,即類、介面和數組。示例代碼如下:
String name;
該語句聲明瞭字元串類型對象name。可以聲明並不為對象分配記憶體空間,而只是分配一個引用。
2.實例化
實例化過程分為兩個階段:為對象分配記憶體空間和初始化對象,首先使用new運算符為對象分配記憶體空間,然後再調用構造方法初始化對象。示例代碼如下:
String name; name = new String("Hello World");
代碼中String("Hello World")表達式就是調用String的構造方法。初始化完成之後如下圖所示:
空對象
一個引用變數沒有通過new分配記憶體空間,這個對象就是空對象,Java使用關鍵字null表示空對象。示例代碼如下:
String name =null; name ="Hello World";
引用變數預設值是null。當試圖調用一個空對象的實例變數或實例方法時,會拋出空指針異常NullPointerException,如下代碼所示:
String name =null;
//輸出null字元串System.out.println(name);
//調用length()方法int len = name.length();①
但是代碼運行到第①行時,系統會拋出異常。這是因為調用length()方法時,name是空對象。程式員應該避免調用空對象的成員變數和方法,代碼如下:
//判斷對象是否為null
if(name !=null){int len = name.length();}
提示 產生空對象有兩種可能性:第一是程式員自己忘記了實例化,第二是空對象是別人傳遞過來的。程式員必須防止第一種情況的發生,應該仔細檢查自己的代碼,為自己創建的所有對象進行實例化並初始化。第二種情況需要通過判斷對象非null進行避免。
避免創建不必要的對象
(1)註意String是有常量池的,它實際上是通過private final char[]來存放的,所以它是不可變的,只有第一次使用這個字元串組合的時候才進入常量池:new String("abc");實際上是有兩個字元串對象,"abc"是編譯期存在,它已經進入常量池了;
(2)對於Calendar這樣的實例化代價較大的對象考慮儘量復用;
(3)使用自動裝箱類型一定要特別小心,以免在迴圈中因為自動裝箱而創建大量對象,能用基本類型就不要用裝箱類型;
(4)小對象的創建和銷毀代價是很小的,因此,使用對象池的時候一定要考慮是不是值得,使用對象池管理不當也可能造成記憶體泄漏。
對象銷毀
對象不再使用時應該銷毀。C++語言對象是通過delete語句手動釋放,Java語言對象是由垃圾回收器(Garbage Collection)收集然後釋放,程式員不用關心釋放的細節。自動記憶體管理是現代電腦語言發展趨勢,例如:C#語言的垃圾回收,Objective-C和Swift語言的ARC(記憶體自動引用計數管理)。
垃圾回收器(Garbage Collection)的工作原理是:當一個對象的引用不存在時,認為該對象不再需要,垃圾回收器自動掃描對象的動態記憶體區,把沒有引用的對象作為垃圾收集起來並釋放。