初学java,遇一问题,望解答
程序如下
public class J1 {
void f(Boolean[] flag) {  //1
if (flag[0] == true) 
flag[0] = false;
System.out.println("inner "+flag[0]);
return;
}
public static void main(String[] args) {
Boolean[] flag = new Boolean[1];
flag[0] = true;
J1 test = new J1();
test.f(flag);
System.out.println("outer "+flag[0]);
}
}输出为inner false
        outer false
单将程序//1处的函数定义为void f(Boolean flag)
新的程序为
public class J1 {
void f(Boolean flag) {
if (flag == true) 
flag = false;
System.out.println("inner "+flag);
return;
}
public static void main(String[] args) {
Boolean flag = new Boolean(true);
J1 test = new J1();
test.f(flag);
System.out.println("outer "+flag);  //2
}
}
输出结果为
inner false
outer true
显然这里的Boolean是传值而不是传reference
但我就不懂了,这里的flag是类Boolean的对象,不是说所有函数中的形参是对象的话都是传refenence,这样//2处的flag也该为false呀,输出的结果应该为inner false   outer false
但为什么outer 是true怎样才能不用定义flag数组,而实现函数中的boolean值的传引用,就好像c++中形参的&

解决方案 »

  1.   

    对基本类型是传值
    对从object继承的类是引用调用
    对数组的对象是引用调用,而不管是否基本类型注意注意
      

  2.   

    关键在于你使用的是=进行处理的,这样就是按着值来应用的。
    这种情况你可以通过改变对象本身的属性来改变对象,对象必须是可变对象。比如: void f(StringBuffer strBuf) {  //1
                 strBuf.append("This is added by method f.");
    }
    这种情况传入的参数就会发生变化,如果你只是使用=不能够改变他
      

  3.   

    请问那么第2段程序应该怎么改(不要用第一段程序形参定义Boolean[] flag),而只形参自定义Boolean flag能得到和第一段程序一样的结果
      

  4.   

    懂了,java中的一切函数参数是都是传值,没有c++中的引用调用,不过我觉得这样太不方便了