私が思っていた理由でコードの下、法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;
}
Java言語仕様のバージョン13、セクションで説明したよう15.26.1。単純な代入演算子は=、Javaは最初の割り当てに変数やフィールドを決定するために、式の左辺を評価し、それは式の右辺を評価します。
右側のタイプの場合、オペランド変数の型への代入互換性(ない5.2)、次いで、コンパイル時エラーが発生します。
それ以外の場合は、実行時に、式は次の3つの方法のいずれかで評価されます。
左オペランドの表現は、フィールドアクセス式である場合
e.f
(15.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)