按引用调用或按值调用
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
。现在,b2
和 b1
都指的是一个大小为 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 行中,您将
Box
的 size
初始化为 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
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
。现在,b2
和 b1
都指的是一个大小为 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 行中,您将
Box
的size
初始化为 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