java编程,函数内变量传递问题,为什么没有都改变呢?
阿神
阿神 2017-04-18 10:51:11
0
3
623

代码如下:

public void test(BSTNode<T> z)
    {
        BSTNode<T> y;
        if (z.left != null){
            y = z.parent;
            BSTNode<T> a;
            a = y.left;
            if (y != null){
                System.out.println("before a             "+a);
                System.out.println("before y.left        "+y.left);
                System.out.println("befere z.parent.left "+z.parent.left);
                y.left = null;
                //a = null;
                System.out.println("after a              "+a);
                System.out.println("after y.left         "+y.left);
                System.out.println("after z.parent.left  "+z.parent.left);
            }
        }
    }

打印结果如下:
before a threadSleep.BSTree$BSTNode@15db9742
before y.left threadSleep.BSTree$BSTNode@15db9742
befere z.parent.left threadSleep.BSTree$BSTNode@15db9742
after a threadSleep.BSTree$BSTNode@15db9742
after y.left null
after z.parent.left null

请问 “after a ”为什么不是null?

或者将代码:

y.left = null;

            //a = null;

改为

//y.left = null;

a = null;

结果为:

before a threadSleep.BSTree$BSTNode@15db9742

before y.left threadSleep.BSTree$BSTNode@15db9742

befere z.parent.left threadSleep.BSTree$BSTNode@15db9742

after a threadSleep.BSTree$BSTNode@15db9742

after y.left null

after z.parent.left null

运行环境:

jdk1.8

阿神
阿神

闭关修行中......

모든 응답(3)
大家讲道理

결과는 확실히 두 번 달라집니다. 사실 아래 내용과 똑같습니다.

으아악
刘奇

Java에서 참조에 의한 전달이라는 것은 본질적으로 객체의 주소를 전달하는 것입니다. 주소는 실제로 값에 의해 전달됩니다. 이 주소를 통해 메모리에서 가리키는 객체의 값을 수정할 수 있습니다. 이 주소의 값을 변경하는 것은 실제 개체에 대한 제어권을 잃는 것 외에는 의미가 없습니다.

左手右手慢动作

갈게요, 갈게요

매우 간단합니다. 참조를 전달하면 주소가 전달되고, 두 가지 메서드에 대해 두 개의 스택 프레임이 저장됩니다. 각 스택 프레임에는 자체 지역 변수 테이블이 있으며 서로 영향을 미치지 않습니다. 이것이 바로 참조를 전달한 다음 원본 이미지가 없도록 참조점을 변경하는 이유입니다.

그러면 obj.val을 수정하면 val의 값이 변경되는 이유는 val의 값이 힙에 저장되어 있기 때문이며, 다시 힙에 기록되기 때문입니다. 이해가 안 되시면 계속 질문하셔도 됩니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