java中是否存在函数中的变量不为';t链接?
特别是,我想知道arg是否总是链接的,还是仅仅链接的,因为函数decloration是java中是否存在函数中的变量不为';t链接?,java,Java,特别是,我想知道arg是否总是链接的,还是仅仅链接的,因为函数decloration是静态的 在我编写数千行代码之前,最好先知道它们是否有任何怪癖,希望它是单向的,但在1 edge的情况下不是 作为记录,我理解string=newstring[2]将创建一个新字符串,并且这些更改不会传播到main的string实例中 这里有一些示例代码来说明我所指的内容 public class TestLink { public static void changeValue(Object obje
静态的
在我编写数千行代码之前,最好先知道它们是否有任何怪癖,希望它是单向的,但在1 edge的情况下不是
作为记录,我理解string=newstring[2]changeValue()
中的code>将创建一个新字符串,并且这些更改不会传播到main
的string
实例中
这里有一些示例代码来说明我所指的内容
public class TestLink {
public static void changeValue(Object object) {
object.foo = "changed";
}
public static void changeValue(String[] string) {
string[0] = "changed";
}
public static void main(String[] args) {
String[] string = new String[2];
string[0] = "not changed";
changeValue(string);
if (string[0].equals("not changed")) {
System.out.println("not linked");
} else {
System.out.println("linked");
}
System.out.println(string[0]);
/*
output:
linked
changed
*/
}
}
从问题中的代码来看,听起来您真正想问的是:“是否存在一种边缘情况,我将数组引用传递到一个方法并修改其内容,但这种修改实际上没有发生?”
不,没有。让我们提取一些代码并更改一些名称,以避免误导:
public static void changeValue(String[] arg) {
arg[0] = "changed";
}
public static void main(String[] args) {
String[] foo = new String[2];
foo[0] = "not changed";
changeValue(foo);
if (foo[0].equals("not changed")) {
System.out.println("not linked");
} else {
System.out.println("linked");
}
System.out.println(foo[0]);
}
changeValue
接受数组引用(指向数组的值),并更改该数组的内容。如果代码编译(例如,所有类型等都是正确的)并且在运行时没有抛出(您没有将null
或零长度数组传递到changeValue
),那么不,没有边缘情况不起作用
代码里是怎么回事?
如果我们深入研究代码中发生了什么,我们可以看到为什么答案是“否”。我发现图片可以帮助我们,所以让我们在这方面加入一些ASCII艺术
这一行:
String[] foo = new String[2];
在内存中为我们提供了以下信息:
+----------+
foo(ref 5426)---->| String[] |
+----------+
| 0: null |
| 1: null |
+----------+
给我们:
+-------------+
foo(ref 5426)---->| String[] |
+-------------+ +---------------+
| 0: ref 1897 |---->| String |
| 1: null | +---------------+
+-------------+ | "not changed" |
+---------------+
它从foo
获取值,并将该值传递给changeValue
changeValue
接收参数arg
中的值。现在我们有了这个:
+-------------+
foo(ref 5426)--+->| String[] |
| +-------------+ +---------------+
| | 0: ref 1897 |---->| String |
| | 1: null | +---------------+
| +-------------+ | "not changed" |
| +---------------+
arg(ref 5426)--+
这给了我们:
+-------------+ +---------------+
foo(ref 5426)--+->| String[] | | String |
| +-------------+ +-----------+ +---------------+
| | 0: ref 2785 |---->| String | | "not changed" |
| | 1: null | +-----------+ +---------------+
| +-------------+ | "changed" |
| +-----------+
arg(ref 5426)--+
+-------------+ +---------------+
foo(参考文献5426)--+->字符串[]| |字符串|
| +-------------+ +-----------+ +---------------+
||0:ref 2785 |------>| String | |“未更改”|
|| 1:null |+-------------++---------------+
|+------------+|“已更改”|
| +-----------+
arg(参考文献5426)--+
数组中的第一个条目不再指向旧字符串,而是将该值替换为指向新字符串的新值。(旧字符串一直挂起,直到垃圾回收器处理掉它,但我们不再关心它,我们没有任何引用。)
changeValue
完成,因此它返回,并且arg
(参数)消失
由于foo
仍然具有相同的值(ref 5426
),当您在其中查找第一个条目时,您会看到changeValue
放在那里的值
这怎么告诉我们答案是“不”?
对于上述不起作用的边缘案例,必须有以下情况之一:
- 将
foo
的值传递到changeValue
中,并将其作为arg
接收,但由于某种原因无法工作
- 将
foo
的值传递到changeValue
中,并将其作为arg
接收,出于某种原因复制数组
- 当我们使用它来获取数组并对其进行更改时,我们从中获得的
ref 5426
存在一些差异
没有发生上述任何情况的边缘案例。:-) 从问题中的代码来看,听起来你真正想问的是:“是否存在一种边缘情况,我将数组引用传递给一个方法并修改其内容,但这种修改实际上没有发生?”
不,没有。让我们提取一些代码并更改一些名称,以避免误导:
public static void changeValue(String[] arg) {
arg[0] = "changed";
}
public static void main(String[] args) {
String[] foo = new String[2];
foo[0] = "not changed";
changeValue(foo);
if (foo[0].equals("not changed")) {
System.out.println("not linked");
} else {
System.out.println("linked");
}
System.out.println(foo[0]);
}
changeValue
接受数组引用(指向数组的值),并更改该数组的内容。如果代码编译(例如,所有类型等都是正确的)并且在运行时没有抛出(您没有将null
或零长度数组传递到changeValue
),那么不,没有边缘情况不起作用
代码里是怎么回事?
如果我们深入研究代码中发生了什么,我们可以看到为什么答案是“否”。我发现图片可以帮助我们,所以让我们在这方面加入一些ASCII艺术
这一行:
String[] foo = new String[2];
在内存中为我们提供了以下信息:
+----------+
foo(ref 5426)---->| String[] |
+----------+
| 0: null |
| 1: null |
+----------+
给我们:
+-------------+
foo(ref 5426)---->| String[] |
+-------------+ +---------------+
| 0: ref 1897 |---->| String |
| 1: null | +---------------+
+-------------+ | "not changed" |
+---------------+
它从foo
获取值,并将该值传递给changeValue
changeValue
接收参数arg
中的值。现在我们有了这个:
+-------------+
foo(ref 5426)--+->| String[] |
| +-------------+ +---------------+
| | 0: ref 1897 |---->| String |
| | 1: null | +---------------+
| +-------------+ | "not changed" |
| +---------------+
arg(ref 5426)--+
这给了我们:
+-------------+ +---------------+
foo(ref 5426)--+->| String[] | | String |
| +-------------+ +-----------+ +---------------+
| | 0: ref 2785 |---->| String | | "not changed" |
| | 1: null | +-----------+ +---------------+
| +-------------+ | "changed" |
| +-----------+
arg(ref 5426)--+
+-------------+ +---------------+
foo(参考文献5426)--+->字符串[]| |字符串|
| +-------------+ +-----------+ +---------------+
||0:ref 2785 |------>| String | |“未更改”|
|| 1:null |+-------------++---------------+
|+------------+|“已更改”|
| +-----------+
arg(参考文献5426)--+
数组中的第一个条目不再指向旧字符串,而是将该值替换为指向新字符串的新值。(旧字符串一直挂起,直到垃圾回收器处理掉它,但我们不再关心它,我们没有任何引用。)
changeValue
完成,因此它返回,并且arg
(参数)消失
由于foo
仍然具有相同的值(ref 5426
),当您在其中查找第一个条目时,您会看到changeValue
放在那里的值
这怎么告诉我们答案是“不”?
如果有一个边缘案例,上面提到的这些都不起作用,那么就必须有一个边缘案例