在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()
!
答案 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;
}
}