iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
自我挑戰組

前端工程師的java學習紀錄系列 第 12

Day12-類(記憶體中的表現方式)

  • 分享至 

  • xImage
  •  

class(類)是Java中的頭等公民,所有的東西都是寫在class裡面

昨天講的,如何定義一個class,當中包含了屬性以及方法

class People {

	String name;
	int age;
	
	public void sleep(int hour) {
			System.out.println("我今天睡了 " + hour + " 小時");
		}
		
	public String speak(String word) {
		String info = name + "說了" + word;
		return info;
	}
	
	public void eat() {
	}
}

當定義了一個class時,Java會預先將它的整個模板存在Method Area(方法區),當後續實例化時會去使用這個模板實例化這個class

如下圖所示

https://ithelp.ithome.com.tw/upload/images/20240926/20139160gPBrfUQQrE.jpg


實例化People

public class PeopleTest {
	public static void main(String[] args) {
		People jack = new People();
		jack.name = "Jack";
		jack.age = 21;
		
		jack.eat(); // 沒有任何事發生
		jack.sleep(10); // 我今天睡了 10 小時
		jack.speak("helloooooo"); // Jack說了helloooooo
		
	}
}

當在main當中實例化這個People時,會從Method Area(方法區),並依照在Day10-陣列(二)提到的那樣分別將不同的東西放在它們應該放的位置(Stack、Heap)

如下圖所示

https://ithelp.ithome.com.tw/upload/images/20240926/20139160AO5DdoxRSW.jpg

  1. 首先第一個方法是main,也是這個PeopleTest程式的進入點,它的裡面有兩個局部變量,分別是args(參數也是變量的一種)和jack(剛剛定義的People class),並且它們會一起被放在Stack中和main在一起(因為main還沒結束)。
  2. 接著實例化了一個People變數名jack型別為People。程式碼的部分是People jack = new People();
  3. jacknameage屬性分別賦值。(String在記憶體中應該也是屬於引用型別,記憶的應該會是16進制位址,後續確定時會再進行修正)
  4. 調用eat()方法,還記得之前提到過,Stack是屬於先進後出,所以當調用eat()方法後,執行完裡面的東西(依照剛剛所寫的來看,裡面沒有任何東西,所以它進去後就又馬上出來),實線的部分為它實際所在的位置,虛線及箭頭代表它從Stack中離開。
  5. 接著又會調用sleep()speak()方法。
  6. 各自執行完後也會像eat()那樣離開Stack
  7. 最後main裡面沒有東西要執行了,它也會從Stack離開。

https://ithelp.ithome.com.tw/upload/images/20240926/201391605dNvBSW8dx.jpg

最後它們都一起跑到掰掰區跟大家說掰掰了。


上一篇
Day11-類(class)
下一篇
Day13-class method的重載與參數
系列文
前端工程師的java學習紀錄38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言