java方法的參數傳遞參數
『壹』 java基礎問題,到底是值傳遞還是引用傳遞
java中方法參數傳遞方式是按值傳遞。所謂值傳遞,就是將實際參數值的副本(復製品)傳入方法內,而自己本身不會受到任何影響。
如果參數是基本類型,傳遞的是基本類型的字面量值的拷貝。
『貳』 用Java方法的參數怎麼傳遞
在 Java 應用程序中永遠不會傳遞對象,而只傳遞對象引用。因此是按引用傳遞對象。Java應用程序按引用傳遞對象這一事實並不意味著 Java 應用程序按引用傳遞參數。參數可以是對象引用,而 Java 應用程序是按值傳遞對象引用的。
『叄』 java中參數傳遞,按引用傳遞
Java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。另外,Java 還為每個原始類型提供了封裝類(Wrapper)。如果需要一個整型變數,是使用基本的 int 型呢,還是使用 Integer 類的一個對象呢?如果需要聲明一個布爾類型,是使用基本的 boolean,還是使用 Boolean 類的一個對象呢?本文可幫助您作出決定。
下表列出了原始類型以及它們的對象封裝類。
原始類型 封裝類
=================
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
引用類型和原始類型的行為完全不同,並且它們具有不同的語義。例如,假定一個方法中有兩個局部變數,一個變數為 int 原始類型,另一個變數是對一個 Integer 對象的對象引用:
int i = 5; // 原始類型
Integer j = new Integer(10); // 對象引用
這兩個變數都存儲在局部變數表中,並且都是在 Java 操作數堆棧中操作的,但對它們的表示卻完全不同。(本文中以下部分將用通用術語堆棧代替操作數堆棧或局部變數表。)原始埋碰類型 int 和對象引用各占堆棧的 32 位。(要表示一個 int 或一個對象引用,Java 虛擬機實現至少需要使用襲液猜 32 位存儲。)Integer 對象的堆棧項並不是對象本身,而是一個對象引用。
Java 中的所有對象都要通過對象引用訪問。對象引用是指向對象存儲所在堆中的某個區域的指針。當聲明一個原始類型時,就為類型本身聲明了存儲。前面的兩行代碼表示如下:
引用類型和原始類型具有不同的特徵和用法,它們包括:大小和速度問題,這種類拍型型以哪種類型的數據結構存儲,當引用類型和原始類型用作某個類的實例數據時所指定的預設值。對象引用實例變數的預設值為 null,而原始類型實例變數的預設值與它們的類型有關。
許多程序的代碼將同時包含原始類型以及它們的對象封裝。當檢查它們是否相等時,同時使用這兩種類型並了解它們如何正確相互作用和共存將成為問題。程序員必須了解這兩種類型是如何工作和相互作用的,以避免代碼出錯。
例如,不能對原始類型調用方法,但可以對對象調用方法:
int j = 5;
j.hashCode(); // 錯誤
//...
Integer i = new Integer(5);
i.hashCode(); // 正確
使用原始類型無須調用 new,也無須創建對象。這節省了時間和空間。混合使用原始類型和對象也可能導致與賦值有關的意外結果。看起來沒有錯誤的代碼可能無法完成您希望做的工作。例如:
import java.awt.Point;
class Assign
{
public static void main(String args[])
{
int a = 1;
int b = 2;
Point x = new Point(0,0);
Point y = new Point(1,1); //1
System.out.println("a is " + a);
System.out.println("b is " + b);
System.out.println("x is " + x);
System.out.println("y is " + y);
System.out.println("Performing assignment and " +
"setLocation...");
a = b;
a++;
x = y; //2
x.setLocation(5,5); //3
System.out.println("a is "+a);
System.out.println("b is "+b);
System.out.println("x is "+x);
System.out.println("y is "+y);
}
}
這段代碼生成以下輸出:
a is 1
b is 2
x is java.awt.Point[x=0,y=0]
y is java.awt.Point[x=1,y=1]
Performing assignment and setLocation...
a is 3
b is 2
x is java.awt.Point[x=5,y=5]
y is java.awt.Point[x=5,y=5]
修改整數 a 和 b 的結果沒什麼意外的地方。b 的值被賦予整型變數 a,結果 a 的值增加了 1。這一輸出反映了我們希望發生的情況。但是,令人感到意外的,是在賦值並調用 setLocation之後 x 和 y 對象的輸出。我們在完成 x = y 賦值之後特意對 x 調用了 setLocation,x 和 y 的值怎麼會相同呢?我們畢竟將 y 賦予 x,然後更改了 x,這與我們對整數 a 和 b 進行的操作沒什麼不同。
這種混淆是由原始類型和對象的使用造成的。賦值對這兩種類型所起的作用沒什麼不同。但它可能看起來所有不同。賦值使等號 (=) 左邊的值等於右邊的值。這一點對於原始類型(如前面的 int a 和 b)是顯而易見的。對於非原始類型(如 Point 對象),賦值修改的是對象引用,而不是對象本身。因此,在語句
x = y;
之後,x 等於 y。換句話說,因為 x 和 y 是對象引用,它們現在引用同一個對象。因此,對 x 所作的任何更改也會更改 y。下面是 //1 處的代碼執行以後的情況:
執行 //2 處的賦值以後情況如下:
當在 //3 處調用 setLocation 時,這一方法是對 x 引用的對象執行的。因為 x 引用的 Point 對象也正是 y 所引用的對象,所以我們現在得到以下結果:
因為 x 和 y 引用同一個對象,所以對 x 執行的所有方法與對 y 執行的方法都作用於同一個對象。
區分引用類型和原始類型並理解引用的語義是很重要的。若做不到這一點,則會使編寫的代碼無法完成預定工作。
『肆』 java方法參數怎麼引用傳遞boolean
Java中的參數傳遞:分為值傳遞和引用傳遞
但本質上,Java中只有值傳遞。引用傳遞,其實可以理解為傳的是類似指針的東西。
值傳遞就是把基本變數的值拷貝一份,傳遞這個拷貝。引用傳遞則是傳遞的引用的地址,也就是該變數在內存空間的地址。
1.值傳遞
只有基本數據類型採用值傳遞,特點是傳遞的是值的拷貝,傳遞完後兩者就沒有關系了。也就是說方法內和方法外的值互不相干
基本數據類型:
·整型:int,long,byte,short
浮點型:float,double
字元型:char
布爾型:boolean
註:8種基本數據類型以外的數據類型都為引用類型。
2.引用傳遞
指的是在方法調用時,傳遞的參數是按引用進行傳遞,其實傳遞的引用的地址,也就是變數所對應的內存空間的地址。
傳遞的是一個拷貝,即副本。也就是說,對於一個參數傳遞,存在兩個地址指向同一個內存空間。這里我們可以用內存分配示意圖來體現
3.String類型傳遞
先說結論,String類型傳遞與基本數據類型的傳遞效果相似。
說明:
String類對象一旦創建,其內容不可更改:
String類的所有方法都不會改變String類對象內容,要改變String類對象的值就必須創建一個新的String對象。
也就是說,當進行參數傳遞時,如果方法內對String類對象的值進行了修改,那麼實際上是創建了一個新的String類對象,然後讓原來的變數指向它而已。但是這個「原來的變數」是一份拷貝副本,只是一開始創建的時候與主方法中的傳遞的值相同而已,現在改變之後,兩者就毫無關系了。
『伍』 java 方法可以傳入多少個參數
java的方法可以動態傳入參數,比如methodA(String... values),它相當於傳進入一個values的數組,因此在你的內存支持的情況下,參數個數可以是無限個的。
『陸』 Java參數傳遞
Java的方法參數傳遞都是值傳遞。這個問題需要樓主慢慢理解,如果基礎薄弱(C、C++基礎弱)就記住就好。如果基礎好可以從內存角度理解。
從語法和簡單層面理解:str是一個String類型的對象,傳遞給changeStr方法,傳遞的是str的引用內容,方法內的changeStr(String value),value變數和str指向了同一個對象,但是value重新賦值後,它的指向改變了,但是str的指向不會發生,所以str的輸出還是「Hello」,而changeObjValue方法傳入的TEST的對象pt給changeObjValue(TEST ref),ref變數和pt變數指向了同一對象,之後通過改變了對象的內容,pt變數的指向沒變,但是執行的對象的變數變了。所以pt的ptValue值變了。
進一步理解,Java對字元串進行了特殊處理,因為字元串這種數據類型太常用了,為了節省內容提高效率。Java把字元串放入了常量池,所以我們沒辦法在運行時修改一個字元串對象的內容。也就是對value變數的賦值操作是重寫建立了一個對象。樓主可以測試經典的java String的代碼:
Stringa="a";
Stringb="a";
Stringc=newString("a");
Stringd=newString("a");
System.out.println(a==b);
System.out.println(a==c);
System.out.println(b==c);
System.out.println(d==c);
再深入,Java沒有C和C++的指針概念,可以粗暴的理解Java的引用是一種特殊的指針(實際上Java盡量把程序猿從指針中解放出來,或者說避免直接操作內存對象)。有一種不負責的說法:Java的基本類型傳遞傳遞的是值,也就是值的副本,引用類型傳遞的時引用。但是要注意String對象的內容不可變,而且傳遞的引用指向不可變。運行時Java的局部變數在棧空間中(線程私有),對象在堆內存中(線程公有),changeStr方法相當於在堆內存中又開辟了一塊兒空間重寫分配了一個對象,但是str沒有指向這個新new出來的對象。而changeObjValue方法修改的pt指向的對象的內容也就是修改的是堆內存的數據,ref和pt指向的是一塊兒內存。所以pt的對象數據會變化。