从public static void main(String [] args)访问变量

时间:2013-11-01 15:36:11

标签: java

我几天前开始学习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获取变量并输出它们(正确)。 但是如何将更改后的变量传回主函数?

7 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

正如其他人所说,原语是按价值传递的。您无法传递对它们的引用。但是,您可以传递任何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);
  }
} 

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

答案 3 :(得分: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

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

}

答案 5 :(得分:0)

int是原始类型http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html。整数是拳击int。他们两个都没有改变他们的价值观。而是创建新对象。 但是,您可以使用类包装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]

答案 6 :(得分:0)

这是因为变量的值被复制到方法input()。始终在方法之间复制原始变量。