>  Q&A  >  본문

java编程,函数内变量传递问题,为什么没有都改变呢?

代码如下:

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

阿神阿神2743일 전586

모든 응답(3)나는 대답할 것이다

  • 大家讲道理

    大家讲道理2017-04-18 10:53:11

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

    으아악

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-18 10:53:11

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

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-18 10:53:11

    갈게요, 갈게요

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

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

    회신하다
    0
  • 취소회신하다