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
我很难尝试理解此代码的结果。有谁可以向我解释结果?
答案 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)因为,
size
的{{1}}初始化为5
构造Box
。 b1引用的go()
对象现在为5,size
对象具有大小6.在方法内部,您正在更改值
第一个参数从5到4.最后,您使用new Box(6);
返回了数组ma
作为第一个元素,b2
作为第二个元素。 b1
的值为6,b2
的值为4。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
时,它将通过引用传递 ,这意味着对b1
内go
的任何更改也都是对b1
第一行中创建的main
对象所做的更改。
然后运行以下代码:
ba[0] = b1;
在此,您需要在数组中设置b2
(因为ba[0]
引用b2
)等于b1
。现在,b2
和b1
都引用了一个大小为4的框。
P.S。有趣的是,对象永远不会直接相等数据;对象只是对应或引用到堆栈中其他位置写入的数据的地址。因此,从技术上讲,当ba[0] = b1;
运行时,b2
只是将引用到b1
所指的相同数据。
答案 3 :(得分:0)
在java中,所有原始类型都按值传递,而其余的,如对象或数组通过引用传递。 这意味着当你调用方法时
go(Box b1, Box b2)
它随处更改b1.size的值因为它设置b1.size = 4,所以结果是A:4 4