java方法調用參數
Ⅰ java調用參數是怎麼理解的
在方法調用時,需要根據方法聲明傳入適當的參數,通過每次調用方法時傳參,極大的增強
了方法的統一性,避免了方法內部功能代碼的重復。但是在實際傳遞參數時,如果在方法內部修改了
參數的值,則調用時使用的變數是否發生改變呢?
請看如下代碼:
public class TransferValueDemo
{
public static void main(String[] args)
{
int m = 10;
int[] a = {1,2,34};
test(m,a);
System.out.println(m);
System.out.println(a[0]);
}
public static void test(int n,int[] t)
{
n = 0;
t[0] = 123;
}
}
執行該程序以後,程序的輸出結果是:10 123。則在調用test方法時,同樣都是傳入參數,為
什麼變數m的值未改變,而a[0]的值發生了改變呢?下面就來說明該問題。
在參數傳遞時,一般存在兩種參數傳遞的規則,在Java語言中也是這樣,這兩種方式依次是:
按值傳遞(by value)
按值傳遞指每次傳遞參數時,把參數的原始數值拷貝一份新的,把新拷貝出來的數值傳遞到方法內部
,在方法內部修改時,則修改的時拷貝出來的值,而原始的值不發生改變。
說明:使用該方式傳遞的參數,參數原始的值不發生改變。
按址傳遞(by address)
按址傳遞指每次傳遞參數時,把參數在內存中的存儲地址傳遞到方法內部,在方法內部通過存儲地址
改變對應存儲區域的內容。由於在內存中固定地址的值只有一個,所以當方法內部修改了參數的值以
後,參數原始的值發生改變。
說明:使用該方式傳遞的參數,在方法內部修改參數的值時,參數原始的值也發生改變。
在Java語言中,對於那些數據類型是按值傳遞,那些數據類型是按址傳遞都作出了硬性規定,
如下所示:
按值傳遞的數據類型:八種基本數據類型和String(這樣理解可以,但是事實上String也是傳遞的地
址,只是string對象和其他對象是不同的,string對象是不能被改變的,內容改變就會產生新對象。
那麼StringBuffer就可以了,但只是改變其內容。不能改變外部變數所指向的內存地址。關於String
的特殊性見本博客的String類深入解析)。
按址傳遞的數據類型:除String以外的所有復合數據類型,包括數組、類和介面
按照這里的語法規則,則上面的代碼中變數m的類型是int,屬於按值傳遞,所以在方法內部修改參數
的值時m的值不發生改變,而a的類型是數組,屬於按址傳遞,所以在方法內部修改參數的值時,原始
的值發生了改變。
按值傳遞和按址傳遞在實際使用時,需要小心,特別是在方法內部需要修改參數的值時。有些時候,
對於按值傳遞的參數需要修改參數的值,或者按址傳遞時,不想修改參數的值,下面是實現這兩種方
式時的示例代碼。
按值傳遞時通過返回值修改參數的值:
public class TransferValueDemo1
{
public static void main(String[] args)
{
int m = 10;
m = test1(m); //手動賦值
System.out.println(m);
}
public static int test1(int n)
{
n = 15;
return n;
}
}
在該示例代碼中,通過把修改以後的參數n的值返回,來為變數m賦值,強制修改按值傳遞
參數的值,從而達到修正參數值的目的。
按址傳遞時通過重新生成變數避免修改參數的值:
public class TransferValueDemo2
{
public static void main(String[] args)
{
int[] a = {1,2,3};
test2(a);
System.out.println(a[0]);
}
public static void test2(int[] m)
{
int[] n = new int[m.length];
for(int i = 0;i < m.length;i++)
{
n[i] = m[i];
}
n[0] = 10;
}
}
在該示例代碼中,通過在方法內部創新創建一個數組,並且把傳入數組中每個參數的值都
賦值給新創建的數組,從而實現復制數組內容,然後再修改復制後數組中的值時,原來的參數內容就
不發生改變了。
這里系統介紹了Java語言中參數傳遞的規則,深刻理解這些規則將可以更加靈活的進行程
序設計。例如使用復合數據類型按址傳遞的特性可以很方便的實現多參數的返回,代碼示例如下:
public int test3(int[] m,int[] n){……}
則該方法中,實際上返回了三種值,一個int的返回值,數組m的值,數組n的值,這只是參
數傳遞的一種基本使用,在JDK提供的API文檔中也大量的存在該方法。
當是對象時,方法取得的是引用的。swap(obj a,obj b)
調用是swap(c,d),就是對象a,b的引用進行了復制。引用a和c都指向同一對象,引用b和d都指向同
一對象。如果Integer有setValue方法沒有問題,但可惜沒有,用int t=p.intValue能取得對象的
值,但還是不能交換。如果創建新對象,影響的只是c和d,不會影響a,b。
注意JAVA和VC的區別,JAVA沒有指針,因此在無論方法中的形參怎樣變化,方法外的實參不受影響。
(這句話也不完全對)
Ⅱ java怎麼調用帶參數構造函數
1
如果在子類中調用
,那麼先new
一個參數所在類型的對象a,即
A
a
=
new
A(),然後在子類中用super(a)就可以調用父類的帶類參數構造方法。
2
如果在其他類中調用,那麼也需要先new
一個參數所在類型的對象a,即
A
a=new
A();,然後new調用類的的時候把參數傳進去就可以了,B
b
=
new
B(a)。
Ⅲ 在java中有一個方法調用了很多個方法怎麼用參數控制調用其中的任何一個方法
import java.util.concurrent.Callable; public class CallableUse { public static void main(String... args) { // final int num = 100770; or int num = 100770; // 使用匿名的內部類, 如果需要傳遞參數可能需要將變數轉換成final: try { callMethod(100, new Callable<Integer>() { public Integer call() { return needOperation(num); } }); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } public static int needOperation(int param) { // do something param = 999; return param; } public static void callMethod(int i, Callable<Integer> myFunc) { // do something try { System.out.println(myFunc.call() ); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Ⅳ 怎樣調用java中有參數的方法
一個方法中的參數是局部變數,只能在本方法內部使用。如果非要在別的方法中使用,可以將你在方法1中輸入的整數作為方法1的返回值,在方法2中調用方法1,間接調用輸入的整數。
public int method1(){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
return n;
}
public void method2(){
int j = this.method1(); //調用方法1中的整數
}
Ⅳ java 方法 傳參
要是想傳字面量的話 就這樣
public class D {
public static void main(String[] args) throws Exception {
byte a = 45;
t(a);
t((byte)45);
}
public static void t(byte a) {
System.out.println(a);
}
}
正確的傳參方式
Ⅵ JAVA方法的調用帶參數的
首先你的getFormatDate(String format)需要一個String類型的參數,但你又不想傳遞一個String類型的,你就可以寫一個null,表示空對象,其實這方法的目的就是動態創建解析日期的格式,你可以這樣:
(Stringformat)throwsException{
Datetoday=newDate();
SimpleDateFormatsimple=newSimpleDateFormat(format);
System.out.println(simple.format(today));
returnsimple.format(today);//返回格式化後的字元串
}
Ⅶ Java方法參數是引用調用還是值調用
Java中方法是值調用還是引用調用取決於方法中參數的類型。Java基本數據類型的參數為值調用,其他的數組、自定義的類,這幾種類型為引用類型,
String類特殊:
當String變數定義時這樣定義:String name = "張三";,這樣的定義參數的方法為值傳遞。
Ⅷ java中怎麼從一個方法中調用另一個方法中的參數
一個方法中的參數是局部變數,只能在本方法內部使用。
非要在別的方法中使用,可以將你在方法1中輸入的整數作為方法1的返回值,在方法2中調用方法1,間接調用輸入的整數。
Ⅸ JAVA主類如何調用其他類的含參數的方法,新人求教-,·
1如果在子類中調用,那麼先new一個參數所在類型的對象a,即Aa=newA(),然後在子類中用super(a)就可以調用父類的帶類參數構造方法。2如果在其他類中調用,那麼也需要先new一個參數所在類型的對象a,即Aa=newA();,然後new調用類的的時候把參數傳進去就可以了,Bb=newB(a)。