1. 程式人生 > >JAVA學習筆記8——面向物件概述2_記憶體分配

JAVA學習筆記8——面向物件概述2_記憶體分配

最近在看JAVA教學的視訊,覺得老師講的很好,同時借用原始碼還有筆記來撰寫本系列部落格,記錄自己的學習內容,同時也供看到的人學習。

好啦,開始第8篇了,這篇主要講JAVA程式執行時的記憶體分析(包含繼承多型的本篇暫不介紹)。

在介紹記憶體分析之前先來總結一下方法的一些知識:




接下來,溫習一下關於變數初始化的要求:屬性(成員變數)預設的初始化:整型預設為0,小數0.0,布林預設為false,char預設為\u0000(一個unicode碼,還是0),其餘型別(字串、陣列、引用全是null);區域性變數必須初始化,沒有預設值。

下面要介紹的是JAVA程式執行的時候記憶體裡會開闢那些空間以及分別存放程式中的什麼:


下面有一個較簡單和一個較複雜的例項來具體說明JAVA程式執行的時候記憶體分配情況:

例項1:

public class Student {
	//靜態的資料
	 String name;
	 int id;    //學號
	 int age;
	 String gender;
	 int weight;
	 Computer computer;
	//動態的行為
	 public void study(){
		 System.out.println(name+"在學習");
	 }
	 
	 public void sayHello(String sname){
		 System.out.println(name+"向"+sname+"說:你好!");
	 }
	 public static void main(String[] args){
		 //通過類載入器Class Loader載入Student類,載入後,在方法區就有了Student類的資訊。
		 Student s1 = new Student();   //s1也是區域性變數~
		 s1.name="gaoqi";
		 s1.study();
		 s1.sayHello("mashibing");
		 
		 //上面已經載入過了,不用再載入了,直接拿來用。
		 Student s2 = new Student();
		 s2.name="gaoqi";
		 s2.study();
		 s2.sayHello("mashibing");
	 }
}
記憶體分配圖:


對於部分內容的解釋說明:我們看到沒一個箭頭的出發出均有一個地址,那就是他們指向(賦值/呼叫)的時候用到的變數的地址,眾所周知,計算機的記憶體對於堆、棧都是為其開闢一段儲存單元,任何資料結構裡面的基本資料、函式程式碼(方法程式碼)都是存放在一個個儲存單元裡面,所以我們在訪問這些資料的時候都是按照他們所在的地址進行訪問的,JAVA的JVM也不例外。

例項2:

public class Student {
	//靜態的資料
	 String name;
	 int id;    //學號
	 int age;
	 String gender;
	 int weight;
	 Computer computer;
	//動態的行為
	 public void study(){
		 System.out.println(name+"在學習");
	 }
	 
	 public void sayHello(String sname){
		 System.out.println(name+"向"+sname+"說:你好!");
	 }
}
public class Computer {
	String brand;
	int cpuSpeed;
}
public class Test2 {
	public static void main(String[] args) {
		Student s1 = new Student();
		s1.name = "高琪";
		s1.age = 18;
		
		Computer c = new Computer();
		c.brand = "聯想";
		c.cpuSpeed = 100;
		
		s1.computer = c;
		
		c.brand = "戴爾";
		
		System.out.println(s1.computer.brand);
	}
}
記憶體分配圖: