java中是否存在函数中的变量不为';t链接?

java中是否存在函数中的变量不为';t链接?,java,Java,特别是,我想知道arg是否总是链接的,还是仅仅链接的,因为函数decloration是静态的 在我编写数千行代码之前,最好先知道它们是否有任何怪癖,希望它是单向的,但在1 edge的情况下不是 作为记录,我理解string=newstring[2]将创建一个新字符串,并且这些更改不会传播到main的string实例中 这里有一些示例代码来说明我所指的内容 public class TestLink { public static void changeValue(Object obje

特别是,我想知道arg是否总是链接的,还是仅仅链接的,因为函数decloration是
静态的

在我编写数千行代码之前,最好先知道它们是否有任何怪癖,希望它是单向的,但在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
放在那里的值

这怎么告诉我们答案是“不”? 如果有一个边缘案例,上面提到的这些都不起作用,那么就必须有一个边缘案例