Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从方法内部更改变量的值?_Java_Variables_Methods - Fatal编程技术网

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

Java 如何从方法内部更改变量的值?,java,variables,methods,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: " +

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

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

传递给函数的
int i
字符串s
是通过值传递的。这意味着您只收到变量的副本。对变量的操作不会影响其原始值

可以修改方法并使其返回包含修改值的对象:

创建一个新类来封装修改后的值:

class Result{
    int i;
    String s;
    public Result(int i, String s){
        this.i = i;
        this.s = s;
    }
}
现在,您的方法可以返回此
结果

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

传递给函数的
int i
字符串s
是通过值传递的。这意味着您只收到变量的副本。对变量的操作不会影响其原始值

可以修改方法并使其返回包含修改值的对象:

创建一个新类来封装修改后的值:

class Result{
    int i;
    String s;
    public Result(int i, String s){
        this.i = i;
        this.s = s;
    }
}
现在,您的方法可以返回此
结果

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

调用method
up(int i,String s)
时,只需传递变量
i
的复制值。它不会更改method
up
中的值


阅读这篇文章:

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


阅读这篇文章:

你可以用一个包装器类来完成。这是因为Java使用了其他人提到的传递值。解决方法是在存在多个值的情况下创建WrapperClass。下面是如何使用WrapperClass修改类。在使用Corba时,Java框架提供了参考语义

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

您可以使用wrapper类来完成。这是因为Java使用了其他人提到的传递值。解决方法是在存在多个值的情况下创建WrapperClass。下面是如何使用WrapperClass修改类。在使用Corba时,Java框架提供了参考语义

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

这是因为变量
i
是您传入的内容的副本,而不是(原始)变量
num
。原因是java使用按值调用基本类型。文本肯定会在函数调用之外得到更新,因为它是一个字符串对象,但num是int类型,一个基本类型,它不会在函数之外更新。@VineetKasat
String
不会被更新,也不会更新
int
@SergheyBishyr你说得对。字符串也不会更新,因为变量
i
是您传入内容的副本,而不是(原始)变量
num
。原因是java使用按值调用基本类型。文本肯定会在函数调用之外得到更新,因为它是一个字符串对象,但num是int类型,一个基本类型,它不会在函数之外更新。@VineetKasat
String
不会被更新,也不会更新
int
@SergheyBishyr你说得对。字符串也不会更新。在这种情况下,您是否可以接受答案并向上投票,以便其他人可以看到此引用。一个小编辑。在调用方法(w)后,我必须添加'num=w.I'和'text=w.s',以实际更改值,而不仅仅是打印w.I和w.sYes,您可以这样做。您甚至可以尝试分别为i和创建新的Holder类,将它们称为IntHolder和StringHolder,并使用它们代替包装器类。在这种情况下,您可以接受答案并向上投票,以便其他人可以看到此引用。只需进行一个小的编辑。在调用方法(w)后,我必须添加'num=w.I'和'text=w.s',以实际更改值,而不仅仅是打印w.I和w.sYes,您可以这样做。您甚至可以尝试为i和单独创建新的Holder类,将它们称为IntHolder和StringHolder,并使用它们代替包装器类。