按引用调用或按值调用

Call by reference-or- 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

我很难理解这段代码的结果。谁能给我解释一下结果?

Box[ ] ba = go (b1, new Bo(6)); 为 运行 时,go 使用以下数组实例化 ba[b2,b1],其中 b2 的大小为6 和 b1 的大小为 4。要明确的是,go 将 b1 的大小从 5 设置为 4。当 b1 传递给 go 时,它由 reference,这意味着在 go 中对 b1 的任何更改也是对在 [=22= 的第一行中创建的 b1 对象所做的更改].

那么下面的代码就是运行:

ba[0] = b1;

在这里,您从数组中设置 b2(因为 ba[0] 指的是 b2)等于 b1。现在,b2b1 都指的是一个大小为 4 的框。

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

在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 行中,您将 Boxsize 初始化为 5 构造函数。
  • 在第 2 行中,您将两个对象作为参数发送给该方法 go()。 b1 引用的对象的 size 现在是 5 而 new Box(6); 对象的大小为 6。在方法内部,您正在更改的值 第一个参数从 5 到 4。最后你用 b2 返回数组 ma 作为第一个元素,b1 作为第二个元素。 b2 的值为 6,b1 的值为 4。
  • 现在在第 3 行中,您再次更改第一个元素的值 数组里面。您用 b1 替换了数组 b2 中值为 6 的第一个元素 现在的值为 4。

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

go(Box b1, Box b2)

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

这里有一些解释 -

1. 首先你在 main() class -

中创建了一个 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. 然后你 return ma 并且在第 2 点 returned 数组 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