【问题标题】:Passing primitive type as pass by reference by wrapping in class of primitive type通过包装在原始类型的类中,将原始类型作为按引用传递
【发布时间】:2015-02-22 23:22:19
【问题描述】:

我将 2 个布尔对象传递给一个函数。我知道 Java 是按值传递的,但由于我使用对象作为参数,它应该传递这些参数的地址而不是值。但是在函数中更新对象值后,我看不到 main 中的更新值。我在这里错过了什么?

public class Test1 {
    public static void main(String[] args){
        Boolean b1 = new Boolean(false);
        Boolean b2 = new Boolean(false);

        System.out.println(b1+" "+b2);
        func1(b1, b2);
        System.out.println(b1+" "+b2);
    }

    static void func1(Boolean b1, Boolean b2){
        System.out.println(b1+" "+b2);
        b1 = !b1;
        b2 = !b2;
        System.out.println(b1+" "+b2);
    }
}

【问题讨论】:

    标签: java pass-by-reference pass-by-value


    【解决方案1】:

    包装器类型是不可变的,因此您要在那里创建新的(本地)引用。对于您期望的行为,您可以传递一个数组(注意数组是 Java 中的 Object 实例)。

    public static void main(String[] args) {
        boolean[] arr = { true, false };
        System.out.println(arr[0] + " " + arr[1]);
        func1(arr);
        System.out.println(arr[0] + " " + arr[1]);
    }
    
    static void func1(boolean[] arr) {
        System.out.println(arr[0] + " " + arr[1]);
        arr[0] = !arr[0];
        arr[1] = !arr[1];
        System.out.println(arr[0] + " " + arr[1]);
    }
    

    输出是

    true false
    true false
    false true
    false true
    

    【讨论】:

      【解决方案2】:

      java 中的一切都是按值传递的。您正在传递类型为包装类的对象,这些对象是不可变的,这意味着它们的值是固定的。由于对象是作为某种引用的参数传递的,因此称为按引用传递。因此,在您的情况下,它是通过引用传递的,并且由于它们的性质是不可变的,因此值保持不变。

      【讨论】:

        【解决方案3】:

        b1 = !b1b1 = new Boolean(!b1.booleanValue) 的语法糖。因此,您无需修改​​作为参数发送给函数的原始对象,而是创建一个新的布尔对象。

        【讨论】:

          猜你喜欢
          • 2018-06-26
          • 2016-06-16
          • 2011-05-18
          • 2021-09-11
          • 2011-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-13
          相关资源
          最近更新 更多