java的new關鍵字想必大家都知道這是實例化一個對象。沒錯,也是為新對象分配內存空間。
比如new MyDate(22,7,1964)這樣一個案例,他的完成需要四部:
一。為新對象分配內存空間,將MyDate存儲到堆。
二。執行顯示的初始化
三。執行構造器。new方法中括號參數傳遞給構造器,出書話該對象數值
四。該變量被賦值為堆內存中新對象的引用
通俗的說,你new的操作,實際上是在內存的堆中新添加一個new的對象並且通過構造方法初始化這個新對象並且在棧中存放該對象的引用
下面我有一個案例,通俗易懂那種:
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的單利懶漢模式:
public class DanLi1class { //1.要想實現單利模式,必須修改其構造方法() private DanLi1class(){ } //2.首先自己先實例化該實例 private static DanLi1class dan1 = new DanLi1class(); //3.為保證別的程序訪問到該實例的實例華對象,需要定義一個靜態方法 public static DanLi1class danli1(){ return dan1; } }
這樣會節省內存占用,使得對象能夠重復使用,何樂而不為呢。