一、JVM的內存劃分
內存是計算機中的重要原件,臨時存儲區域,作用是運行程序。我們編寫的程序是存放在硬盤中的,在硬盤中的程 序是不會運行的,必須放進內存中才能運行,運行完畢後會清空內存。Java虛擬機要運行程序,必須要對內存進行空間的分配和管理。
爲了提高運算效率,就對空間進行了不同區域的劃分,因爲每一片區域都有特定的處理數據方式和內存管理方式,共分爲5部分:
棧:存儲的都是方法中的局部變量,方法運行一定要在棧中運行。
堆:存儲對象或者數組,new來創建的,都存儲在堆內存。
方法區:存儲可以運行的class文件,包含方法的信息。
寄存器:給CPU使用,和我們開發無關。
本地方法棧:JVM在使用操作系統功能的時候使用,和我們開發無關。
程序執行過程示例圖:
二、方法中參數的傳遞實質
方法:就是將一個功能抽取出來,把代碼單獨定義在一個大括號內,形成一個單獨的功能。當我們需要這個功能的時候,就可以去調用。這樣即實現了代碼的複用性,也解決了代碼冗餘的現象。
定義格式:
修飾符 返回值類型 方法名(參數列表){
代碼...
return 結果; }
定義格式解釋:
修飾符: 目前固定寫法 public static 。
返回值類型: 目前固定寫法 void ,其他返回值類型在後面的課程講解。
方法名:爲我們定義的方法起名,滿足標識符的規範,用來調用方法。
參數列表: 空車,有參兩種形式。
return:方法結束。因爲返回值類型是void,方法大括號內的return可以不寫。
舉例:
public static void methodName() {
System.out.println(“這是一個方法”);
}
方法重載:指在同一個類中,允許存在一個以上的同名方法,只要它們的參數列表不同即可,與修飾符和返回值類型無關。參數列表:個數不同,數據類型不同,順序不同。
重載方法調用:JVM通過方法的參數列表,調用不同的方法。
方法的參數爲基本類型時,傳遞的是數據值. 方法的參數爲引用類型時,傳遞的是地址值。
參數爲引用數據類型是值傳遞很好理解,可見下方實例圖所示。
public static void main(String[] args) {
int[] arr = getArray();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static int[] getArray() {
int[] arr = { 1, 3, 5, 7, 9 };
//返回數組的地址,返回到調用者
return arr;
}
重點說一下參數爲基本數據類型的值。
值傳遞:是指在調用函數時,將實際參數複製一份傳遞給函數,這樣在函數中修改參數時,不會影響到實際參數。其實,就是在說值傳遞時,只會改變形參,不會改變實參。
這裏,需要特別強調的是,千萬不要以爲傳遞的參數是值就是值傳遞,傳遞的是引用就是引用傳遞。也不要以爲傳遞的參數是基本數據類型就是值傳遞,傳遞的是對象就是引用傳遞。 這是大錯特錯的。以前的我,一直都是這樣認爲的,現在想來真是太天真了。判斷是值傳遞還是引用傳遞的標準,和傳遞參數的類型是沒有一毛錢關係的。
以下面試題爲例:
package com.cp.demo;
public class Method_Demo1 {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a); //1
System.out.println(b); //2
change(a, b);
System.out.println(a); //1
System.out.println(b); //2
}
public static void change(int a, int b) {
a = a + b;
b = b + a;
System.out.println(a);
System.out.println(b);
}
}
結果爲:
1
2
3
5
1
2