質問: new Sample(new B()); s.method(); } } ```
回答: > > 混乱部分1 > > private A aはフィールド宣言+このクラスでしか使えない。 > > それをコンストラクタの引数に渡している?どうゆうこと?となっています。 > > > 認識が、そもそも違います。 3の部分を見ればわかると思います > > 混乱部分2 > > こんなインスタンスの生成の仕方あるの?と混乱しています。 > > > はい。あります。 冗長に書くなら ``` A tmp = new B(); Sample s = new Sample(tmp); ``` > > 混乱部分3 > > そもそもこのコードはどのような目的のコードなのか(中略) > > この3行の意味が知りたいです。 > > > 目的は、本来は他人がわかるものでないですが おそらく、以下の`new B()`の部分を、`new C()`や`new A()`にしたさいに `s.method()`の表示内容が異なる(ポリモーフィズム)の確認だろうと思います。 ``` Sample s = new Sample(new B()); s.method(); ``` そもそもの3行の意味ですが、フィールドの定義とコンストラクタの定義および コンストラクタでの値の保存となります。 フィールド名とコンストラクタの仮引数名が同じ名前で、混乱しているのと思いますが 名前を変えれば理解できると思います。 ``` public class Sample { private A hozon; public Sample(A kariHikisu){ hozon = kariHikisu; } public void method(){ hozon.test(); } } ``` Sampleクラスが、あまり役に立っていなくて(教本の後の方で意味がわかるかもしれませんが) 単純にA,B,Cだけ使うなら ``` A[] sample = {new A(), new B(), new C()}; int i = 0; sample[i++].test(); // A sample[i++].test(); // B sample[i++].test(); // C ``` で、十分かなぁ。 ポイントは、Aという型で継承しているBもCも同じ配列で扱えるということ メソッド名は同じなので、まったく同じコードで挙動の異なる振る舞いが実現できる。 ※上記では3回呼び出してますがforループで書けます > > こんなインスタンスの生成の仕方あるの?と混乱しています。 > > > インスタンスを後で使わないなら以下ように書くこともあります。 ``` new Sample(new A()).method(); // A new Sample(new B()).method(); // B new Sample(new C()).method(); // C ```