将动态基元类型(int)传递给方法

时间:2012-08-14 19:38:28

标签: java primitive

在Java中,s的输出为0.我不明白为什么并且可以以某种方式获得s的正确值(这里是1000)?

public static void main(String args) {
    int s = 0;
    List<Integer> list = getList(s);
    System.out.println("s = " + s);
}

public static List<Integer> getList(int s) {

    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < 1000; i++) {
        list.add(i); s++;
    }
}

在C#中,有一些描述符表明如果我没有弄错,变量会发生变化..

我一般不会得到list.size()

4 个答案:

答案 0 :(得分:4)

在Java中,所有方法参数都按值传递,即复制。因此,调用者看不到对副本的更改。

要解决第二个问题,您可以在来电方使用list.size()。

答案 1 :(得分:2)

我看到两种方式

1)将's'作为静态变量并将其移至类级别

2)使用getter / setter为list和int创建类,并返回getList调用的对象

public static MyWrapperObj getList(int s) {

   ......
return wrapperObj
}

class MyWrapperObj 
{
private List<Integer>;
private countS;
....
//getter/setters.
}

答案 2 :(得分:2)

Java不允许通过引用传递参数 - 但是您可以将它包装在像这样的对象中:

class IntHolder {
        private int s;
        IntHolder(int s){
            this.s = s;
        }

        public void setS(int s){
            this.s = s;
        }

        public int getS(){
            return s;
        }

        public void increment(){
            s++;
        }
}

class Test{

  public static void main(String[] args) {
    IntHolder s = new IntHolder(0);
    List<Integer> list = getList(s);
    System.out.println("s = " + s.getS());
  }

  public static List<Integer> getList(IntHolder s) {

    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < 1000; i++) {
        list.add(i); s.increment();
    }
    return list;
  }
}

答案 3 :(得分:0)

在java中,传递给方法的参数是按值传递的。您需要创建一个全局变量或实例变量,以便在其他方法中对其进行修改。这就是java的工作方式。 e.g。

public class Test{
     private int s;

     public Test(){
          s=0;
          increment();
          //print now will be 1000.
     }

     private void increment(){
          s = 1000;
     }
}