JavaRush /Java 博客 /Random-ZH /Java中传递参数
vincent_vega
第 24 级
Gainesville

Java中传递参数

已在 Random-ZH 群组中发布
Java 中的变量是一个包含值的容器。那么“传递”变量是什么意思呢?原始数据类型和引用数据类型有什么区别。
Java 中传递参数 - 1
我们稍后会讨论这个问题。我们先从一个简单的作业开始。这段代码的作用:
int х = 3;
int у = х;
在第 1 行,创建了一个 int 类型的变量x并分配了值 3。在第 2 行,创建了一个 int 类型的变量y并分配了变量x的值。将来,变量x不会以任何方式影响yJava 复制x (3)的值并将其放入y中。这是按值传递参数。您不会将一个变量写入另一个变量。该值被复制并分配给新变量。表达式y = x; 并不意味着“将x写入y ”。它的意思是“复制x中的值并将该副本写入y ”。如果以后我改变y
у = 34;
这会影响x吗?当然不是。x 的值仍然是 3。如果我稍后更改x
х = 90;
这将如何影响y?决不。分配后(复制值),它们不以任何方式相关。 那么引用类型呢?它们是如何工作的? 没那么难,其实规则是一样的。链接做同样的事情——你会得到链接的副本。所以如果我说:
Cat A = new Cat ();
Cat B = A;
链接A被复制到链接B。这不适用于该对象 - 您仍然只有一个对象。但现在您有两个不同的引用控制同一个Cat对象。 现在让我们看看如何将参数传递给方法。 Java 按值传递参数。总是。 这意味着“复制值并传递副本”。对于原始类型来说很简单:
int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
doStuff 方法如下所示:
void doStuff (int у) {

   / / Действия с 'y'
}
x 值的副本(即 5)被传递给doStuff()方法。doStuff()方法有自己的变量,称为yy变量是一个新的、不同的变量。将x传递给方法时的内容的副本。从现在起,yx不再相互影响。当您更改y时,不会影响x
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
反之亦然 - 如果您更改x,您将不会更改y在这种情况下x所做的唯一事情就是复制它的值并将其传递给doStuff()方法。 “按值传递”如何与引用一起使用? 太多人说,“Java 按值传递基本类型,按引用传递对象”。这不是他们说的。Java 按值传递一切。使用原语,您可以获得内容的副本。通过链接,您还可以获得内容的副本。但链接的内容是什么?遥控。用于管理/访问该设施的设施。当您将对对象的引用传递给方法时,您正在传递该引用的副本。远程控制克隆。该对象仍然位于创建它的堆中,等待有人使用遥控器。该设施并不关心有多少个遥控器被“编程”来控制它。唯一关心这个的人是垃圾收集器和你,程序员。所以当你说:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
只有一个Cat对象。但现在两个远程控制(链接)可以访问同一个Cat对象。所以现在无论BCat对象做什么都会影响A指向的Cat,但不会影响A的内容!您可以使用新链接B(直接从A复制)更改Cat ,但不能更改A。这到底是什么意思?您可以更改A引用的对象,但无法更改A 的引用- 将其重定向到另一个对象或null因此,如果您更改B的引用(不是B引用的实际Cat对象,而是引用本身的值),您将不会更改A的值。反之亦然。所以:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
它只是意味着B指向另一个对象。小A还是很高兴的。请跟我重复一遍: Java 按值传递所有内容。 (好吧,再来一次……带着感觉。) Java 按值传递一切。 对于基本类型,您传递当前值的副本,对于对象引用,您传递引用的副本(远程控制)。你永远不会传递这个物体。所有对象都存储在堆上。总是。现在煮一大杯咖啡并编写一些代码! 来源文章。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION