• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:コンストラクタと多重度)

コンストラクタと多重度

このQ&Aのポイント
  • コンストラクタと多重度について解説します。
  • オブジェクトのデフォルト値でオブジェクトBの参照の代入をしているか判定しています。
  • ary.length != 1は必ず必要です。インスタンス化の時にコンストラクタの実行がされるため、配列の場合はゴミが入ることはありません。多重度が0または1であることが分かります。

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

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

まず、コンパイルできないわよね、これ。 コンパイルできるようにしても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(){}は暗黙的に宣言されるので、別に書かなくてもいいけど。

peiee
質問者

お礼

b2 = new B(1)なので、b2[1]ってありませんね。 ところで、要素数2の配列データを要素数1の配列にセットした場合、2番目のデータは切り捨てられるのでしょうか? b2 = aryで考えると、インデックスを参照していないので、エラーにはなりませんか?

peiee
質問者

補足

回答ありがとうございます。  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という形で、できるのですか?

その他の回答 (2)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.3

「多重度」じゃなくて配列型 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; }

peiee
質問者

お礼

b2 = new B[1];の入力ミスでした。すいません。 「多重度」に関しては、解説がありました。 (1)多重度が1の関連 コンストラクタの引数にBクラスのオブジェクトを1つ取り、メンバ変数に代入します。 引数がnullの場合はBクラスのオブジェクトを生成し、メンバ変数に代入します。 (2)多重度が0もしくは1の関連 コンストラクタの引数にBクラスのオブジェクトを格納する配列を取り、メンバ変数に代入します。 引数の配列がnullまたは要素数が1以外の場合は、要素が1の配列を生成し、メンバ変数に代入します。 と書かれていました。 ありがとうございました。

peiee
質問者

補足

>配列型の初期化であって、要素は何も入っていない。 「要素数が1の配列を生成」の入力ミスでした。

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

非常に基本的なことを聞きたいんだけど, あなたのいう「多重度」って何? そして, #1 でも書かれてるんだけどやっぱり何をしたいのかが分からない.

peiee
質問者

補足

多重度とは、ここでは、AクラスのオブジェクトがBクラスのオブジェクトを幾つ参照しているかという意味です。 問題集のコーディングをそのまま書いています。 訳の分からないコーディングですが、JAVAの文法が理解できているか、確認するためのものだと思います。 if(ary == null || ary.length ! = 1){ は、 まだ配列Bクラスを生成しない(領域確保をしていない)場合、 生成しないで配列を参照したりすると実行時エラーになるため、 判定して、生成しているのではないかと思います。 この"ary.length ! = 1"は領域確保されているか判定しているのかな~。 要素数は1でした。b2[0]しかないですね。 回答ありがとうございました。

関連するQ&A