1. 程式人生 > >java中的引數傳遞 值傳遞,引用傳遞

java中的引數傳遞 值傳遞,引用傳遞

引數是按值而不是按引用傳遞的說明 Java 應用程式有且僅有的一種引數傳遞機制,即按值傳遞。

在 Java 應用程式中永遠不會傳遞物件,而只傳遞物件引用。因此是按引用傳遞物件。Java 應用程式按引用傳遞物件這一事實並不意味著 Java 應用程式按引用傳遞引數。引數可以是物件引用,而 Java 應用程式是按值傳遞物件引用的。

Java 應用程式中的變數可以為以下兩種型別之一:引用型別或基本型別。當作為引數傳遞給一個方法時,處理這兩種型別的方式是相同的。兩種型別都是按值傳遞的;沒有一種按引用傳遞。

按值傳遞和按引用傳遞。按值傳遞意味著當將一個引數傳遞給一個函式時,函式接收的是原始值的一個副本。因此,如果函式修改了該引數,僅改變副本,而原始值保持不變。按引用傳遞意味著當將一個引數傳遞給一個函式時,函式接收的是原始值的記憶體地址,而不是值的副本。因此,如果函式修改了該引數,呼叫程式碼中的原始值也隨之改變。

1、物件是按引用傳遞的

2、Java 應用程式有且僅有的一種引數傳遞機制,即按值傳遞

3、按值傳遞意味著當將一個引數傳遞給一個函式時,函式接收的是原始值的一個副本

4、按引用傳遞意味著當將一個引數傳遞給一個函式時,函式接收的是原始值的記憶體地址,而不是值的副本

首先考試大來看看第一點:物件是按引用傳遞的

  確實,這一點我想大家沒有任何疑問,例如:

  class Test01{
  public static void main(String[] args){
  StringBuffer s= new StringBuffer(“good”);
  StringBuffer s2=s;
  s2.append(” afternoon.”);
  System.out.println(s);
  }
  }

  物件s和s2指向的是記憶體中的同一個地址因此指向的也是同一個物件。
  如何解釋“物件是按引用傳遞的”的呢?
  這裡的意思是進行物件賦值操作是傳遞的是物件的引用,因此物件是按引用傳遞的,有問題嗎?
  程式執行的輸出是:
  
  good afternoon.
  這說明s2和s是同一個物件。
  這裡有一點要澄清的是,這裡的傳物件其實也是傳值,因為物件就是一個指標,這個賦值是指標之間的賦值,因此在java中就將它說成了傳引用。(引用是什麼?不就是地址嗎?地址是什麼,不過就是一個整數值)

  再看看下面的例子:

  class Test02{
  public static void main(String[] args){
  int i=5;
  int i2=i;
  i2=6;
  System.out.println(i);
  }
  }

  程式的結果是什麼?5!!!

  這說明什麼,原始資料型別是按值傳遞的,這個按值傳遞也是指的是進行賦值時的行為下一個問題:Java 應用程式有且僅有的一種引數傳遞機制,即按值傳遞

  class Test03{
  public static void main(String[] args){
  StringBuffer s= new StringBuffer(“good”);
  StringBuffer s2=new StringBuffer(“bad”);
  test(s,s2);
  System.out.println(s);//9
  System.out.println(s2);//10
  }
  
  static void test(StringBuffer s,StringBuffer s2) {
  System.out.println(s);//1
  System.out.println(s2);//2
  s2=s;//3
  s=new StringBuffer(“new”);//4
  System.out.println(s);//5
  System.out.println(s2);//6
  s.append(“hah”);//7
  s2.append(“hah”);//8
  }
  }

  程式的輸出是:

  good
  bad
  new
  good
  goodhah
  bad

  考試大提示: 為什麼輸出是這樣的?

  這裡需要強調的是“引數傳遞機制”,它是與賦值語句時的傳遞機制的不同。

  我們看到1,2處的輸出與我們的預計是完全匹配的

  3將s2指向s,4將s指向一個新的物件

  因此5的輸出列印的是新建立的物件的內容,而6列印的原來的s的內容

  7和8兩個地方修改物件內容,但是9和10的輸出為什麼是那樣的呢?

  Java 應用程式有且僅有的一種引數傳遞機制,即按值傳遞。

在這裡畫了一個圖給大家分析:

這裡寫圖片描述

1.物件就是傳引用

2.原始型別就是傳值

3.String型別因為沒有提供自身修改的函式,每次操作都是新生成一個String物件,所以要特殊對待。可以認為是傳值。

參考:http://www.cnblogs.com/perfy/archive/2012/10/16/2726039.html