0

几天前我开始学习Java。我有一些使用 C++ 的经验,这就是我习惯使用指针的原因,这会使这变得容易得多。

所以现在我的问题。

假设我有以下代码:

public class Main {

    public static void main(String[] args) {

        int variable1=2, variable2=2;

        input(variable1, variable2);

        System.out.println(variable1 + " " + variable2); 
            // this should output "1 3" on the console  
    }

    private static void input(int variable1, int variable2) {

        System.out.println(variable1 + " " + variable2); 
            // this will output "2 2" on the console

        variable1 = 1;
        variable2 = 3;
    }   
}

因此,该函数input()从 main 中获取变量并(正确地)输出它们。但是如何将更改后的变量传回主函数?

4

7 回答 7

1

在 Java 中,所有参数都按值传递,而不是按引用传递。因此,上面的代码不起作用。如果您想将修改传回,则必须传递对象引用(按值传递,但现在您传递对象)。当然,您必须使用可变对象,例如集合。在您的情况下,您还可以传递一个整数数组。

当然:这一切都是糟糕的编程风格。您应该通过返回值传递结果,并尽可能使用功能更强大的编程。

于 2013-11-01T15:40:08.603 回答
1

正如其他人所说,原语是按值传递的。您不能传递对它们的引用。但是,您可以传递 any 的实例Object并(假设它是可变的)对其进行修改,并且更改将可用于引用该实例的任何范围。

对于您的示例,您可以做两件事-使用数组...

public class Main{

  public static void main(String[] args){

     int[] values = {2, 2};

     input(values);
     System.out.println(values[0] + ", " + values[1]); // prints 1, 3
  }

  private static void input(int[] values){
      values[0] = 1;
      values[1] = 3;
  }
} 

或用一个物体

public class ValueHolder{
    private int val1;
    private int val2;

    public void setValue1(int i){ val1 = i; }
    public void setValue2(int i){ val2 = i; }
    public int getValue1(){return val1;}
    public int getValue2(){return val2;}

    public String toString(){ 
          return String.valueOf(val1) + ", " + String.valueOf(val2);
    }
}

public class Main{

  public static void main(String[] args){

     ValueHolder vh = new ValueHolder();
     vh.setValue1(2);
     vh.setValue2(2);
     System.out.println(vh); // prints 2, 2
     input(vh);
     System.out.println(vh); // prints 1, 3
  }

  private static void input(ValueHolder vh){
      vh.setValue1(1);
      vh.setValue2(3);
  }
} 
于 2013-11-01T15:54:27.340 回答
0
input(Variable1, Variable2);

调用此方法时,会将两个变量的值复制到新定义的两个变量int Variable1, int Variable2中。你可以这样想:

private static void input(int Variable1, int Variable2) {
    Variable1 = 2;
    Variable2 = 2;

    System.out.println(Variable1 + " " + Variable2); // this will output "2 2" on the console

    Variable1 = 1; // this is different from the one that is inside main()
    Variable2 = 3; // this is different from the one that is inside main()
}

这是我对另一个问题的回答,它可能会帮助您理解按值传递的概念:https ://stackoverflow.com/a/9404727/597657

于 2013-11-01T15:42:04.693 回答
0

在 Java 中传递原语是按值完成的。

您可以删除静态方法,并将原语用作 Main 类的实例属性,如下所示:

public class Main {
    int firstVariable = 1, secondVariable = 2;
    // instance block of Main, prints the fields
    {
        System.out.println("First variable: " + firstVariable);
        System.out.println("Second variable: " + secondVariable);
    }
    // main (static) method: initializes an instance of Main class and calls
    // (now) instance method "changeInstanceFields", then prints the change
    public static void main(String[] args) {
        Main main = new Main();
        main.changeInstanceFields();
        System.out.println("First variable: " + main.firstVariable);
        System.out.println("Second variable: " + main.secondVariable);
    }
    // instance method: accesses Main class' instance fields
    public void changeInstanceFields() {
        firstVariable = 1;
        secondVariable = 3;
    }
}

输出:

First variable: 1
Second variable: 2
First variable: 1
Second variable: 3
于 2013-11-01T15:43:04.020 回答
0

将其设置为类变量

public class Main {

public int variable1, variable2;

public static void main(String[] args) {

    Variable1=2;
    Variable2=2;

    input(Variable1, Variable2);

    System.out.println(Variable1 + " " + Variable2); 
        // this should output "1 3" on the console  
}

private static void input(int Variable1, int Variable2) {

    System.out.println(Variable1 + " " + Variable2); 
        // this will output "2 2" on the console

    Variable1 = 1;
    Variable2 = 3;
}   

}

于 2013-11-01T15:45:38.523 回答
0

int 是原始类型http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html。整数是拳击整数。他们俩都没有改变他们的价值观。而是创建了新对象。但是,您可以用类包装 int 值。参见示例:

public class Main {
int v;

@Override
public String toString() {
    return "Main [v=" + v + "]";
}

public static void main(String... strings) {
    int v1 = 2;
    int v2 = 3;

    input(v1, v2);
    System.out.println(v1 + " " + v2);

    Integer i1 = 2;
    Integer i2 = 3;

    inputI(i1, i2);
    System.out.println(i1 + " " + i2);

    Main m1 = new Main();
    m1.v = 2;
    Main m2 = new Main();
    m2.v = 3;

    inputM(m1, m2);
    System.out.println(m1 + " " + m2);

}

public static void input(int v1, int v2) {
    v1 = 3;
    v2 = 4;
}

public static void inputI(Integer v1, Integer v2) {
    v1 = 3;
    v2 = 4;
}

public static void inputM(Main v1, Main v2) {
    v1.v = 3;
    v2.v = 4;
}

}

输出:

2 3
2 3
Main [v=3] Main [v=4]
于 2013-11-01T15:48:58.497 回答
0

发生这种情况是因为变量的值被复制到方法 input()。原始变量总是在方法之间复制。

于 2013-11-01T15:54:11.180 回答