关于值传递和引用传递,我更喜欢说传递的都是拷贝。
如果拷贝的这份东西就是一个值,那就是值,如果拷贝的东西指向的是一个对象,那就是引用传递。
具体这个引用的值会不会影响之前的值,那还要看这个对象是否是可变对象,如果遇到类似于String 这样的不可变对象,传递的即便是new出来的对象,但进去的值也不会对传递前的值产生任何影响。其他的引用传递,一般都会对之前的对象值产生影响。这个具体分析吧。楼主的情况,两个都不会对a产生影响。但可以将结果值再赋给a
b(a);  // a 依然是1
a = c(a);  // 将结果2 赋给a 

解决方案 »

  1.   

    不能这么来实现,你这样是从函数外部改变变量了,跟引用完全风马牛不相及了.要实现引用,从内部改变.就跟vb下的byref一样.
      

  2.   

    我不懂vb 楼主想通过值传递或引用传递来达到楼主想要的效果,我觉得是不可能的事情了。
    int 简单变量是值传递,Integer 包装类型(new Integer())理应算应用传递了吧,但基本类型的8个对应包装类型都是不可变对象,所以他们传递的还是值,所以依然不可能达到引用传递的效果。
    再说,楼主的两个方法b() 和 c() 从功能实现上来说,除了方法名不同,实现完全相同,然后给相同的入参,得到不同的结果,这也是不可能的事情。
      

  3.   

    原生数据类型都是值传递,b(a),c(a)执行后都不会对a值有影响;只有引用类型的变量才是引用传递
      

  4.   

    我不懂vb 楼主想通过值传递或引用传递来达到楼主想要的效果,我觉得是不可能的事情了。
    int 简单变量是值传递,Integer 包装类型(new Integer())理应算应用传递了吧,但基本类型的8个对应包装类型都是不可变对象,所以他们传递的还是值,所以依然不可能达到引用传递的效果。
    再说,楼主的两个方法b() 和 c() 从功能实现上来说,除了方法名不同,实现完全相同,然后给相同的入参,得到不同的结果,这也是不可能的事情。
    用vb版的b,c函数就是
    function b(byval b1 as integer){
        b=b1+1
    }function c(byref c1 as integer){
        c=c1+1
    }用c++版实现就是
    function b(int b1){
        return b1+1
    }function c(int &c1){
        return c1+1
    }换句话说就是函数c能改变a,函数b不能改变a,这就是传统的传值跟传引用的概念.
    问题就是这两个函数用java来实现如何实现?函数b没问题,关键是函数c如何实现?关键就是在函数体内部通过参数来改变a的值.
      

  5.   

    看来这个问题好像白问了,java没传引用这一说?
    如果这是真的java确实有点落伍了.
    例如要设计一个函数.
    返回值决定成功与否(经常用在if判断上),十分方便.
    而你要取出来的东西.作为引用参数传入.
    然后先判断返回成功,然后再处理引用的参数进行后续操作.虽然java的对象是引用,但是如果是基础数据就比较麻烦.
    例如取出字符串长度.唯一可行的变向方法就是把返回值和要取的对象内容都封装到一个类里面.
    这样又要在函数后加上一个属性去验证布尔结果或者select case.真的只能说不太科学啊.莫非是因为虚拟机问题,造成的没基础数据引用传递?
      

  6.   

    举的例子不对,int本来就不可变,不管怎么传都是引用。
    http://bbs.csdn.net/topics/390765824?page=1#post-397241922
      

  7.   

    换思路吧,java中int 和 Integer 都不具备这种功能。
    换为一个可变对象StringBuffer 或 其他的,但是传递的入参就不是int型的了。
    StringBuffer 的话,第一个方法,将传递进去的变量改变它指向的内存空间,这样不影响之前的值。
    第二个方法,就直接对传递进去的变量操作,因为它指向之前的内存空间,会影响到之前的值。
      

  8.   

    最后一句说的很对,基础类型以及他们的包装类型都是传值。
    按理说,包装类型new出来的对象是传递地址的,但基础类型的包装类型都是不可变对象
    也就是对象一旦new出来,它的值就不会再改变了,再对它操作,相当于另外new 出新的地址空间了。
      

  9.   


    public class java {
     
        public static void main(String[] args) {
    Integer I = new Integer(7);
    int i = 7;
    MyInt mi = new MyInt(7);
    add1(i);add1(I);add1(mi);
    System.out.println(i);
    System.out.println(I);
    System.out.println(mi);
       }
        public static Integer add1(Integer i){
    i = i+1;  // 如果 Integer 有一个 setValue 方法的话 
    return i;
        }
        public static int add1(int i){
    i=i+1;
    return i; 
        }    public static int add1(MyInt i){
    i.add1(); // 封装
    return i.toInt(); 
        }
    }
    class MyInt{
        private int i;
        public MyInt(int i){
    this.i = i;
        }
        public void add1(){
    i = i + 1;
        }
        public String toString(){
    return ""+i;
        }
        public int toInt(){
    return i;
        }
    }
      

  10.   

    C和VB都可以传值和传引用,因为他们开放地址/指针操作,VB虽然没有指针,但你还是可以获取变量地址,进行直接内存操作等等。
    Java根本就废掉了指针,也不让你取地址,所以相应的也只允许你函数调用时传值,所以不可能实现你要的结果。
    如果你需要这样做,要么就应该用类封装起来,直接传对象。
    要么就应该将结果作为返回值,比如你上面的代码。应该这样写a=c(a)这是Java的语言规则,在Java没有做出修改之前你只能改变你的习惯,如果你觉得没有传引用就写不了代码了,那C和VB才适合你。
      

  11.   


    12楼确实实现了,用我说的对象是传引用的方法,但你注意到第6行没,你完全建立了个新对象,跟i一毛钱关系都没有.反过来说,即使用i建立的对象,也是个新东西了,不是i的引用.你只是变向实现了这个.这不是引用.
      

  12.   

    本来对java印象还不错,赶脚除了效率低点应该还挺好,这下印象大打折扣了,还不知道有什么其他不好的.哦,字符串比较还不支持,得用函数.先说这些,逮饭去了.回头散分.
      

  13.   

    Java的 虚拟机 存放对象的是Heap 存放局部变量的是Frame   (我听别人说的)如果 Java.lang.reflect  增加一个 MethodFrame 对象的话  修改函数的局部变量是不成问题的
      

  14.   

    如果非要严格的区分的话JAVA里都是值传递,没有所谓的引用传递。java里的引用只是C里面指针的弱化。
    如果有同学想要了解真正的引用传递和值传递的区别,先去看看C++吧!
      

  15.   

    有句话叫“入乡随俗”。在Java的世界里面,你就按照Java的习惯来。就好象学英语,老外比较倾向于(如果不是100%的话):
    A: Here you are. 
    B: Thank you.
    A: You are welcome.难道你一定要按照中文的习惯:
    A: Give you.
    B: Thank you.
    A: No thanks.
      

  16.   


    package com.csdn.test20140530;public class ValuesTest {

    public static  int a=1;
    public static  int[] b={1};
    public  int b(int b1){
        b1+=1;
        return b1;
    } public  int c(int[] c1){
        c1[0]+=1;
        return c1[0];
    }

    public static void main(String[] args) {
    ValuesTest valuesTest = new ValuesTest();
    valuesTest.b(a);
    valuesTest.c(b);

    System.out.println(a);
    System.out.println(b[0]);
    }

    }
    这样出来的就是a = 1, b=2了。@vnvlyp 下面的话是他以前讲的很详细,你可以看我以前问你的问题,跟你的很相似。
    地址:http://bbs.csdn.net/topics/390804208
    在C中有指针类型,而且你可以通过&获取一个变量的地址,所以你可以把一个变量的地址作为参数传进函数,从而通过指针改变变量的值
    比如上例中的f(&i),就是取i的地址,然后传递给void f(int * p)中的指针参数p,这样通过指针解引用*p=10你就可以改变原来那个变量的值。但是Java第一没有指针类型,第二不能轻易获取一个变量的地址,所以比如int b = 5; swap(b),你传进去的只是b变量的值,而不是b的地址,而由于没有指针类型,就算你得到了地址,你也无法通过地址改变变量的值。而Java中的引用类型,实际上是被弱化的指针类型,比如int[] a,那么a相当于C中的int *a,就是指向int的一个指针,既然是指针,那么你作为参数传递给函数,就可以达到修改原来变量的值的目的