- ベストアンサー
Javaプログラムの比較と意味の同一性の確認
- Javaプログラムの比較:同じコード、異なる実装
- 2つのプログラムの意味の同一性を検証
- 実行結果は同じ
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
「つまり」の後で文章が消えちゃってますよ. さておき, 厳密に言えば「意味」は違います. 前者は ・int を引数にとる Base のコンストラクタを呼び出す 後者は ・Base のデフォルトコンストラクタを呼び出し, しかる後に Base のメンバ x に代入する だから. いずれにしても, 後者のような書き方を積極的にする理由は思いつきません.
その他の回答 (2)
- chie65536(@chie65535)
- ベストアンサー率44% (8801/19960)
>たとえば >Baseクラスの引数付のコンストラクタの方を >Base(int x){this.x=x*2;} >にした場合のことでしょうか? それは「副作用」ではなくて「仕様変更」でしょう。 Base(int x){this.x=x;System.out.println("xは"+x+"になりました");} とか、直接の動作には関係無いけど、何か「副次的な処理」をしてしまうのを「副作用」と言います。 直代入でも関数呼でも、どっちでやっても「xに指定した値が入る」のは一緒ですよね? でも、関数呼は副作用として「何かが表示」されてしまいます。 「何かが表示」の他にも「別のメンバ変数の値が書き換わる」とか「別の関数が呼ばれちゃう」とか、色々な副作用を書けます。
お礼
>>直接の動作には関係無いけど、何か「副次的な処理」をしてしまうのを「副作用」と言います。 なるほど。よく理解できました。 有難うございました。
- chie65536(@chie65535)
- ベストアンサー率44% (8801/19960)
>意味するものは全く同じでしょうか? >ちなみにこの2つは実行結果は同じになります。 実行結果が同じでも、意味する事はまったく違う。 関数呼び出し経由でメンバ変数を書き換える場合、関数側に「何らかの細工」を施せば、意図的に「副作用」を引き起こす事が出来るようになる。 メンバ変数に直接代入する場合、関数側に「何らかの細工」を施しても反映されず、メンバ変数が書き換わるだけの効果しか得られない。 片方は「関数呼び出しで起こる副作用を期待している」し、もう片方は「関数呼び出しで起こる副作用を回避している」ので、意味は異なる。 現状「関数に副作用が無い」ので、偶然、同じ動作をしてしまっているだけ。
お礼
回答有難うございます。 何らかの細工で動作が変わるようですが、 たとえばこのプログラムの場合、どう変えたら変わりますか?
補足
何らかの細工で副作用を引き起こすことが出来るというのは、 たとえば Baseクラスの引数付のコンストラクタの方を Base(int x){this.x=x*2;} にした場合のことでしょうか?
お礼
回答有難うございました。 おかげでほぼ理解できました。