1.創建對象
1)顯示創建:
a.用new創建對象.
b.使用反射手段,即調用java.lang.Class或者java.lang.reflect.Constructor類的newInstance()實例方法.
c.調用對象的clone()方法.注意,這種方法不會調用類的構造函數
d.使用反序列化的方法.
對於clone方法注意:
a.Object中的clone方法時protected,若希望對外公開clone()方法,就必須擴大訪問範圍,改為public
b.返回Object類型.
c.若類沒有實現Cloneable介面,clone()方法會拋出異常,Object的子類若是允許客戶程序調用其clone()方法,那麼這個類必須實現Cloneable方法.
2)隱式創建:
a.String str= "hello";這種屬於String類型直接數對應一個String對象,引用一個String對象.若此時運行String str2=
"hello";則str和str1是同一個對象.
b.String中 的使用.
c.JVM載入一個類的時候,會隱含創建描述這個類的Class實例.
3)創建步驟:
a.給對象分配內存.
b.將對象的實例變數自動初始化為其變數類型的默認值.
c.初始化對象,給實例變數賦予正確的初始值.
2.構造方法
注意:
沒有返回類型(有的話,即使函數名同名也被視為一般函數而非構造方法),不能被static、final、synchronized、abstract和native修飾.
用this可以重載構造方法:必須在第一條語句使用this.且必須在構造方法中使用this調用其他構造方法.
在類中沒有構造方法的時候JAVA會給每個類一個默認的構造方法,但是若類中顯式的添加了構造方法,並且所有的構造方法都帶參數,那麼這個類除非也顯式的定義一個默認構造方法,否則默認的構造方法就缺失了.
子類的構造方法中,可以通過super語句調用父類的構造方法,構造函數是不繼承的.例如:super("Something is OK");
在構建子類對象的時候,JVM執行父類的構造方法,然後再執行子類的構造方法.在多級繼承的時候,從繼承樹的最上層的父類開始,依次執行各個類的構造方法.
構造方法的調用:
當前類的其他構造方式通過this語句調用它.其子類的構造方法通過super調用.在程序中使用new調用.
構造方法的訪問級別:
一般的我們的構造方法都是public級別的(以上我們討論的情況),但是我們現在要討論的是在private級別的,這就意味著只能在當前類中或在當前類的其他構造方法中通過this語句調用它.當然,在當前類的成員方法中使用new也會調用)
a.這個類只提供一些靜態方法給外部,為了禁止外部程序創建類的實例(靜態方法無需創建實例),將構造方法設為private.
b.禁止這個類被繼承.當然是用final也可以解決,但它同時也禁止了外部使用new進行創建實例(同a所述)
c.這個類需要把構造自身實例的細節封裝起來,而向其他程序提供了獲得自身實例的靜態方法——靜態工廠方法.
3.靜態工廠方法:
假如類需要進一步封裝創建自身實例的細節,並且控制自身實例數目,那麼可以提供靜態工廠方法.
使用舉例:
public class Gender{ private String description; private static final Gender female = new Gender("female"); private static final Gender male = new Gender("male"); private Gender(String description){this.description=description;} public static Gender getFemale(){ return female; } } |
特點:
a.靜態工廠方法名可以不與類名相同,程序代碼可讀性增強.比較流行的是將這樣的代碼命名為valueOf或者getInstance
b.使用時是否會創建一個新的對象完全取決於方法的實現.
c.可以返回當前類的子類的實例.
應用:創建以下各種類.
a.單例類:系統中具有唯一性的組件.
實現方法:
1)把構造方法定義為private類型,提供public static final 類型的靜態變數.該變數引用類的唯一的實例.
2)在方法1)的基礎上添加getInstance方法,返回那個靜態變數,使用的是靜態工廠方法.這個的好處在於可以不修改方法名的前提下修改實現getInstance的實現方式,以適應變更的需求.
b.自定義枚舉類:實例數目有限的類.
c.不可變類:指創建了這個類的實例后就不允許修改它的屬性值.
創建時把屬性定義為private final類型,不對外公開setXXX()方法,只對外公開getXXX()方法.在構造方法中初始化所有屬性.覆蓋Object的equals()方法和hashCode()方法.若是需要就提供實例緩存和靜態工廠方法.
類的設計優先考慮不可變類.在創建不可變類的時候,若其屬性是可變類型,則需要提供保護性拷貝.
具有實例緩存的不可變類,比如Integer實例,有一個靜態工廠方法valueOf(int i),這樣創建的一個Integer對象,要是發現前邊有值是相同創建好的實例的話,那麼直接使用以前創建的.這樣的特性可以通過Java集合來作為實例緩存.
public class Ghost{ private static final Map ghosts = new HashMap(); private final String name; private Ghost(String name){ this.name = name; } public String getName(){ return name; } public static Ghost getInstance(String name){ Ghost ghost = ghosts.get(name); if(ghost == null){ ghosts=new Ghost(name); ghosts.put(name,ghost); } return ghost; } public static void removeInstance(String name){ ghosts.remove(name); } |
在分層的軟體系統中,業務邏輯層向客戶層提供服務,靜態工程類可以進一步削弱這兩層間的耦合關係.
本文來自博客:http://blog.csdn.net/gnuhpc/archive/2009/09/26/4597382.aspx
[火星人 ] 面向對象編程筆記9—對象生命周期已經有419次圍觀