2016-04-28 253 views
0

我想創建一個方法來增加各種變量的值,這裏是我正在使用的邏輯類型的一個例子,但是當方法完成時,原始變量沒有改變。我需要添加或替換以允許值在方法外更改?如何從一個方法內改變一個變量的值?

static int num = 2; 
static String text = "3"; 

public static void up(int i, String s){ 
    //Debug 
    System.out.println("Before Change"); 
    System.out.println("I: " + i); 
    System.out.println("S: " + s); 
    System.out.println("Num: " + num); 
    System.out.println("Text: " + text); 

    //Code 
    i = i + 3; 
    s = String.valueOf(i); 

    //Debug 
    System.out.println("After Change"); 
    System.out.println("I: " + i); 
    System.out.println("S: " + s); 
    System.out.println("Num: " + num); 
    System.out.println("Text: " + text);    
} 

public static void main(String[] args) {  
    up(num, text); 

    //Debug 
    System.out.println("Out of Scope"); 
    System.out.println("Num: " + num); 
    System.out.println("Text: " + text); 
} 
+1

發生這種情況是因爲變量''i''是您傳入的內容的副本,而不是(原始)變量''num''。原因是java爲原始類型使用了按值調用。 – f1sh

+0

因爲它是一個String對象,所以文本肯定會在函數調用外面得到更新,但是num是int類型的一個原語,它不會被更新到函數之外。 –

+0

@VineetKasat'String'不會像int那樣更新。 –

回答

0

您可以用WrapperClass做到這一點。這是因爲Java像其他人提到的那樣使用Pass By Value。解決方法是創建WrapperClass,如果有多個值。這裏是你如何使用WrapperClass修改類。在使用Corba時,Java框架提供Holder Classes以提供參考語義。

static int num = 2; 
    static String text = "3"; 

    public static void up(WrapperClass w){ 
     //Debug 
     System.out.println("Before Change"); 
     System.out.println("I: " + w.i); 
     System.out.println("S: " + w.s); 
     System.out.println("Num: " + num); 
     System.out.println("Text: " + text); 

     //Code 
     w.i = w.i + 3; 
     w.s = String.valueOf(w.i); 

     //Debug 
     System.out.println("After Change"); 
     System.out.println("I: " + w.i); 
     System.out.println("S: " + w.s); 
     System.out.println("Num: " + num); 
     System.out.println("Text: " + text); 
    } 

    public static void main(String[] args) { 
     WrapperClass w = new WrapperClass(); 
     w.i = num; 
     w.s = text; 
     up(w); 

     //Debug 
     System.out.println("Out of Scope"); 
     System.out.println("Num: " + w.i); 
     System.out.println("Text: " + w.s); 
    } 


    static class WrapperClass { 
    public int i; 
    public String s; 
    } 
+0

謝謝,這完美的作品 – JWHaydock

+0

在這種情況下,你可以接受答案和upvote,讓其他人可以看到這個參考。 – randominstanceOfLivingThing

+0

一個小編輯。在調用方法(w)之後,我必須添加'num = w.i'和'text = w.s'來實際更改值,而不是僅打印w.i和w.s – JWHaydock

2

int i和要傳遞到您的功能String s是按值傳遞。這意味着你只收到一個變量的副本。對變量的操作不會影響其原始值。

您可以修改你的方法,並使其返回一個對象包含修改後的值:

創建一個新的類來封裝修改的值:

class Result{ 
    int i; 
    String s; 
    public Result(int i, String s){ 
     this.i = i; 
     this.s = s; 
    } 
} 

現在,你的方法可以返回此Result

public static Result up(int i, String s){ 
    //Code 
    i = i + 3; 
    s = String.valueOf(i); 
    return new Result(i, s); 
} 

然後,您可以訪問主方法中的修改值:

public static void main(String[] args) { 
    Result r = up(num, "test"); 
    System.out.println("int result " + r.i); 
    System.out.println("string result " + r.s); 
} 
+0

您編輯您的文章就像我張貼我的... – Fjotten

相關問題