歡迎您光臨本站 註冊首頁

面向對象編程筆記9—對象生命周期

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  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次圍觀

http://coctec.com/docs/java/show-post-60884.html