日期:2014-05-20  浏览次数:20677 次

紧急求助啊,关于基本类型的值传递和封装类的引用传递
话说在java中,像int long double这种基本类型作为参数的时候是值传递对吧?直接拷贝一份,在函数中修改参数值是不影响传递进来的变量值的。

不过不是说java中所有的对象都是引用传递的么?

话说我最近在做一个c++的项目的移植,里面有好多函数,需要同时返回n个返回值,就直接把需要得到返回值的指针传递给函数,这样函数能够直接把需要返回的值写到传递进来的指针里头。。。

话说如果我有这样的函数
Java code

public  static void change(Long num){
        num=1000;
}


然后在main中调用
Java code
Long a = new Long(1);
change(a);
System.out.println(a);

返回的结果仍然是1啊??
就是说完全没有影响到a的值。。。可是a是long的封装类Long啊,应该是一个以引用传递进来的对象啊??

请问一下上面是啥原因。。
同时拜托给出一个能够处理引用传递的解决方案啊??

(c++项目里头大量的指针传递,而且里头还套着递归,我可不想用数组作为返回值啊??太痛苦了)

感激不尽

------解决方案--------------------
Long 是不可变的。
------解决方案--------------------
LZ对C/C++了解多少?
如果LZ对指针了解的话,应该知道C/C++里也不可能改变指针的指向而引起外部变量的改变,只能改变指针指向的内容才对外部变量有影响,比如
C/C++ code
void change1(int* a) {
    int b = 10;
    a = &b; //这个叫改变指针的指向
}

void change2(int* a) {
    *a = 10; //这个叫改变指针指向的内容
}

void main() {
    int a = 5;
    change1(&a);
    printf("%d\n", a);
    change2(&a);
    printf("%d\n", a);
}

------解决方案--------------------
Java code

//修改如下,仅供参考:
class Main 
{            
  public static Long change(Long num) //将改动的引用返回
  {
    num=1000l; //需要加“l”
    return num;
    }
  
  public static void main(String[] args)
  {
      Long a = new Long(1);
        System.out.println(change(a));    //接收返回引用,再处理
  }        
        
}