Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java变量未更改,即使在它指向的引用更改之后_Java_Variables_Scope - Fatal编程技术网

Java变量未更改,即使在它指向的引用更改之后

Java变量未更改,即使在它指向的引用更改之后,java,variables,scope,Java,Variables,Scope,我试图在result.next中赋值,但不知何故,当I=1迭代完成时,值并没有改变 初始结果为空 当i为0时的第一次迭代,result.next指向ListNode(10) 当i=1完成执行时,我期望ListNode(2)旁边的result.value,因为它引用了temp public void Mymethod() { ListNode result = null; ListNode temp = new ListNode(10); int j

我试图在result.next中赋值,但不知何故,当I=1迭代完成时,值并没有改变

初始结果为空

当i为0时的第一次迭代,result.next指向ListNode(10)

当i=1完成执行时,我期望ListNode(2)旁边的result.value,因为它引用了temp

public void Mymethod() {
        ListNode result = null;
        ListNode temp = new ListNode(10);
        int j = 0;
        for (int k = 0; k < 10; k++) {
            for (int i = 0; i < 2; i++) {
                if (j == 0) {
                    j++;
                    result = new ListNode(1);
                    result.next = temp;
                    continue;
                }
                temp = new ListNode(2);
            }
        }
    }
class ListNode {
    public int val;
    public ListNode next;

    ListNode(int x) {
        val = x;
        next = null;
    }
}
public void Mymethod(){
ListNode结果=null;
ListNode温度=新ListNode(10);
int j=0;
对于(int k=0;k<10;k++){
对于(int i=0;i<2;i++){
如果(j==0){
j++;
结果=新的ListNode(1);
result.next=温度;
持续
}
temp=新的列表节点(2);
}
}
}
类ListNode{
公共国际价值;
公共列表节点下一步;
ListNode(intx){
val=x;
next=null;
}
}
…因为它引用了temp

public void Mymethod() {
        ListNode result = null;
        ListNode temp = new ListNode(10);
        int j = 0;
        for (int k = 0; k < 10; k++) {
            for (int i = 0; i < 2; i++) {
                if (j == 0) {
                    j++;
                    result = new ListNode(1);
                    result.next = temp;
                    continue;
                }
                temp = new ListNode(2);
            }
        }
    }
class ListNode {
    public int val;
    public ListNode next;

    ListNode(int x) {
        val = x;
        next = null;
    }
}
否,它有一个引用的副本,该引用在
result.next=temp
行的
temp
中。但是
result.next
temp
之间没有持续的联系。稍后执行
temp=new ListNode(2)
时,会将
temp
的值更改为一个新引用,这对
结果没有任何影响。下一步

在内部循环的第一次迭代中的
result.next=temp
行之后,下面(大致)是我们内存中的内容:

[temp: Ref11243]−−−−−−−−−−−−−−−−−−−−−−−−−−+ | | | | +−−−−−−−−−−−−+ + −−>| ListNode | +−−−−−−−−−−−−−−−−+ | +−−−−−−−−−−−−+ [result: Ref89895]−−−>| ListNode | | | val: 10 | +−−−−−−−−−−−−−−−−+ | | next: null | | val: 1 | | +−−−−−−−−−−−−+ | next: Ref11243 |−−+ +−−−−−−−−−−−−−−−−+ 您有以下内容:

+−−−−−−−−−−−−+ [temp: Ref68545]−−−−−−−−−−−−−−−−−−−−−−−−−−−−−>| ListNode | +−−−−−−−−−−−−+ | val: 2 | | next: null | +−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−+ [result: Ref89895]−−−>| ListNode | +−−−−−−−−−−−−−−−−+ | val: 1 | +−−−−−−−−−−−−+ | next: Ref11243 |−−−−−>| ListNode | +−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−+ | val: 10 | | next: null | +−−−−−−−−−−−−+ +−−−−−−−−−−−−+ [温度:参考文献68545]−−−−−−−−−−−−−−−−−−−−−−−−−−−−−>| 列表节点| +−−−−−−−−−−−−+ |瓦尔:2| |下一个:空| +−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−+ [结果:参考文献895]−−−>| ListNode| +−−−−−−−−−−−−−−−−+ |瓦尔:1 |+−−−−−−−−−−−−+ |下一篇:参考文献11243|−−−−−>| 列表节点| +−−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−+ |瓦尔:10| |下一个:空| +−−−−−−−−−−−−+ 请注意
temp
的值是如何更改的,因此现在它指向一个不同的
ListNode
,即使用
newlistnode(2)
创建的新节点


在您询问的评论中:

我如何在这里提供一些链接?这样每当
temp
被更改时
result.next
就会开始指向新对象


不可以,Java没有任何变量引用的概念,只引用对象(包括数组)。

@Vipin请在更改内部循环中的条件后再次运行此代码。它应该可以正常工作。在temp=new ListNode(2)之后,result.next将指向视图中的位置?@UmairFarooq指向先前由
new ListNode(10)
返回的对象
temp
只是一个指针,而不是实际对象,因此指针可以指向一个新对象,并且它与以前指向的值不再有任何关系,因此我们在result中保存了引用。接下来,由于垃圾收集器不会清除以前的对象。对吗?“但是没有持续的链接”,你能帮我理解这一点吗?我怎样才能纠正这个问题?太好了。再次刷新了我的概念。你有一些清晰的概念。谢谢分享知识