通过引用或按值调用

时间:2015-03-24 20:44:53

标签: java arrays oop call-by-value

class Box {
    int size;

    Box(int s) {
        size = s;
    }
}

public class Laser {
    public static void main(String[] args) {
        Box b1 = new Box(5);
        Box[] ba = go(b1, new Box(6));
        ba[0] = b1;
        for (Box b : ba)
            System.out.print(b.size + " ");
    }

    static Box[] go(Box b1, Box b2) {
        b1.size = 4;
        Box[] ma = { b2, b1 };
        return ma;
    }
}

What the result? 
A. 4 4 
B. 5 4 
C. 6 4 
D. 4 5 
E. 5 5 
F. Compilation fails 

答案是A

我很难尝试理解此代码的结果。有谁可以向我解释结果?

4 个答案:

答案 0 :(得分:3)

在Java中,它总是按值传递

原语总是按值传递

对象通过引用传递,这些引用也按值传递

    public static void main(String[] args) {
        Box b1 = new Box(5); //Line1
        Box[] ba = go(b1, new Box(6)); //Line2
        ba[0] = b1; //Line3
        for (Box b : ba)
            System.out.print(b.size + " ");
    }

答案是(4 4)因为,

  • 在第1行中,您正在将size的{​​{1}}初始化为5 构造
  • 在第2行中,您将两个对象作为方法的参数发送 Box。 b1引用的go()对象现在为5,size 对象具有大小6.在方法内部,您正在更改值 第一个参数从5到4.最后,您使用new Box(6);返回了数组ma 作为第一个元素,b2作为第二个元素。 b1的值为6,b2的值为4。
  • 现在在第3行中,您再次更改第一个元素的值 在数组内部。您替换了数组b1中的第一个元素,该元素的值为b2,其值为b1 现在的价值是4。

答案 1 :(得分:3)

以下是一些解释 -

1。首先,您在main()类中创建了Box -

 Box b1 = new Box(5);  

2. 然后将b1发送到go()方法 -

   Box[] ba = go(b1, new Bo(6));

现在b1.size是5

3。在方法go()中,您使用赋值语句将b1.size设置为4 -

b1.size = 4;  

4. 现在您要创建一个新的Box数组ma -

Box[] ma = { b2, b1 };  

在这个数组中,第一个元素是b2,b2.size是6.见第2点。

5. 然后返回ma,在第2点,返回的数组ma被分配ba。现在,数组的第一个元素是6,而数组的第二个元素是4.

6。 ba[0] = b1; - 此语句将ba[0]的第一个元素设置为b1。请注意,第2点b1.size设置为4.

现在ba[0].size是4
ba[1].size是4

这就是输出为4 4

的原因

答案 2 :(得分:2)

运行Box[ ] ba = go (b1, new Bo(6));时,go使用以下数组ba实例化[b2,b1],其中b2的大小为6,b1 }要清楚,go将b1的大小设置为5到4.当b1传递给go时,它将通过引用传递 ,这意味着对b1go的任何更改也都是对b1第一行中创建的main对象所做的更改。

然后运行以下代码:

ba[0] = b1;

在此,您需要在数组中设置b2(因为ba[0]引用b2)等于b1。现在,b2b1都引用了一个大小为4的框。

P.S。有趣的是,对象永远不会直接相等数据;对象只是对应引用到堆栈中其他位置写入的数据的地址。因此,从技术上讲,当ba[0] = b1;运行时,b2只是引用到b1所指的相同数据。

答案 3 :(得分:0)

在java中,所有原始类型都按值传递,而其余的,如对象或数组通过引用传递。 这意味着当你调用方法时

go(Box b1, Box b2)

它随处更改b1.size的值因为它设置b1.size = 4,所以结果是A:4 4