0

重複の可能性:
Java、値渡し、参照変数

私は、JAVAの値渡しがオブジェクトでどのように機能するかについて少し混乱しています。たとえば、オブジェクトをパラメータとしてメソッドに渡す場合です。そのアドレスが値として渡されることを理解しています。わかりました。オブジェクトの複製は、オブジェクトが渡される元の場所のフォームに保持されます。呼び出されたAPIでオブジェクトへの新しい参照を作成し、その中で何かを変更しても、呼び出し元に反映されないためです。 API。

以下は、ツリーを削除しようとしたが、まだそこにある典型的なコードです。

public class DeleteTree {

public static void main(String[] args) {

    Node root = new Node(5);
    for(int i = 0 ; i < 10 ; i++){
        if(i == 5) continue;
        root.insertNode(i);
    }

    deleteTreeNonRecursive(root);
    System.out.println(root.key);

}

public static void deleteTreeNonRecursive(Node root){

    Queue<Node> q = new LinkedList<Node>();
    q.add(root);
    while(!q.isEmpty()){
        Node temp = q.poll();
        if(temp.leftChild != null)q.add(temp.leftChild);
        if(temp.rightChild != null)q.add(temp.rightChild);
        temp = null;
    }

}

予期されるO/P: nullpointer例外。

実際のO/P: 5。

4

2 に答える 2

1

Java常に値渡しを使用します。オブジェクト参照に関して渡されるのは、参照の値です。オブジェクト参照を渡すと、渡されるのは参照値のコピーです。これを使用すると、いつでもオブジェクトにアクセスしてそのプロパティを変更できます(該当する場合)が、その参照を別のオブジェクトまたはnullに割り当てても、呼び出し元のメソッドの元の参照に明らかに影響はありません。

于 2013-01-23T04:08:57.687 に答える
1

Javaでは、常にオブジェクトへの参照を値で渡します(オブジェクト自体はヒープに割り当てられます)。ポインタを渡すだけなので、重複は発生しません。

あなたの例では、設定しているだけですtemp = nullが、tempがへのポインタであるという理由だけでこれは実際には何もしませんがNode、それは関数に対してローカルな変数ですnull。元のオブジェクトに設定すると、値を変更しているという理由だけでまったく触れられません。参照されるオブジェクトを変更せずに参照の。

ツリーを削除するには、これが必要な唯一のものです。

Node root = new Node(5);
    for(int i = 0 ; i < 10 ; i++){
        if(i == 5) continue;
        root.insertNode(i);
    }

root = null;
于 2013-01-23T04:10:27.183 に答える