如何从方法内部更改变量的值?

时间:2016-04-28 13:55:13

标签: java variables methods

我正在尝试创建一个方法来增加各种变量的值,这里是我正在使用的逻辑类型的一个例子,但是当方法完成时,原始变量没有改变。我需要添加或替换什么才能让值在方法之外更改?

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);
}

3 个答案:

答案 0 :(得分:2)

传递给您的函数的int iString 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);
}

然后,您可以访问main方法中的修改后的值:

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);
}

答案 1 :(得分:0)

您只需在调用方法i时传递变量up(int i, String s)的副本值。它不会更改方法up中的值。

阅读这篇文章:Is Java “pass-by-reference” or “pass-by-value”?

答案 2 :(得分: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;
  }