Ⅰ java參數傳遞是值傳遞還是引用傳遞
以下是csdn中查到的一些資料,希望有所幫助
java 傳遞參數的兩種方式:
Java中沒有指針,所以也沒有引用傳遞了,僅僅有值傳遞不過可以通過對象的方式來實現引用傳遞 類似java沒有多繼承 但可以用多次implements 介面實現多繼承的功能
值傳遞:方法調用時,實際參數把它的值傳遞給對應的形式參數,方法執行中形式參數值的改變不影響實際參 數的值。
引用傳遞:也稱為傳地址。方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中相對應的形式參數,在方法執行中,對形式參數的操作實際上就是對實際參數的操作,方法執行中形式參數值的改變將會影響實際參數的值。
a.傳遞值的數據類型:八種基本數據類型和String(這樣理解可以,但是事實上String也是傳遞的地址,只是string對象和其他對象是不同的,string對象是不能被改變的,內容改變就會產生新對象。那麼StringBuffer就可以了,但只是改變其內容。不能改變外部變數所指向的內存地址)。
b.傳遞地址值的數據類型:除String以外的所有復合數據類型,包括數組、類和介面
值傳遞的例子:
[java]view plain
packagecom.other.test;
publicclassTest{
publicstaticvoidchange(inti,intj){
inttemp=i;
i=j;
j=temp;
}
publicstaticvoidmain(String[]args){
inta=3;
intb=4;
change(a,b);
System.out.println("a="+a);
System.out.println("b="+b);
}
}
輸出的結果是 a=3 b=4,傳遞的值並不會改變原值
引用傳遞的例子:(數組)
[java]view plain
packagecom.other.test;
publicclassTest{
publicstaticvoidchange(int[]counts){
counts[0]=6;
System.out.println(counts[0]);
}
publicstaticvoidmain(String[]args){
int[]count={1,2,3,4,5};
change(count);
System.out.println(count[0]);
}
}
輸出結果是6 6 也就是引用的值改變了原來的值
引用傳遞的例子:(對象)
定義一個A對象:
[java]view plain
packagecom.other.test;
publicclassA{
inti=0;
}
[java]view plain
packagecom.other.test;
publicclassTest{
publicstaticvoidadd(Aa){
//a=newA();①
a.i++;
}
publicstaticvoidmain(Stringargs[]){
Aa=newA();
add(a);
System.out.println(a.i);
}
}
看看String的情況:
[java]view plain
packagecom.other.test;
publicclassTest{
Stringstr=newString("old");
char[]ch={'a','b','c'};
publicstaticvoidmain(Stringargs[]){
Testex=newTest();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+"and");
System.out.println(ex.ch);
}
publicvoidchange(Stringstr,charch[]){
str="new";
ch[0]='d';
}
}
( 對象包括對象引用即地址和對象的內容)
String 比較特別,看過String 代碼的都知道, String 是 final的。所以值是不變的。 函數中String對象引用的副本指向了另外一個新String對象,而數組對象引用的副本沒有改變,而是改變對象中數據的內容.
對於對象類型,也就是Object的子類,如果你在方法中修改了它的成員的值,那個修改是生效的,方法調用結束後,它的成員是新的值,但是如果你把它指向一個其它的對象,方法調用結束後,原來對它的引用並沒用指向新的對象。
Java參數,不管是原始類型還是引用類型,傳遞的都是副本(有另外一種說法是傳值,但是說傳副本更好理解吧,傳值通常是相對傳址而言)。
如果參數類型是原始類型,那麼傳過來的就是這個參數的一個副本,也就是這個原始參數的值,這個跟之前所談的傳值是一樣的。如果在函數中改變了副本的值不會改變原始的值.
如果參數類型是引用類型,那麼傳過來的就是這個引用參數的副本,這個副本存放的是參數的地址。如果在函數中沒有改變這個副本的地址,而是改變了地址中的值,那麼在函數內的改變會影響到傳入的參數。如果在函數中改變了副本的地址,如new一個,那麼副本就指向了一個新的地址,此時傳入的參數還是指向原來的地址,所以不會改變參數的值。
Ⅱ Java的參數傳遞是值傳遞還是引用傳遞
測試下就知道了
publicstaticvoidmain(String[]args){
inta=1;
Stringstr="abc";
changeValue(a,str);
System.out.println(a);
System.out.println(str);
}
privatestaticvoidchangeValue(inta,Stringstr){
a=2;
str="123";
}
結果:
1
abc
所以是值傳遞
(如果是引用的類,然後又set、get方法就另當別論了)
Ⅲ JAVA基礎問題,到底是值傳遞還是引用傳遞
java中方法參數傳遞方式是按值傳遞。所謂值傳遞,就是將實際參數值的副本(復製品)傳入方法內,而自己本身不會受到任何影響。
如果參數是基本類型,傳遞的是基本類型的字面量值的拷貝。
Ⅳ Java String引用傳遞問題
了解數據在堆棧內存中的存儲,這道問題就可以解了。
1.String對象傳入方法後,str2是局部變數,方法結束之後,局部變數值會在緩沖區中。但是並沒有修改成員變數str1的值,而輸出的仍然是str1的值,"hello"。(局部變數和成員變數是不同的變數,即使名字相同)
2.至於第二個因為類的實例化,對象可以指向該類地址,可以訪問該類的成員變數。對象指向成員變數temp,調用方法tell方法時,傳入的是Ref2對象的地址。該地址可以找到Ref2的成員變數temp。然後把"xueyuan"賦給temp,由此temp的值已經改變,方法調用結束之後,輸出的是Ref2類的已經改變值的成員變數
Ⅳ java中參數傳遞方式
當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這里到底是值傳遞還是引用傳遞? 是值傳遞。Java 編程語言只由值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。
Ⅵ java中的引用傳遞是什麼
值傳遞:(形式參數類型是基本數據類型):方法調用時,實際參數把它的值傳遞給對應的形式參數,形式參數只是用實際參數的值初始化自己的存儲單元內容,是兩個不同的存儲單元,所以方法執行中形式參數值的改變不影響實際參數的值。
引用傳遞:(形式參數類型是引用數據類型參數):也稱為傳地址。方法調用時,實際參數是對象(或數組),這時實際參數與形式參數指向同一個地址,在方法執行中,對形式參數的操作實際上就是對實際參數的操作,這個結果在方法結束後被保留了下來,所以方法執行中形式參數的改變將會影響實際參數。
Ⅶ java類方法如何實現引用傳遞和值傳遞
參數是基本類型就是傳值,傳對象就是引用傳遞。
swap(Integer x, Integer y)可以傳遞引用,但是沒辦法實現交換。這跟Integer的實現方式有關。所以不是引用傳遞就一定能改變外面的值。
下面是引用傳遞,交換的情況,又臭又長。
classUntitled{
intneedFix;
publicstaticvoidswap(Untitledx,Untitledy){
inttemp=x.needFix;
x.needFix=y.needFix;
y.needFix=temp;
}
publicstaticvoidmain(String[]args){
Untitle1=newUntitled();
Untitle2=newUntitled();
u1.needFix=3;
u2.needFix=4;
swap(u1,u2);
System.out.println(u1.needFix+","+u2.needFix);
}
}
另外,你可以考慮一下引用傳遞,不過也是一種傳值,java裡面沒有事實上的指針。直接交換引用指向的對象是沒有作用的。
Untitledtemp=x;
x=y;
y=temp;
無效。
Ⅷ Java的參數傳遞是「值傳遞」還是「引用傳遞」
java的數據類型分為基本類型和引用類型
基本類型:byte,short,int,long,char,float,double,boolean
引用類型:類,介面和數組。
基本類型的參數是值傳遞,引用類型的參數是引用傳遞
另外String、Integer、Double、Long……等immutable的類型特殊處理,可以理解為傳值,最後的操作不會修改實參對象
JAVA中值傳遞和引用傳遞
Ⅸ java引用數據類型的傳遞
程序從main開始,創建了一個Change對象c,給c的x對象賦值為20。
接下來是調用fun()方法,將創建的Change對象c,傳遞到fun()方法中。
在fun()方法中,將Change對象c的x屬性賦值為25。
所以,在執行System.out.println("x = "+c.x);這句的時候,輸出的是25。