方法的形式參數---(基本數據類型和引用數據類型作爲形參)

方法的形式參數:

形參:方法聲明時,方法小括號內的參數
實參:調用方法時,實際傳入參數的值

  • 規則: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 中,方法參數的傳遞永遠都是傳值,而這個值,對於基本數據類型,值 就是你賦給變量的那個值,而對於引用數據類型,這個值是對象的引用,而不是這個對象本身.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章