質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.35%

java コンストラクタの初期化イメージと初期化ルール

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 582

score 9

Javaを勉強し始めたばかりの初心者です。
コンストラクタの初期化イメージを教えてください。

発生している問題・エラーメッセージ

以下のような形で「test[i] = new testC();」をせずにRunしたところ、NullPointerExceptionが発生。
ネットで調べてNullを初期化する必要があるということで入れましたが、これを入れた後、このStringやIntが入り混じった
test[]がコンストラクタでどうやって初期化されていくかイメージがわきません。
(そもそも一行目の「testC[] test= new testC[3]」で初期化されているイメージでした。)

また一方でこういった初期化をせずに「testC[] test= new testC[3]」
だけで直接値を入れても問題ないこともありましました。

問題が見えておらず、別なところで初期化ができていただけなのかもしれませんが、
この部分のアドバイスをいただければ幸いです。

testC[] test= new testC[3];
for (int i = 0; i < 3; i++) {
test[i] = new testC();  // --> コンストラクタで初期化 → 初期化のイメージがわきません。
}
for (int i = 0; i < 3; i++) {
test[i].Name = test[i*4];                        //String でtest[i]へ格納
test[i].qty = Integer.parseInt(test[(i*4)+1].trim());        //Int でtest[i]へ格納
test[i].unit = test[(i*4)+2];                     //String でtest[i]へ格納
test[i].unitPrice = Float.parseFloat(test[(i*4)+3].trim());    //Float  でtest[i]へ格納
}

public class testC {
String Name;
int qty;
String unit;
float unitPrice;

testC(){
}

testC (String Name , int qty , String unit , float unitPrice) {
this.Name = Name;
this.qty = qty;
this.unitPrice = unitPrice;
this.unit = unit;
}
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

最初に

  • オブジェクトの配列のインスタンス化をするときはObject[] array = new Object[3];
  • オブジェクト単体のインスタンス化をするときはObject element = new Object();

と書きます。

掲示しているコードで言うならば
testC[] test= new testC[3];が前者で
test[i] = new testC();が後者です。

回答

test[i]というのは配列全体を指している訳ではなくtestという配列の中の1つの要素を指しています。
ですから、test[0]test[1]test[2]も全て1つのオブジェクトを保持するだけの入れ物にしか過ぎません。

書き方を変えてみましょう。
下記のコードでも同様の動作をすると思います。

testC[] test= new testC[3];
for (int i = 0; i < 3; i++) {
    testC t = new testC(); //オブジェクトをインスタンス化をして
    test[i] = t; //そのオブジェクトを配列の1要素に保持
}

おそらく、「配列」と「配列の要素」を混同されているのではないでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/23 14:02

    ひとつ追加で教えてください。このtestC t = new testC();をループから外出しするとどういう動きになるのですか?
    値が変になってしまったので気になっています。

    キャンセル

  • 2019/09/23 15:56 編集

    今回の質問は「「testC[] test= new testC[3]」だけで直接値を入れても問題ない」かどうかが主旨という認識です。次から主旨に直接関連しない新たな疑問が沸いた際は別途質問を立ててください。
    ※私の認識が違う場合は質問を編集して主旨が分かるよう書いてください。

    というのを踏まえて「testC t = new testC();をループから外出しすると」どうなるかをお答えすると、testという配列の各要素に同じ物を指すインスタンス(t)が格納されます。よってtest[0].Nameを変えればtest[0]、test[1]、test[2]全てのNameが変えた値になります。

    詳しくは「Java 参照型」「Java 参照型変数」などと調べてください。

    キャンセル

  • 2019/09/25 21:31

    どうもありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る