• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:この2つのプログラムは全く同じものでしょうか?)

Javaプログラムの比較と意味の同一性の確認

このQ&Aのポイント
  • Javaプログラムの比較:同じコード、異なる実装
  • 2つのプログラムの意味の同一性を検証
  • 実行結果は同じ

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

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

「つまり」の後で文章が消えちゃってますよ. さておき, 厳密に言えば「意味」は違います. 前者は ・int を引数にとる Base のコンストラクタを呼び出す 後者は ・Base のデフォルトコンストラクタを呼び出し, しかる後に Base のメンバ x に代入する だから. いずれにしても, 後者のような書き方を積極的にする理由は思いつきません.

wooyan_52
質問者

お礼

回答有難うございました。 おかげでほぼ理解できました。

その他の回答 (2)

回答No.3

>たとえば >Baseクラスの引数付のコンストラクタの方を >Base(int x){this.x=x*2;} >にした場合のことでしょうか? それは「副作用」ではなくて「仕様変更」でしょう。 Base(int x){this.x=x;System.out.println("xは"+x+"になりました");} とか、直接の動作には関係無いけど、何か「副次的な処理」をしてしまうのを「副作用」と言います。 直代入でも関数呼でも、どっちでやっても「xに指定した値が入る」のは一緒ですよね? でも、関数呼は副作用として「何かが表示」されてしまいます。 「何かが表示」の他にも「別のメンバ変数の値が書き換わる」とか「別の関数が呼ばれちゃう」とか、色々な副作用を書けます。

wooyan_52
質問者

お礼

>>直接の動作には関係無いけど、何か「副次的な処理」をしてしまうのを「副作用」と言います。 なるほど。よく理解できました。 有難うございました。

回答No.2

>意味するものは全く同じでしょうか? >ちなみにこの2つは実行結果は同じになります。 実行結果が同じでも、意味する事はまったく違う。 関数呼び出し経由でメンバ変数を書き換える場合、関数側に「何らかの細工」を施せば、意図的に「副作用」を引き起こす事が出来るようになる。 メンバ変数に直接代入する場合、関数側に「何らかの細工」を施しても反映されず、メンバ変数が書き換わるだけの効果しか得られない。 片方は「関数呼び出しで起こる副作用を期待している」し、もう片方は「関数呼び出しで起こる副作用を回避している」ので、意味は異なる。 現状「関数に副作用が無い」ので、偶然、同じ動作をしてしまっているだけ。

wooyan_52
質問者

お礼

回答有難うございます。 何らかの細工で動作が変わるようですが、 たとえばこのプログラムの場合、どう変えたら変わりますか?

wooyan_52
質問者

補足

何らかの細工で副作用を引き起こすことが出来るというのは、 たとえば Baseクラスの引数付のコンストラクタの方を Base(int x){this.x=x*2;} にした場合のことでしょうか?