方法的形式參數:
形參:方法聲明時,方法小括號內的參數
實參:調用方法時,實際傳入參數的值
- 規則:java中參數傳遞機制,值傳遞機制
- 形參是基本數據類型:將實參的值傳遞給形參的基本數據類型的變量
- 形參是引用數據類型:將實參的引用類型變量的值(對應堆空間的對象實體的首地址值)傳遞給形參的引用類型變量
- 基本類型:形式參數的改變不影響實際參數
- 引用類型:形式參數的改變直接影響實際參數 -
1 :如果參數是基本數據類型那麼傳的是變量的值,例如: int a= 10; 那麼傳過去的就是10!
package qqwwffg.pass_method_paramater;
public class PrimitiveType {
public void change(int a) {
a = 3;
}
public static void main(String[] args) {
int a = 1;
PrimitiveType test = new PrimitiveType();
test.change(a);
System.out.println(a); // 1 ,而不是3
}
}
change ( )方法在被調用的時候,在內存中也分配一個空間來存儲,存的是傳過來的值,即3 .而當方法結束時,這塊內存就等垃圾回收了,而在main 方法中,它打印的a 的值是在調用main方法時分配的內存空間,他們倆之間沒有任何關係,所以打印的還是1.
2 : 如果參數是引用數據類型(類,數組,接口),那麼傳的是也是變量的值,例如: Point param = new Point(); 那麼傳過去的是point 這個變量的值 ,而不是說Point 這個對象!而point 這個變量的值,其實就是Point 對象在內存中的地址(也叫引用)!
public class ReferenceType {
public void changePoint(Point point) {
point.x = 5;
point.y = 6;
}
public void changeReference(Point point) {
point = null;
}
public void testPassByStirng(String param) {
param = "newValue";
}
public static void main(String[] args) {
int a = 1;
Point point = new Point(1, 2);
ReferenceType test = new ReferenceType();
test.changePoint(point);
System.out.println(point.x); // 5 而不是 1
System.out.println(point.y); // 6 而不是 2
test.changeReference(point); // 調用這個後,下面是否會報空指針呢?
int x = point.x; // 不會
System.out.println("x 的值是 " + x );
String param = "value";
test.testPassByStirng(param);
System.out.println(param); // 是value ,而不是 newValue
}
}
class Point {
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
在java 中,訪問對象是通過指向對象的引用來操作的,而一個對象可以被多個引用所指向,無論其中哪個引用對這個對象的內容進行修改,它都會影響到另外一個引用,雖然引用有多個,但對象卻只有一個!
changePoint 方法被調用時,你把main 方法中的Point 對象的引用point 傳給了changePoint的參數point,此時,這個point 引用也指向了main 方法中的Point 對象(new 出來的),而你在這個方法中,用point 這個引用對Point 對象(new 出來的)的內容進行了修改(point.x = 5;point.y = 6;),因爲它們指向的是同一個Point 對象(new 出來的),所以,當方法執行完後,這個修改會反映到這個對象上,而此時,你再打印出Point 對象的x,y 的值,都是被改變後的值! 即不再是1和2,而是5與6
小結:
在java 中,方法參數的傳遞永遠都是傳值,而這個值,對於基本數據類型,值 就是你賦給變量的那個值,而對於引用數據類型,這個值是對象的引用,而不是這個對象本身.