Java面向對象和內存分析圖文詳解
一、Java類
類是面向對象編程中最基本的單位。
Java中的類包含三個內容,分別是:
屬性
- 屬性又叫成員變量。
- 屬性用於定義類或類對象的數據(靜態特征)。
- 范圍為整個類體。
方法
- 方法用於定義類或類對象的行為特征(執行動作)(動態)。
- 方法類似於面向過程中的函數,面向過程中的函數是最基本的單位;
- 而在面向對象中,最基本單位是類,方法從屬於類和對象。
構造方法
- 構造方法分為無參構造方法;有參構造方法。
- 構造方法要與類名保持一致。
- 如果不設置構造方法,則系統自動生成無參構造方法。
屬性的定義格式:
[修飾符] 屬性類型 屬性名 = [默認值]; //若不初始化則系統默認給默認值
方法定義格式:
[修飾符] 方法返回值類型 方法名(形參){
語句
}
有如下代碼進行示例分析
public class Person{ public String name; //屬性,帶有修飾符 int age; public void show(){ //方法 System.out.println("姓名:"+name+",年齡:"+age); } /* Person(){ //構造方法,手動,無參構造方法,一個類裡無參構造方法隻能有一個 } */ /* Person(String name, int age){ //手動,有參構造方法。 this.name = name; this.age = age; } */ public static void main (String[] args){ Person p1 = new Person("李四",18); //此時調用的是上面手動有參的構造方法 Person p2 = new Person(); //此時調用的是無參構造方法 p2.name = "張三"; //無參構造方法需要以下賦值 p2.age = 18; p2.show(); } }
二、內存分析
上面介紹瞭類的基本知識,那麼我們接下來根據上面的代碼來進行內存分析。
JVM內存模型很復雜,為瞭更好的理解面向對象和面向對象代碼,下面進行對模型的簡化。(此內存分析並不是為瞭理解JVM內存模型)
下面對上面三個內存模型進行特征介紹:
棧:
- 棧描述的是方法執行的內存模型,每個方法被調用時都會創建一個棧幀。
- JVM為每個線程創建一個棧。
- 棧是私有,在線程間不會共享。
- 棧是一段連續的存儲空間。
堆:
- 堆用於存儲創建好的對象。
- JVM隻有一個堆。
- 堆被所有線程共享。
- 堆是不連續的空間,分配靈活。
方法區:
- 方法區實際也是堆,用來專門存儲類、常量(static關鍵詞相關)等相關信息。
- JVM隻有一個方法區。
- 可共享。
- 存儲不變的信息。
下面我們來看代碼的運行過程:
程序均是將main方法作為程序的入口,執行第二條語句(第一條先忽略)
Person p2 = new Person();
此時會在棧中開辟一個新的棧幀,為main方法棧幀;方法區會加載整個類模板,存儲類裡面的相關信息;在堆處會產生一個新的類的對象。如圖
/*
小插曲:Java使用new關鍵字來調用構造方法,從而返回該類的實例(對象)。但是這個對象不是完全由構造方法來創建的。創建一個方法分4步:在堆中分配對象空間,並將對象的成員變量初始化默認值執行顯式初始化(比如int i = 3)執行構造方法返回對象地址
*/
當Person()構造方法調用完成後,出棧繼續執行main中的下一條語句。如圖
下一條語句是
p2.name = "張三"; p2.age = 18;
此時是方法區的張三賦值給name;
我們繼續執行下條語句
p2.show();
此時會執行show方法,我們註意到show方法中有age和name。那麼它們是誰的name和age呢?我們可以看是p2.show()。p2的地址是0x11,指向的是堆中的0x11對象,所以show方法中的name和age就已知瞭。
那麼當方法執行完後,show方法出棧,同時main方法也執行完畢,也需要出棧,main方法執行完後,對象和方法區中的類信息也就會清空。內存就會回到最初的狀態。
總結
到此這篇關於Java面向對象和內存分析的文章就介紹到這瞭,更多相關Java面向對象內存分析內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- java中類和對象的詳細介紹
- Java雜談之類和對象 封裝 構造方法以及代碼塊詳解
- 一篇文章帶你深入瞭解Java對象與Java類
- 手把手帶你粗略瞭解Java–類和對象
- Java基礎之static的用法