- ベストアンサー
コンストラクタと多重度
- コンストラクタと多重度について解説します。
- オブジェクトのデフォルト値でオブジェクトBの参照の代入をしているか判定しています。
- ary.length != 1は必ず必要です。インスタンス化の時にコンストラクタの実行がされるため、配列の場合はゴミが入ることはありません。多重度が0または1であることが分かります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず、コンパイルできないわよね、これ。 コンパイルできるようにしてもif文意味ないし 何をやりたいのかさっぱりよ。 その時点でary.length ! = 1については何もいえないわ。 それはさておき、 > インスタンス化の時にコンストラクタの実行がされるみたいですが されるわね。 > 配列の場合、ゴミでも入るのでしょうか 配列の場合ってpublic A(B[] ary)のこと? ゴミがどこに入るといっているの? > インスタンス化する時以外でも、コンストラクタが実行されることがあるのですか ないわ。 何を聞きたいのかが良くわからないけど コンストラクタで多重度を表現するなら 0 or 1 class A { private B b1; public A(){} public A(B b){ b1 = b; } } 0 or 2 class A { private B b1; public A(){} public A(B[] b){ if (b != null && b.length == 2) { b1 = b; } } } でいいんじゃないかしら。 public A(){}は暗黙的に宣言されるので、別に書かなくてもいいけど。
その他の回答 (2)
- hrm_mmm
- ベストアンサー率63% (292/459)
「多重度」じゃなくて配列型 B[]か、通常クラス型 B かってことじゃあないの? 基本用語をまず勉強し直す必要がありそう。 で、問題集を写したと言うが打ち間違いがあるようだ。それとも間違い探し問題なのか? だったら、回答を教えてしまうことになるのかな?回答集は付いてないのか? public A(B[] ary){ if(ary == null || ary.length ! = 1){ /* 渡された配列型変数aryの要素数が1ではないので、手持ち変数を別途初期化しようとしている. この意味も完全に誤解しているようだ。*/ × b2 = new B(1) → b2 = new B[1]; でなくては、B[] b2 の型と一致しない。丸括弧と角括弧では意味が違うことを解ってないから打ち間違うのだろう。ここでやってるのは、配列型の初期化であって、要素は何も入っていない。 b2[0] = new B(); // b2の要素0番目にBクラスのインスタンスを代入 }else{ b2 = ary; }
お礼
b2 = new B[1];の入力ミスでした。すいません。 「多重度」に関しては、解説がありました。 (1)多重度が1の関連 コンストラクタの引数にBクラスのオブジェクトを1つ取り、メンバ変数に代入します。 引数がnullの場合はBクラスのオブジェクトを生成し、メンバ変数に代入します。 (2)多重度が0もしくは1の関連 コンストラクタの引数にBクラスのオブジェクトを格納する配列を取り、メンバ変数に代入します。 引数の配列がnullまたは要素数が1以外の場合は、要素が1の配列を生成し、メンバ変数に代入します。 と書かれていました。 ありがとうございました。
補足
>配列型の初期化であって、要素は何も入っていない。 「要素数が1の配列を生成」の入力ミスでした。
- Tacosan
- ベストアンサー率23% (3656/15482)
非常に基本的なことを聞きたいんだけど, あなたのいう「多重度」って何? そして, #1 でも書かれてるんだけどやっぱり何をしたいのかが分からない.
補足
多重度とは、ここでは、AクラスのオブジェクトがBクラスのオブジェクトを幾つ参照しているかという意味です。 問題集のコーディングをそのまま書いています。 訳の分からないコーディングですが、JAVAの文法が理解できているか、確認するためのものだと思います。 if(ary == null || ary.length ! = 1){ は、 まだ配列Bクラスを生成しない(領域確保をしていない)場合、 生成しないで配列を参照したりすると実行時エラーになるため、 判定して、生成しているのではないかと思います。 この"ary.length ! = 1"は領域確保されているか判定しているのかな~。 要素数は1でした。b2[0]しかないですね。 回答ありがとうございました。
お礼
b2 = new B(1)なので、b2[1]ってありませんね。 ところで、要素数2の配列データを要素数1の配列にセットした場合、2番目のデータは切り捨てられるのでしょうか? b2 = aryで考えると、インデックスを参照していないので、エラーにはなりませんか?
補足
回答ありがとうございます。 public A(B[] b){ の部分では、 要素数が幾つの配列が引数なのか分からないので初期化するのに if (b != null && b.length == 2) { b.length == 2が必要なのですね。 1ファイルに同じクラス名のクラスは1つだけ書けるのですか? if(ary == null || ary.length ! = 1){ の部分ですが、 public A(B b){ も、 public A(B[] ary){ も、 引数の数は1つで、参照型でしょうか? オブジェクト型の変数のb1,b2には、どちらの引数で呼ばれても、値をセットしたのか…。 自分のが呼ばれたわけではなくても、引数の数が同じで、参照型で、実行はしてしまうので、多重度が0の場合は、配列の生成をしてから、値をセットしたのか…。 多重度0or1の、多重度0がb2[0]、多重度1がb2[1]でしょうか? しかし多重度0はオブジェクトが無いということとは違うのでしょうか? 配列の初期化は、b1 = bという形で、できるのですか?