public class TestPsss
{
  public void change(int a)
  {
    a=100;
  }
  public static void main(String[] args)
  {
    int pass=50;
    TestPass p=new TestPass();
    System.out.println(pass);
    p.change(pass);
    System.out.println(pass);
    
  }}
请问结果是什么,为什么?请详细解释一下

解决方案 »

  1.   

    怎么会难倒无数人?难道还有什么暗藏的什么玄机int是原始数据类型,按值传递结果应该是50,50
      

  2.   

    50,50
    这个应该可以算是 java 中的基础了
    pass 只是把他的植传递过去了
    也就是把他的拷贝传了过去
    如果传的是对象那本来的植也会改变
    最简单的是int[]的数组
    你可以试一下
      

  3.   

    int不是封装类 Integer是int的封装类Integer是按地址传递 int是按值传递
      

  4.   

    It is very very easy!!!!!!
      

  5.   

    。。难倒无数人。不会lz也被难倒了吧,这个问题c++时候就有类似的了,java的入门书也提过n次了,再忽略的人只能说是太。
      

  6.   

    很简单啊
    基本类型是传值
    如果是对象那就相当于C中的传地址(句柄)就会改变了
    比如string类型就是字符串类
      

  7.   

    public class TestPsss
    {
      public void change(int a)
      {
        a=100;
        System.out.println(a);//你看看这里打印的是什么就知道了.方法结速,堆栈释放内存了。
      }
      public static void main(String[] args)
      {
        int pass=50;
        TestPass p=new TestPass();这里你新new 了一个实例
        System.out.println(pass);
        p.change(pass);改变的是新的对象的值了.
        System.out.println(pass);对原有对象的值没有影响.
        
      }}
      

  8.   

    这个好像在C语言就应该涉及到了。就是传值和传址的区别。在调用函数的时候,参数都压到栈里了,如果是传址,比如说 pass ,那么他修改的就是pass传到栈里的那个内存中的数据,但是如是传址(例如c里的取地址&pass的),那么是修改你传到栈里的这个地址所指向的内存。当程序运行完毕的时候,将栈清空,这个时候,如果是传值的话,显然你修改的那个数据就被释放了,但是,如果你是传址的话,虽然栈同样释放,但是释放掉的是指向你修改数据的那个内存的地址而已。你做的修改被成功保留了。
    c语言里的地址,其实就是java里的引用对象。但是java保留的基本数据类型int,long,short,double,char。你如果把int都换成Interger的话,做一下比较,估计你就明白了。Integer是一个类型,它产生的引用对象就是地址了。
    ------------------------------------------------------------------------------------
    初来乍到,请各位大侠多指教不足!!!
      

  9.   

    【上个帖子有点笔误】
    这个好像在C语言就应该涉及到了。就是传值和传址的区别。在调用函数的时候,参数都压到栈里了,如果是【传值】,比如说 pass ,那么他修改的就是pass传到栈里的那个内存中的数据,但是如是传址(例如c里的取地址&pass的),那么是修改你传到栈里的这个地址所指向的内存。当程序运行完毕的时候,将栈清空,这个时候,如果是传值的话,显然你修改的那个数据就被释放了,但是,如果你是传址的话,虽然栈同样释放,但是释放掉的是指向你修改数据的那个内存的地址而已。你做的修改被成功保留了。
    c语言里的地址,其实就是java里的引用对象。但是java保留的基本数据类型int,long,short,double,char。你如果把int都换成Interger的话,做一下比较,估计你就明白了。Integer是一个类型,它产生的引用对象就是地址了。
    ------------------------------------------------------------------------------------
    初来乍到,请各位大侠多指教不足!!!
      

  10.   

    50,50,int是数据类型INTGER是对象,如果参数是对象的话就可以改变值传的是地址;如果传递的不是对象就不能改变,传的是数值
      

  11.   

    能不能就当change那个方法没有返回值这么解?
    各位大哥指导指导
      

  12.   

    50
    50这个问题说难也难..说简单也容易....你把JAVA中参数传递的机制了解一下就明白了
    int类型只是传递了一个引用的副本..
      

  13.   

    一段JAVA小程序难倒楼主了----------------------------------------楼主不仅不会写程序,写中文都错字连篇
      

  14.   

    TestPass p=new TestPass();这里你新new 了一个实例
    这个能写在相同的类里吗?
    不懂
      

  15.   

    public class TestPsss
    {
           int b[]=new int[100];
      public void change(int a[])
      {
        b=a;//给你留个问题把b=a换成a=b,结果会不一样,如果你能想明白为什么就ok了如果不明白,
            //我会接贴靠诉你的
        b[0]=100;
        System.out.println(a[0]);//你看看这里打印的是什么就知道了  }
      public static void main(String[] args)
      {
        int pass[]=new int[100];
         pass[0]=20;
        TestPass p=new TestPass();这里你新new 了一个实例
        
        p.change(pass);.
        System.out.println(pass[0]);//pass[0]=100改变了
        
      }}
      

  16.   

    int型是传值,而非引用..............受不了!
      

  17.   

    我们都是菜鸟,我给你说说.
      你的那个方法change(int a),你调用了他一下,但是这个方法没有返回什么东西,int a只是形参,不改变实际的pass那个实参,你输出pass是多少还是多少.
       如果那个方法 public int change(int a)
      {
          a=100;
          return a;
      }
      而且你输出的是System.out.println(change(pass));
     那就是100了.
     说你的人很多,别不好意思不看了,刚刚学都这样.
     我也菜鸟一个,刚好知道这个
      

  18.   

    To javafreshfish() :public class TestPsss
    {
           int b[]=new int[100];
      public void change(int a[])
      {
        b=a;//给你留个问题把b=a换成a=b,结果会不一样,如果你能想明白为什么就ok了如果不明白,
            //我会接贴靠诉你的
        b[0]=100;
        System.out.println(a[0]);//你看看这里打印的是什么就知道了  }
      public static void main(String[] args)
      {
        int pass[]=new int[100];
         pass[0]=20;
        TestPass p=new TestPass();这里你新new 了一个实例
        
        p.change(pass);.
        System.out.println(pass[0]);//pass[0]=100改变了
        
      }}
     
    我不是很懂,你什么时候接啊?
      

  19.   

    首先在java中不论传的是什么,都是原来的拷贝,int a 传的是值的拷贝,int[] a 传的是a 的引用的拷贝,我还拿上面的例子来说明.1.我们在 main 方法中 int [] pass=new int [100];在内存中开辟了数组区域 A
    2.我们把数组pass传给方法change(),传的是引用,此时 int [] a 数组就指向了pass 所指向的内存A
    3.b=a  所以 b 也就指向了 a 所指向的内存A
    4.b[0]=100 修改的是内存A中的内容,而pass也指向A所以pass[0]也变成了100
    当我们把b=a 换成 a=b 时  由于b 已经在上面int b[]=new int[100];定义了开辟了另一内存B
    所以a 就指向了内存B  而pass 是指向内存A 的所以pass[0]没有改变当我们传过去的是int a 时 传的是a值的副本所以不论你怎么改变a 的副本你都不可能改变a 的本来的值的现在应该明白了把
      

  20.   

    我也是fresh 希望大家都能进步
      

  21.   

    Java函数参数是值传递的。. 如果参数是基本类型,函数不能改变参数的值。
    . 如果参数是对象,函数可以改变参数的属性。
    . 如果参数是对象,函数不能使参数指向新的对象。
      

  22.   

    晕,这不是很基础的全局变量跟局部变量吗?main里面的局部变量一直没被重新赋值!
      

  23.   

    50,50
    因为你是值传递,一个方法不能改变一个基本数据类型的参数。
    下面看一下你写代码具体的执行过程:
    1.a被初始化为pass值的一个拷贝(也就是50)。
    2.后a 为100时,但是PASS仍然是50。
    3.  public void change(int a)
      {
        a=100;
      }这个方法结束后,参数变量a不再使用。
      

  24.   

    50,50
    看看和这段程序的区别就知道了
    system.out.println(p.pass);
      

  25.   

    其实你的
    p.change(pass);
    没有传递给pass变量,那有什么作用。。相信楼猪本来的意思是想经过change方法后输出 100 吧,代码如下public class TestPass
    {
      public int change(int a)
      {
        return a=100;
      }
      public static void main(String[] args)
      {
        int pass=50;
        TestPass p=new TestPass();
        System.out.println(pass);
        pass=p.change(pass);
        System.out.println(pass);
        
      }}要传递给pass,谨记!!!再说,这个也不是什么难题,楼主太粗心了
    看书一定要认真哦,
    偶也是初学者,共勉~~~
      

  26.   

    记住一点:JAVA里几乎都是按值传递参数.if(参数不是全局变量 && 方法不给参数返回值)

      参数是形式参数; 
      参数出了方法还是原来的值;
    }
      

  27.   

    int为原始数据类型,按值传递
      

  28.   

    用int的封装类Integer 做参数,就会解决这个问题