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!

推薦閱讀: