2016-04-28 173 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

相关问题