1. java 中實參和形參的區別
形參和實參的特點
1、形參變數只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參有在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變數。
2、實參可以是常量、變數、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值。
3、實參和形參在數量上,類型上、順序上應嚴格一致,否則就會發生類型不匹配的錯誤。
4、在一般傳值調用的機制中只能把實參傳送給形參,而不能把形參的值反向地傳送給實參。因此在函數調用過程中,形參值發生改變,而實參中的值不會變化。而在引用調用的機制當中是將實參引用的地址傳遞給了形參,所以任何發生在形參上的改變實際上也發生在實參變數上
2. Java 值傳遞可以在方法內修改實參的值嗎
不可以, 既然是值傳遞,那麼在調用的時候,就已經完成了從實參到形參的復制,他們是兩個完全不同的對象,只是值相同而已,我們沒法通過形參去達到修改實參的目的,如果你喜歡,那麼可以採用引用形式的形參。這個問題之前我也問過遠標java導師,記得是這樣回復我的。希望能幫助到你!
3. Java中的形參和實參的區別以及傳值調用和傳
1.形參:用來接收調用該方法時傳遞的參數。只有在被調用的時候才分配內存空間,一旦調用結束,就釋放內存空間。因此僅僅在方法內有效。
2.實參:傳遞給被調用方法的值,預先創建並賦予確定值。
3.傳值調用:傳值調用中傳遞的參數為基本數據類型,參數視為形參。
4.傳引用調用:傳引用調用中,如果傳遞的參數是引用數據類型,參數視為實參。在調用的過程中,將實參的地址傳遞給了形參,形參上的改變都發生在實參上。
案例分析:
1.基礎數據類型(傳值調用)
傳值,方法不會改變實參的值。
2.引用數據類型(引用調用)
傳引用,方法體內改變形參引用,不會改變實參的引用,但有可能改變實參對象的屬性值。
舉兩個例子:
(1)方法體內改變形參引用,但不會改變實參引用 ,實參值不變。
publicclassTestFun2{
publicstaticvoidtestStr(Stringstr){
str="hello";//型參指向字元串「hello」
}
publicstaticvoidmain(String[]args){
Strings="1";
TestFun2.testStr(s);
System.out.println("s="+s);//實參s引用沒變,值也不變
}
}
執行結果列印:s=1
(2)方法體內,通過引用改變了實際參數對象的內容,注意是「內容」,引用還是不變的。
publicclassTestFun4{
(StringBuffersb){
sb.append("java");//改變了實參的內容
}
publicstaticvoidmain(String[]args){
StringBuffersb=newStringBuffer("my");
newTestFun4().testStringBuffer(sb);
System.out.println("sb="+sb.toString());//內容變化了
}
}
執行結果,列印:sb=my java 。
所以比較參數是String和StringBuffer 的兩個例子就會理解什麼是「改變實參對象內容」了。
總結:
1.java的基本數據類型是傳值調用,對象引用類型是傳引用。
2.當傳值調用時,改變的是形參的值,並沒有改變實參的值,實參的值可以傳遞給形參,但是,這個傳遞是單向的,形參不能傳遞回實參。
3.當引用調用時,如果參數是對象,無論對對象做了何種操作,都不會改變實參對象的引用,但是如果改變了對象的內容,就會改變實參對象的內容。
4. java中如何使形參改變實參
1.形參變數只有在被調用時才分配內存單元,在調用結束時, 即刻釋放所分配的內存單元。因此,形參只有在函數內部有效。 函數調用結束返回主調函數後則不能再使用該形參變數。
2.實參可以是常量、變數、表達式、函數等, 無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。
3.實參和形參在數量上,類型上,順序上應嚴格一致, 否則會發生「類型不匹配」的錯誤。
5. Java方法的形參是局部變數,不改變實際參數的值。
形參參考變數的分類可分為以下兩大類(討論范圍:形參)
Primitive Formal Parameter(初始數據型,內建型-簡單理解就是有前綴byte\short\int\long\float\double\char\boolean完全枚舉的標識符,即我們通常所說的基本類型,不屬於「類」,指向棧內存地址)
Reference Formal Parameter(引用型-簡單理解就是無上述前綴的標識符,注意String類型非Primitive Data Type,屬於「類」,指向堆內存地址)
PS:該死的是,String類型實例化創建對象並將對象引用賦值給一個變數時,竟然可以不用關鍵字new(跟Primitive 數據類型的賦予字面值方式在直觀形式上幾乎一致),故容易產生相關誤區。
6. 形參不能改變實參,為什麼在用指針傳遞數值的時候又可以改變呢
形參其實是在把實參傳遞給子函數的時候定義了一個新的變數,但是這個變數的值和實參相等
所以在子函數里
無論怎麼修改都不會影響到調用它的函數的實參的值
在用指針做參數的時候
因為傳遞的不是值本身,而是它所對應的地址,我們改變值的時候是改變那個地址里的值
所以
傳遞指針的話
就能改變值了
如果你希望在子函數里可以修改調用它的函數的值的話你可以使用引用函數
就比如
#include<stdio.h>
void
fun(int
&x)
x
=
x
+
1;
void
main()
{
int
a
=
5;
fun(a);
printf("%d",a);
}
就是在參數前加了一個&就行了
7. 形式參數什麼時候可以改變實參給個例子。
形參無法直接改變實參,只有通過指針來獲得實參的存儲地址。
然後通過地址來間接地對地址中實參的值進行操作。例如:
#include<stdio.h>
fun(int *c)
{
*c=*c+1;
}
main()
{
int a=1;
fun(&a);
printf("%d",a);
}
本例中主函數 main() 將 a 的地址賦給了自定義函數 fun()
然後自定義函數 fun() 通過對取 a 的地址中的值並加 1
最後又存儲到 a 的地址中,實現了對實參 a 的改變!