public class PassByRef {
int a;
public void method(PassByRef p){
p = new PassByRef();
p.a = 10;
}
public static void main(String[] args) {
PassByRef p = new PassByRef();
p.a = 5;
p.method(p);
System.out.println(p.a);
}
}
public class PassByValue {
public void method(int a){
a = 10;
}
public static void main(String[] args) {
PassByValue pbv = new PassByValue();
int a = 5;
pbv.method(a);
System.out.println(a);
}
}

解决方案 »

  1.   

    这里牵涉到基本类型数据和对象(复杂类型数据)的存储结构和参数传递问题~~~
    你看看基本的java书上都有介绍~~
      

  2.   

    和其它语言一样,java也有引用传递和值传递。java的引用和c/c++的指针是一个概念,就是取得某个变量的地址。所谓引用传递,就把先把引用变量复制一份,放在堆栈中,然后把复制的引用变量再作为实参供函数调用。而值传递就不一样,值传递不用复制,直接把变量的值作为实参供函数调用。
      

  3.   

    讲不太明白.但你可以这样记.传值是不变的.传对像(属性)是变化的.STRING例外.
      

  4.   

    STRING例外.
    ----------------
    那Integer除不除外?Object本身除不除外?用Collections.unmodifiedCollection()修饰过的Collection除不除外?要除外的太多啦!java中,所有的primary type都是传值,其他以Object为基类的都是传引用。
      

  5.   

    一定要记往,JAVA所有的都是引用,所以在传递的时候一定要注意了
    --------------------------------------------------------------
    p.a = 5;
    p.method(p);//这只改变了方法体的一些内容,并没有返回方法外的值
    System.out.println(p.a);//所以还是取到方法外面的值
    --------------------------------------------------------------
    引用引用......
      

  6.   

    第一段代码搞懂了,方法里的p是new了一个新对象,和之前的不同,对不对?所以p.a是表示p的成员变量a与之前的也就不相关了第二段代码里的 a=5 作为参数传递给方法,然后,里面又有a=10,这个a是局部变量, 改变了这里的a值也不会返回给main方法里的a,是不是这样呢?
      

  7.   

    第一段代码搞懂了,方法里的p是new了一个新对象,和之前的不同,对不对?所以p.a是表示p的成员变量a与之前的也就不相关了第二段代码里的 a=5 作为参数传递给方法,然后,里面又有a=10,这个a是局部变量, 改变了这里的a值也不会返回给main方法里的a,是不是这样呢?
    -----------
    你的两段理解都没错!
      

  8.   

    public class PassByRef {
    int a;
    public void method(PassByRef p){
    p = new PassByRef();//new 一个新的对象,所以跟前面没关系
    p.a = 10;//没返回值,就算有返回值,因为NEW了一个新的对象,就在内存中新开了一个堆,所以跟传进来的PassByRef p一点关系都没有
    }
    public static void main(String[] args) {
    PassByRef p = new PassByRef();
    p.a = 5;//p.a=5
    p.method(p);
    System.out.println(p.a);//p.a=5;
    }
    }
    public class PassByValue {
    public void method(int a){
    a = 10;//因为这里的a是在新的内存中新开辟的,所以又没返回值,就不能把a=10,付值给原来的那个a=5,这个数,所以,原来的a还是等于5
    }
    public static void main(String[] args) {
    PassByValue pbv = new PassByValue();
    int a = 5;
    pbv.method(a);//把a=5,传给method(int a)
    System.out.println(a);//还是原来的5
    }
    }建议先搞清楚他们在内存中的存储方式,这样就很容易理解了
    本想跟你说清楚点的,但是太多方面要说,又没图,所以楼主自己找资料学去
      

  9.   

    public class PassByRef {
    int a;
    public void method(PassByRef p){
    p=new PassByRef();
    p.a = 10;
    }
    public static void main(String[] args) {
    PassByRef p = new PassByRef();//这边已经是新赋的一个新对象啦!如果去掉就按地址传递啦!
    p.a = 5;
    p.method(p);
    System.out.println(p.a);
    }
    }
      

  10.   

    public class PassByValue {
    public void method(int a){
    a = 10;
    }
    public static void main(String[] args) {
    PassByValue pbv = new PassByValue();
    int a = 5;//这两边定义的a值实际是两个不同的变量.打印出来的是各个的变量值.
    pbv.method(a);
    System.out.println(a);
    }
    }
      

  11.   

    那Integer除不除外?Object本身除不除外?用Collections.unmodifiedCollection()修饰过的Collection除不除外?要除外的太多啦!java中,所有的primary type都是传值,其他以Object为基类的都是传引用。-------------------------------------------------------------------
      这几句话有点不懂呢?能不能给解释一下呢?先谢啦!
      

  12.   

    你要理解内存的存储方式,内存分堆,栈,全局区(静态区),常量区.4个区域
    堆,是用来存储引用类型和对象变量
    栈,用来存储变量,
    全局区(静态区),)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
    常量区 — 常量字符串就是放在这里的.程序结束后由系统释放.你再搞懂变量的生命周期,一般生命周期都是在{}内的,也就是他只在{}有效
    比如{int x}和{int x}这两个X是不同的两个,在栈中创建2个不同的内存地址来存储
      

  13.   

    举个例子
    int x = 0;这个变量,所以在栈中存储
    String x = new String("");
    首先,String x,要在栈中开个空间来存储X,类型是String
    接着再堆中开个空间来存储new String("");
    再通过"="把堆中的首地址传递给栈中的X,那么X存储的就是new String("");变量在堆中的首地址,
    也几是说这时候X存储的是一个地址,而不是一个值,这个值是在堆中存储讲那么多,应该懂了吧
    记的给分呀
      

  14.   

    java里面参数传递只有值传递
    通常认为java有两种传递:引用传递和值传递
    但其实只有一种值传递。
    因为java参数传递的过程是将参数进行内容拷贝,然后使用拷贝后的数据,函数调用完之后,释放拷贝。
    这正式值传递的过程。
    引用传递只是将引用拷贝了一次,指向的对象实体仍没变