こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

この2つのプログラムは全く同じものでしょうか?

class Base{
protected int x;

Base() { this.x=0;}
Base(int x) {this.x=x;}

void print(){ System.out.println("Base.x="+x);}
}

class Derived extends Base{
int x;

Derived(int x1,int x2){ super(x1); this.x=x2;}

void print(){ super.print(); System.out.println("Derived.x="+x);}
}

public class SuperTester{

public static void main(String[] args){
Base a =new Base(10);
System.out.println("----a----"); a.print();

Derived b=new Derived(20,30);
System.out.println("----b----"); b.print();
}
}

このプログラムと、
このプログラムのDerivedクラスのコンストラクタの部分を
Derived(int x1,int x2){ super.x=x1; this.x=x2;}
に変えたプログラムです。

かなりややこしいのですが、この2つのプログラムはソースは一部違いますが、
意味するものは全く同じでしょうか?
ちなみにこの2つは実行結果は同じになります。
【実行結果】
----a----
Base.x=10
----b----
Base.x=20
Derived.x=30

つまり、Derivedクラスでint x;を書かず、

よろしくお願いします。

投稿日時 - 2011-06-02 12:32:27

QNo.6780935

困ってます

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

「つまり」の後で文章が消えちゃってますよ.

さておき, 厳密に言えば「意味」は違います. 前者は
・int を引数にとる Base のコンストラクタを呼び出す
後者は
・Base のデフォルトコンストラクタを呼び出し, しかる後に Base のメンバ x に代入する
だから.

いずれにしても, 後者のような書き方を積極的にする理由は思いつきません.

投稿日時 - 2011-06-02 12:53:44

お礼

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

投稿日時 - 2011-06-02 13:55:18

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>たとえば
>Baseクラスの引数付のコンストラクタの方を
>Base(int x){this.x=x*2;}
>にした場合のことでしょうか?

それは「副作用」ではなくて「仕様変更」でしょう。

Base(int x){this.x=x;System.out.println("xは"+x+"になりました");}

とか、直接の動作には関係無いけど、何か「副次的な処理」をしてしまうのを「副作用」と言います。

直代入でも関数呼でも、どっちでやっても「xに指定した値が入る」のは一緒ですよね?

でも、関数呼は副作用として「何かが表示」されてしまいます。

「何かが表示」の他にも「別のメンバ変数の値が書き換わる」とか「別の関数が呼ばれちゃう」とか、色々な副作用を書けます。

投稿日時 - 2011-06-02 16:45:19

お礼

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

有難うございました。

投稿日時 - 2011-06-02 17:23:07

ANo.2

>意味するものは全く同じでしょうか?
>ちなみにこの2つは実行結果は同じになります。

実行結果が同じでも、意味する事はまったく違う。

関数呼び出し経由でメンバ変数を書き換える場合、関数側に「何らかの細工」を施せば、意図的に「副作用」を引き起こす事が出来るようになる。

メンバ変数に直接代入する場合、関数側に「何らかの細工」を施しても反映されず、メンバ変数が書き換わるだけの効果しか得られない。

片方は「関数呼び出しで起こる副作用を期待している」し、もう片方は「関数呼び出しで起こる副作用を回避している」ので、意味は異なる。

現状「関数に副作用が無い」ので、偶然、同じ動作をしてしまっているだけ。

投稿日時 - 2011-06-02 12:53:46

補足

何らかの細工で副作用を引き起こすことが出来るというのは、

たとえば
Baseクラスの引数付のコンストラクタの方を
Base(int x){this.x=x*2;}
にした場合のことでしょうか?

投稿日時 - 2011-06-02 14:09:00

お礼

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

投稿日時 - 2011-06-02 13:47:51