Java中方法呼叫引數傳遞的方式是傳值,儘管傳的是引用的值而不是物件的值。(Does Java pass by reference or pass by value?)
原文地址:http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
在Java中,所有的物件變數都是引用,Java通過引用來管理物件。然而在給方法傳參時,Java並沒有使用傳引用的方式,而是採用了傳值的方式。例如下面的badSwap()方法:
public void badSwap(int var1, int var2)
{
int temp = var1;
var1 = var2;
var2 = temp;
}
當badSwap方法時,原有的var1和var2的值並不會發生變化。即使我們用其它Object型別來替代int,也不會有變化,因為Java在傳遞引用時也是採用傳值的方式。(譯者注:這裡是關鍵,全文的核心是:1. Java中物件變數是引用 2. Java中方法是傳值的 3. 傳方法中引數時,傳遞的是引用的值)
如果譯者的註釋沒看明白,沒關係,看看下面的程式碼:
執行main()的輸出如下:public void tricky(Point arg1, Point arg2) { arg1.x = 100; arg1.y = 100; Point temp = arg1; arg1 = arg2; arg2 = temp; } public static void main(String [] args) { Point pnt1 = new Point(0,0); Point pnt2 = new Point(0,0); System.out.println("X: " + pnt1.x + " Y: " +pnt1.y); System.out.println("X: " + pnt2.x + " Y: " +pnt2.y); System.out.println(" "); tricky(pnt1,pnt2); System.out.println("X: " + pnt1.x + " Y:" + pnt1.y); System.out.println("X: " + pnt2.x + " Y: " +pnt2.y); }
X: 0 Y: 0
X: 0 Y: 0
X: 100 Y: 100
X: 0 Y: 0這個方法成功地改變了pnt1的值,但pnt1和pnt2的交換卻失敗了!這是Java引數傳遞機制裡最讓人迷惑的地方。在main()中,pnt1和pnt2是Point物件的引用,當將pnt1和pnt2傳遞給tricky()時,Java使用的正是傳值的方式,將這兩個引用的傳給了arg1和arg2。也就是說arg1和arg2正是pnt1和pnt2的複製,他們所指向的物件是相同的。詳情可見下面的圖示:
圖 1. 在作為引數傳遞後,物件至少有兩個引用指向自己
Java copies and passes the reference
在main()中,引用被複制並以傳值的方式進行傳遞,物件本身並不會被傳遞。因此,tricky()方法中pnt1所指向的物件發生了變化。因為傳遞的是引用的複製,因此引用的交換既不能引起物件的交換,更不會使原始引用發生變化。如圖2所示,tricky()交換了arg1與arg2,但不會影響pnt1和pnt2。因此若想交換原始引用pnt1和pnt2,那麼不能通過呼叫方法的方式來實現。

圖 2. 只有作為引數的引用發生了交換,但原始引用並沒有變化
總結:
1. Java中物件變數是引用
2. Java中方法是傳值的
3. 傳方法中引數時,傳遞的是引用的值
原文如下:
Java does manipulate objects by reference, and all object variables are references. However, Java doesn't pass method arguments by reference; it passes them by value.
Take the badSwap() method for example:
public void badSwap(int var1, int var2)
{
int temp = var1;
var1 = var2;
var2 = temp;
}When badSwap() returns, the variables passed as arguments will still hold their original values. The method will also fail if we change the arguments type fromint toObject, since Java passes object references by value
as well. Now, here is where it gets tricky:
public void tricky(Point arg1, Point arg2)
{
arg1.x = 100;
arg1.y = 100;
Point temp = arg1;
arg1 = arg2;
arg2 = temp;
}
public static void main(String [] args)
{
Point pnt1 = new Point(0,0);
Point pnt2 = new Point(0,0);
System.out.println("X: " + pnt1.x + " Y: " +pnt1.y);
System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
System.out.println(" ");
tricky(pnt1,pnt2);
System.out.println("X: " + pnt1.x + " Y:" + pnt1.y);
System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
}If we execute this main() method, we see the following output:
X: 0 Y: 0
X: 0 Y: 0
X: 100 Y: 100
X: 0 Y: 0The method successfully alters the value of pnt1, even though it is passed by value; however, a swap ofpnt1 andpnt2 fails! This is the major source of confusion. In themain() method,pnt1 andpnt2
are nothing more than object references. When you passpnt1 andpnt2 to thetricky() method, Java passes the references by value just like any other parameter. This means the references passed to the method are actuallycopies
of the original references. Figure 1 below shows two references pointing to the same object after Java passes an object to a method.

