0
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

4 回答 4

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 行中,您在构造函数中将 of 初始化为size5 。Box
  • 在第 2 行中,您将两个对象作为参数发送给方法 go()sizeb1 引用的对象的现在是 5,对象new Box(6); 的大小为 6。在方法内部,您将第一个参数的值从 5 更改为 4。最后您返回ma的数组b2 作为第一个元素和b1第二个元素。b2有值 6​​ 并且b1有 4。
  • 现在在第 3 行中,您再次更改数组中第一个元素的值。您将数组b2中第一个值为 6的元素替换为b1现在的值为 4。
于 2015-03-24T21:01:10.397 回答
3

这里有一些解释——

1.首先你Box在 main() 类中创建了一个 -

 Box b1 = new Box(5);  

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

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

现在b1.size是5

3.b1.size在 go() 方法中,您使用赋值语句 设置为 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]to b1。注意点 2b1.size设置为 4。

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

这就是为什么输出是4 4

于 2015-03-24T21:11:18.820 回答
2

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

然后运行以下代码:

ba[0] = b1;

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

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

于 2015-03-24T20:58:46.280 回答
0

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

go(Box b1, Box b2)

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

于 2015-03-24T21:03:21.590 回答