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