Figure 1. After being passed to a method, an object will have at least two references
Java copies and passes the reference by value, not the object. Thus, method manipulation will alter the objects, since the references point to the original objects. But since the references are copies, swaps will fail. As Figure 2 illustrates, the method references swap, but not the original references. Unfortunately, after a method call, you are left with only the unswapped original references. For a swap to succeed outside of the method call, we need to swap the original references, not the copies.

Figure 2. Only the method references are swapped, not the original ones
About the author
Tony Sintes is a principal consultant at BroadVision. Tony, a Sun-certified Java 1.1 programmer and Java 2 developer, has worked with Java since 1997.O'Reilly'sJava in a Nutshell by David Flanagan (seeResources) puts it best: "Java manipulates objects 'by reference,' but it passes object references to methods 'by value.'" As a result, you cannot write a standard swap method to swap objects.相關推薦
Java中方法呼叫引數傳遞的方式是傳值,儘管傳的是引用的值而不是物件的值。(Does Java pass by reference or pass by value?)
原文地址:http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html 在Java中,所有的物件變數都是引用,Java通過引用來管理物件。然而在給方法傳參時,Java並沒有使用傳引用的方式,而是
java中String型別引數傳遞問題
先看程式碼: public class Test1 { public static void main(String[] args) { String str = new String("s
在controller中通過ModelAndView返回到頁面的值,在jsp頁面怎麼取不到值呢?
首先先講下 el表示式和jstl EL(Expression Language)是一種表示式語言,主要用於查詢作用域中的資料,然後對它們執行一些簡單的操作,用於對jsp標籤的屬性賦值。它不是程式語言。JSTL( JSP Standard Tag Library)是JSP標準 標籤庫,由
java方法之間引數傳遞(java 程式設計語言對物件採用的是引用呼叫嗎)
java方法之間引數傳遞 基礎型別值傳遞 public static void tripleValue(double x){ x = 3*x; } double value = 10; tripleValue(value); System.out.prin
Java中引數傳遞方式
java語言方法中引數的傳遞全部都是值傳遞,即只傳遞引數的副本。 所以當引數為基本資料型別時,方法不能改變實參,而只能改變其副本; 當引數為物件型別時,其引數為物件引用(地址),對物件的操作直接影響實參,而形參(地址)無法改變,表現為: args1 = new Object();//
論 java 中的 方法的引數傳遞
1:形參:方法宣告時,方法小括號內的引數 2:實參:呼叫方法時,實際傳入的引數的值 3:規則:java中的引數傳遞機制:值傳遞機制 1)形參是基本資料型別的;將實參的值傳遞給形參的基本資料型別的變數 public class PassObject{ public
Java中方法引數的傳遞機制
值傳遞是對基本型變數而言的,傳遞的是該變數的一個副本,改變副本不影響原變數. 引用傳遞一般是對於物件型變數而言的,傳遞的是該物件地址的一個副本, 並不是原物件本身 。 一般認為,java內的基礎型別資料傳遞都是值傳遞. java中例項物件的傳遞是引用傳遞 值傳遞的時候,
java中 方法引數是值傳遞還是引用傳遞 ?
物件是引用傳遞,原始型別資料是值傳遞 實際上把方法引數中物件引數看做是物件的引用,那麼物件引用也是值傳遞 它符合值傳遞的一切的特徵,即我們可以通過物件引用的引數去改變它所指向物件的屬性,但我們卻無法改變這個物件引用引數所指向的物件。
java方法引數傳遞方式--按值傳遞、引用傳遞
java的方法引數傳遞方式有兩種,按值傳遞和引用傳遞 1.按值傳遞 引數型別是int,long等基本資料型別(八大基本資料型別),引數傳遞的過程採用值拷貝的方式 程式碼片段1: public class Test { public static void m
使用者程式函式呼叫過程中的引數傳遞方式
在C語言中,在呼叫一個函式func()時,如果func()接受不超過4個的引數,則呼叫者直接將實參從左到右依次賦值給r0, r1, r2, r3暫存器(如果是指標則傳入地址),然後呼叫func()。 進入func()函式後,func()將自己的棧緊接著call
JAVA本地方法呼叫(2)陣列引數傳遞
JAVA可以把陣列作為引數傳遞給本地方法,在本地方法中可以訪問陣列中的元素。 不過,在本地方法卻不能直接訪問傳進來的陣列,需要進行一定的轉換。舉例說明: 1、建立 JAVA 類: package test; public class Test { publi
java 之方法呼叫 方法傳參 值傳遞還是引用傳遞位元組碼
/*Java中的引數傳遞方式到底是引用傳遞還是值傳遞?java核心技術卷I裡有一個結 論我覺得挺有意思的:java中沒有引用傳遞,只有值傳遞 首先看定義: 值傳遞,是指方法接收的是呼叫者提供的值 引用傳遞,是指方法接收的是呼叫者提供的變數地址 事實上,Java中方法引
java方法引數傳遞方式只有----值傳遞!
在通常的說法中,方法引數的傳遞分為兩種,值傳遞和引用傳遞,值傳遞是指將實際引數複製一份傳遞到方法中, 在方法中的改動將不會影響到實際引數本身,而引用傳遞則是指傳遞的是實際引數本身,在方法中的改動將會影響到實 際引數本身。但是,在java中只有值傳遞,沒有引用傳遞!那麼,為什麼當方法引數是基本資料型別時表現
Java中不定項引數(可變引數)的作用和使用方式
引言: 我們在編寫方法的過程中,可能會遇見一個方法有不確定引數個數的情況。一般我們會用方法過載來解決問題: //方法過載,解決引數個數不確定問題 public void method(); public void method(int i); public void method(int
JAVA引數傳遞方式 (按值傳遞與引用傳遞區別)
首先要明確的是JAVA中沒有引用傳遞, 全部是按值呼叫 令大家所費解的 當物件引用作為引數時 函式為什麼能修改真實的物件呢?這不是引用傳遞的特徵嗎? 尤其先學習C++再學習JAVA的同學(比如說我自己)會這樣認為, 用白話解釋就是: 引用傳遞指標時, 連函式操作的指
java引數傳遞方式
1.可以通過傳參改變非基本型別物件的屬性、狀態 public class Test { public int b; public static void change(Test test) { test.b*=3; } public static
java中“方法”的呼叫
呼叫“方法” 當需要呼叫方法執行某個操作時,可以先建立類的物件 1、建立物件的語法: 類名 物件名=new 類名(); 2、呼叫物件的語法: 物件名.方法名() 例子如下: 3、 使用物件的屬性:物件名.屬性 //可直接賦值 4、 呼叫帶參方法時,必須保證
【JAVA基礎】java繼承鏈中方法呼叫優先順序.順序:this.show(object)>super.show(object)>this.show((super)object)>super.show(
先上程式碼: public class ExtendsTest { public static void main(String args[]){ A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); S
java中可變長引數的使用方法
Java中可變長引數的使用及注意事項 1. 可變長引數的定義 使用…表示可變長引數,例如 print(String... args){ ... } 在具有可變長引數的方法中可以把引數當成陣列使用,例如可以迴圈輸出所有的引數值。 print(
Java中方法的宣告與呼叫
方法中傳遞的引數分為: 1.基本資料型別:如果傳遞的引數是基本資料型別,那麼方法接受到的實際是這個資料的“值拷貝”(值副本)。也就是說當在方法中改變這個值的大小時,它的作用域只在這個方法中,但實際定義的這個變數的值併為改變。 2.引用資料型別:如果傳遞的引數是引用資料型別,那麼傳過來的就是這個引用引數的副本
