public class Pass{
 
static int j=20;
 
public static void main(String argv[]){
 
int i=10;
 
Pass p = new Pass();
 
p.amethod(i);
 
System.out.println(i);    
 
System.out.println(j);
 
}
 
public void amethod(int x){
 
x=x*2;
 
j=j*2;
 
}
 
}
 为什么结果是 10和40啊,不是20和40了

解决方案 »

  1.   

    这个就是方法变量的理解问题。i是main方法的局部变量,这是个简单变量。当调用amethod方法的时候,i把它的值(注意:是值)传递给该方法的参数x,方法执行后x的值变成了20,你没有打印。i的值当然不变。
      

  2.   

    public void amethod(int x)  调用这方法,int是基本类型,是值传递(copy i的值给x),所以x值变不关i的事,如果,public void amethod(Object x) 调用这个方法,就是引用传递,x和i同时指向堆中的一个对象,所以,用x改变对象后,用i可以看到变化
      

  3.   

    有方法p.amethod(i);

    去百度=查一下p.amethod(i);
    的用法
      

  4.   

    i是局部变量,对于java来说,只有值传递,这里调用amethod这个方法的时候,传递的是i这个值的副本,在amethod方法内部做到任何操作,都不影响外部的这个i的值。
      

  5.   

    这个就是方法变量的理解问题。i是main方法的局部变量,这是个简单变量。当调用amethod方法的时候,i把它的值(注意:是值)传递给该方法的参数x,方法执行后x的值变成了20,你没有打印。i的值当然不变。
      

  6.   

    java是值传递的,不是地址传递的
      

  7.   

    int i=10; 这个i是局部变量,局部变量的优先等级比全局变量的等级高。
      

  8.   

    首先int是值类型,非引用类型,值传递参数你仅仅是吧10这个数值传递过去了,而并非把内存中指向i这个变量的地址传递了,所以在方法里做的改变不会改变你i值的本身,故而你打印i就还是你传递给方法之前的数值,不会被你方法内的操作改变其数值。
      

  9.   

    了解下Java中的值类型和引用类型吧,会对你有帮助
      

  10.   

      这个就是深复制和浅复制的问题了,就是很多人说的值传递和地址传递的问题,你也可以画一个堆一个栈,i是值传递,只是将值复制了一份传过去,也就是指向了另一个10,改变的是方法里面的i,而主函数的i还是指向原来的10没有改变,而j是直接指向全局的j,改变的是唯一的一个j的值 所以j就变了
      

  11.   

    在大括号中定义的变量出了大括号也就是出了他的作用域,会被垃圾回收 你方法中定义的x当方法执行完了就不存在了!如果把x=x*2,改为i=x*2那么就会是你想要的结果了
      

  12.   

    它和c是有区别的,你肯定是以前写c才这样写,c传递地址,而java传值
    public void amethod(int x){
      
    x=x*2;
      
    j=j*2;
      
    }
    x是amethod方法的局部变量,开始时x=i,后面x就等于x*2,就比如:现在我的苹果数量和你一样,等下我加了几个苹果,你没变,我们就不一样了
    要实现你的效果,就要把i定义为全局变量
      

  13.   

    i 是stack 上的数据,调用方法的时候传值不是传址。