Maison  >  Questions et réponses  >  le corps du texte

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 Il y a quelques jours583

répondre à tous(3)je répondrai

  • 大家讲道理

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

    Vos résultats seront certainement deux fois différents. En fait, c'est le même que celui ci-dessous.

    
    int x = 10;
    int y = x;
    y = 0;
    x ?

    répondre
    0
  • 怪我咯

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

    Ce qu'on appelle passer par référence en Java consiste essentiellement à transmettre l'adresse de l'objet. L'adresse est en fait passée par valeur. Grâce à cette adresse, la valeur de l'objet pointé dans la mémoire peut être modifiée. Changer la valeur de cette adresse n'a aucun sens sauf perdre le contrôle de l'objet réel.

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-18 10:53:11

    Je viendrai, je viendrai

    C'est très simple. Il suffit de comprendre que le passage par référence transfère une adresse. Une fois cette adresse passée, elle sera placée dans la variable locale de la méthode appelée. Il y a deux cadres de pile pour les deux méthodes, et chaque cadre de pile Ils ont leurs propres tables de variables locales et ne s'influencent pas les uns les autres. C'est pourquoi vous passez une référence puis changez le point de référence pour n'avoir aucune image de celui d'origine.

    Alors, pourquoi la valeur de val change-t-elle lorsque obj.val est modifié ? Parce que la valeur de val est stockée dans le tas, elle est copiée, modifiée, puis réécrite dans le tas, donc elle change. Si vous ne comprenez pas, vous pouvez continuer à poser des questions

    répondre
    0
  • Annulerrépondre