我是一隻小小鳥————簡單的內存分析。

         無論是學習java還是c或者c++,內存分析都是必不可少的,那我們就簡單的聊點內存的那些事兒吧。
        我們前邊也提到過,內存執行的過程就在那四大塊區域裏面,比如我們在方法中定義的局部變量就被放在了棧內存中,當然形參也屬於局部變量。說到這裏就不得不提到“引用”了,這個是面向對象的基礎重點,我們已經知道了“四類八種”的基本數據類型,那麼引用數據類型就是除去這八種之外的其他所有數據類型,如我們定義的Person類型或者Car類型等等。於是我們就會想到,引用並不是直接去訪問對象,而是像C裏面的指針那樣通過一個地址去訪問它,這和基本類型就不一樣了,在內存中我們定義一個整型的變量,如int  n;那在內存中就爲n分配了一小塊空間,4個字節,其他的基本類型也是一樣的,就佔一塊內存區域;而引用數據類型則是有兩塊內存空間,一個裝引用,一個裝對象,這樣是不是顯得比較籠統,那我們就上圖吧,有圖有真相~~~
     

       

 

 

 

       

 

 

 

 

 

 

 

 

 

        

       如圖所示,我們在main方法中定義了兩個C類型的變量c1和c2,當然C屬於引用類型了,於是在圖右下角的棧內存中爲我們的c1和c2分配了兩塊區域,我們再看賦值號右邊的“new C()”,這個對於有一點java基礎的熱來說並不難理解,new關鍵字,創建對象用的,“C()”是C的無參構造方法,這個在後邊會詳解,通過這兩條語句堆內存就會爲其分配兩塊空間,用來裝我們的這兩個對象,因爲我們知道new出來的東西都要放到堆內存中,動態分配嘛,然後大家也會看到,每一塊空間裏面又有兩小塊區域,這裏面放的是對象的屬性,每個新的對象都會擁有專屬於自己的一套屬性,這樣才能做到“與衆不同”。那有人會問了,你這一個棧內存一個堆內存,二者怎麼聯繫起來啊,其實在圖的右下角位置,c1和c2都封存了一套地址,通過這個地址c1和c2就可以指向堆內存中的兩個對象,至於這個地址是什麼,那不是我們所要了解的問題,就像C裏面的指針一樣,那是計算機爲其自動分配的,我們沒必要知道它具體是什麼,當然這裏的引用地址並非和指針完全一樣,它並不是簡簡單單的物理地址。

       引用這一塊也是博大精深的,有些東西需要我們記憶,但理解更爲重要。大家要記住一看是引用類型的數據,我們腦子裏就要浮現出一個場景,兩塊大內存,一個棧一個堆,引用放到棧裏面,new出來的對象放到堆裏面,然後棧裏面的引用指向堆裏面的對象就ok了,看來編程真的需要我們浮想聯翩啊~~~ 

        最後來看一下構造方法,就如上圖所示,“C()”就是C的一個構造方法,首先它要與類名一樣,完全一樣哈,一根頭髮都不能錯,還不能有返回值,這個就是這麼要求的。我們還是來看一段代碼吧……

int id;
int age = 20;
Person(int _id, int _age) {
		id = _id;
		age = _age;
	}

         這個就是Person類的一個構造方法,方法名和類名一樣,無返回值,id和age是我們爲Person類定義的成員變量,也就是所謂的屬性,_id和_age是定義的兩個形參,用於爲我們傳遞數值,Person jerry = new Person(123,23);這條語句可以通過調用Person的有參構造方法得到一個jerry對象,這個對象的id爲123,年齡爲23,這裏的“123”和“23”就是我們實際傳遞的參數,稱之爲實參,當調用構造方法時,123傳給了_id,23傳給了_age,然後_id和_age再分別賦值給id和age,這樣就得到了一套特有的屬性,它也使得jerry變得獨一無二。

         一開始學習這塊時遇到了一個很無奈的事兒,構造方法裏定義的形參與成員變量一樣,於是便經常會遇到這樣的語句——this.name=name;當時就很納悶,這是一個什麼東西,完全懵了,就這麼一個不算問題的問題,弄得我們完全放棄了治療。現在我們來看,賦值號左邊的name是我們定義在類裏面的成員變量,this是邏輯的對象,可以用“.”去調用它的成員變量,賦值號右邊的name則是構造方法的形參,用這種方式可以將我們實際傳遞的值賦給成員變量,從而得到一套屬於自己的屬性。

         總之,構造方法就是“構造對象的方法”,它與new關鍵字配合使用就可以得到一個新對象,這裏需要注意的就是得到的這個對象實際上是一個引用,因爲Person本身就是一個引用類型,因此我們訪問的是一個對象的引用,而不是直接去訪問的對象。構造方法的擴展與內存分析關係緊密,以後還會再聊的。簡單的內存分析之後,即將進入真正的內存世界!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章