• ベストアンサー

代入式の後に左辺の値が変わると右辺の値が変わる

以下のような式があるとします。 クラス val = (クラス)session.getAttribute(アトリビュート名); ここで、valに値を設定します。 val.x = "a1"; val.y = "b1"; この時、eclipseの監視で、session.getAttribute(アトリビュート名) の値を見ると、 x や y にa1やb1が設定されてるのですが、 このような事って起こるのでしょうか? (つまり代入式の後に、左辺の値を変えると、右辺のsession.getAttribute(アトリビュート名)の 値も変わった)

質問者が選んだベストアンサー

  • ベストアンサー
  • co_maam
  • ベストアンサー率65% (13/20)
回答No.2

起こります。 session.getAttribute()メソッドは、セッションに保持したオブジェクトを取得するメソッドです。 重要なことは、取得したオブジェクトは仮に変数に代入したとしてもセッションに保持したオブジェクトであるということです。 したがって、 > クラス val = (クラス)session.getAttribute(アトリビュート名); を更に下のように書き換えてみます。 「クラス 'セッションに保持するオブジェクト' = (クラス)session.getAttribute(アトリビュート名);」 すると、 > val.x="a1"; > val.y="b1"; はそれぞれ、 'セッションに保持するオブジェクト'.x="a1"; 'セッションに保持するオブジェクト'.y="b1"; となります。 そして、上の代入のあとsession.getAttribute()メソッドでセッションに保持するオブジェクトのフィールドの値を確認するとどうなっているかといいますと、上の代入で'セッションに保持するオブジェクト'のフィールドに代入をしていますから、代入された値が確認できると思います。 以上です。

evaan
質問者

お礼

ご回答、どうもありがとうございます。

その他の回答 (2)

回答No.3

valの型はクラスではなくオブジェクトですね Object val = session.getAttribute(アトリビュート名); ここで valに代入しているのは オブジェクトの実体ではなく オブジェクトへの参照です。 上記の式を実行後 valが参照するオブジェクトと sessionから getAttributeから返されたオブジェクトの実体は1つです。 よって いずれか一方でオブジェクト内の変数を更新した結果は 左辺のvalにも右辺のsession.getAttribute(アトリビュート名)の オブジェクトいずれにも反映されます。 これを別のオブジェクトとして使いたい場合は たとえば取得したオブジェクト を複製した結果を代入する方法があります。 Object val = session.getAttribute(アトリビュート名).clone(); cloneは Objectクラスのメソッドですが 全てのオブジェクトで使える ものではないので注意してください。 上は 例として書いただけで 処理としてはNGで実行時に例外がスロー されるかも知れません。 理由は質問の内容から外れるので省略します。

evaan
質問者

お礼

ご回答、どうもありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

うん, ありえる. 例えば public class Foo { public static void main(String [] args) { Foo x = new Foo(); Foo y = x; y.a = 4; System.out.println(x.a); } int a = 0; } で何が出力されると思いますか?

evaan
質問者

お礼

ご回答、どうもありがとうございます。

関連するQ&A