変更されたオブジェクトにJavaメソッドの値を再チューニング

Harshal Pawar:

私が思っていた理由でコードの下、法1()及び方法2()は動作が異なります。

場合ヘッドはのようなものです

Node head = new Node();
head.next = new Node();

method1には、 null以外のノードを返しますが、方法2はNULLを返します。


   Node method() {
        head = head.next;
        Node node = new Node();
        return node;

    }

    Node method1() {
        Node next = method();
        head.next = next;
        return head.next;
    }

    Node method2() {
        head.next = method();
        return head.next;
    }
マークRotteveel:

Java言語仕様のバージョン13、セクションで説明したよう15.26.1。単純な代入演算子は=、Javaは最初の割り当てに変数やフィールドを決定するために、式の左辺を評価し、それは式の右辺を評価します。

右側のタイプの場合、オペランド変数の型への代入互換性(ない5.2)、次いで、コンパイル時エラーが発生します。

それ以外の場合は、実行時に、式は次の3つの方法のいずれかで評価されます。

左オペランドの表現は、フィールドアクセス式である場合e.f15.11)、おそらくその後の括弧の一つ以上のペアで囲まれました:

  • まず、式がe評価されます。評価ならばe完了は突然、代入式は同じ理由で中途完了する。

  • 次に、右側のオペランドは評価されます。右手式の評価が中途完了した場合、代入式は同じ理由で中途完了する。

  • その後、フィールドがで示されている場合e.fではないstaticとの評価結果e上記をされnull、その後、 NullPointerExceptionスローされます。

  • そうでなければ、で示される変数はe.f上記で計算された右オペランドの値が割り当てられます。

[アレイアクセスを..skipping ..]

それ以外の場合は、3つのステップが必要です。

  • まず、左側のオペランドは、変数を生成するために評価されます。この評価が中途完了するならば、代入式は同じ理由で中途完了する。右側のオペランドは評価されず、代入は行われませんされていません。

  • それ以外の場合は、右側のオペランドが評価されます。この評価が中途完了するならば、代入式は同じ理由で中途完了し、代入は起こりません。

  • そうでなければ、右辺の値オペランドが左の変数の型に変換され、値のセットの変換(が施され§5.1.13、適切な標準値のセット(ない拡張指数値のセット)に)変換の結果を変数に格納されます。

他の言葉では、head.next = method()まず、head基本的には現在の値を格納する、評価されるheadスタック(又はそれを行うの挙動と等価)で、だけにしてれるmethod()呼ばれます。だから、の新しい値はhead見られません。何で起こることはmethod2()、基本的に同等です

Node localHead = head; // original value of head
localHead.next = method();
return head.next; // value of next field of new value of head (probably null)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=32755&siteId=1