java的new關鍵字想必你們都知道這是實例化一個對象。沒錯,也是爲新對象分配內存空間。java
好比new MyDate(22,7,1964)這樣一個案例,他的完成須要四部:this
一。爲新對象分配內存空間,將MyDate存儲到堆。編碼
二。執行顯示的初始化spa
三。執行構造器。new方法中括號參數傳遞給構造器,出書話該對象數值code
四。該變量被賦值爲堆內存中新對象的引用對象
通俗的說,你new的操做,其實是在內存的堆中新添加一個new的對象而且經過構造方法初始化這個新對象而且在棧中存放該對象的引用blog
下面我有一個案例,通俗易懂那種:繼承
public class Pet { protected bean be = this.b(); public bean b(){ return new bean(); } }
public void test(){ be.setName("張三"); } public void test2(){ System.out.println(be.getName()); } public static void main(String[] args) { People pe = new People(); pe.test(); pe.test2(); }
一個父類,一個子類,經過test給name賦值,test2輸出值你會發現輸出的正事test給name的賦值,由於在運行main方法時,程序會先編譯父類而且實例化be對象,因此子類中的引用都是同一個對象,可是若是修改成下面代碼這種:內存
public void test(){ bean be = new bean(); be.setName("張三"); } public void test2(){ System.out.println(be.getName()); } public static void main(String[] args) { People pe = new People(); pe.test(); pe.test2(); }
在test中我新new了一個be對象,這樣的輸出是null,由於他們在內存棧中存放的引用是不同,在實際編碼的過程當中,引用比較多的對象最好在父類中寫好,子類繼承,或者寫成java的單利懶漢模式:get
public class DanLi1class { //1.要想實現單利模式,必須修改其構造方法() private DanLi1class(){ } //2.首先本身先實例化該實例 private static DanLi1class dan1 = new DanLi1class(); //3.爲保證別的程序訪問到該實例的實例華對象,須要定義一個靜態方法 public static DanLi1class danli1(){ return dan1; } }
這樣會節省內存佔用,使得對象可以重複使用,何樂而不爲呢。