- PR -

フィールドのインスタンス変数について

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/05/16
投稿数: 6
投稿日時: 2006-09-04 08:29
あるClassAというクラスが宣言されている。
そのなかで public ClassA(String name) ・・・というコンストラクタが定義されている。

別のクラス(MainClass)のフィールドで以下のようなインスタンス変数を宣言し初期化する。
ClassA abc = new ClassA("英語");

このとき自分は変数abcが参照するインスタンスが生成されるものだと
思っていたのですが、生成されないようです。
それはMainClassのインスタンスが新たに生成されない以上、abcの
インスタンスも生成されないというのです。
だとしたらMainClassのフィールドでインスタンス変数である基本データ型
(たとえばint a = 100;) とした場合でも、MainClassのインスタンスが作られるまで
aは100で初期化されないのでしょうか。

よく分からないので、ご教示お願いいたします。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-09-04 09:06
引用:

未記入さんの書き込み (2006-09-04 08:29) より:
あるClassAというクラスが宣言されている。
そのなかで public ClassA(String name) ・・・というコンストラクタが定義されている。

別のクラス(MainClass)のフィールドで以下のようなインスタンス変数を宣言し初期化する。
ClassA abc = new ClassA("英語");

このとき自分は変数abcが参照するインスタンスが生成されるものだと
思っていたのですが、生成されないようです。
それはMainClassのインスタンスが新たに生成されない以上、abcの
インスタンスも生成されないというのです。
だとしたらMainClassのフィールドでインスタンス変数である基本データ型
(たとえばint a = 100;) とした場合でも、MainClassのインスタンスが作られるまで
aは100で初期化されないのでしょうか。

よく分からないので、ご教示お願いいたします。



意味がわかんない・・・
aが初期化されるかどうかは実装次第なのに。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-09-04 09:15
インスタンス変数というのは、インスタンス一つにつき一組ずつ存在するものですよね。インスタンスが生成されなければ、インスタンス変数は存在しないでしょ。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-09-04 09:17
引用:

(たとえばint a = 100;) とした場合でも、MainClassのインスタンスが作られるまで
aは100で初期化されないのでしょうか。



インスタンスのメンバ変数ですから、インスタンス生成されるまで初期化されないとい
うか、存在自体していない状態になります。

※なんとか読み下そうとしましたが、これが限界でございました。
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2006-09-04 09:20
何を仰りたいのかが分りにくいです。

いったい何をしたかったのでしょうか。
ClassA abc = new ClassA("英語");
をしないうちに
ClassAの変数aを参照したい、ということですか?
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2006-09-04 09:25
引用:

未記入さんの書き込み (2006-09-04 08:29) より:
あるClassAというクラスが宣言されている。
そのなかで public ClassA(String name) ・・・というコンストラクタが定義されている。

別のクラス(MainClass)のフィールドで以下のようなインスタンス変数を宣言し初期化する。
ClassA abc = new ClassA("英語");



つまり以下のような状態でしょうか?

コード:
public class ClassA {
    /** フィールド */
    private String name;
    /** コンストラクタ */
    public ClassA(String name) {
        this.name = name;
    }
}

public class MainClass {
    /** フィールド */
    ClassA abc = new ClassA("英語");
}



引用:

未記入さんの書き込み (2006-09-04 08:29) より:
このとき自分は変数abcが参照するインスタンスが生成されるものだと
思っていたのですが、生成されないようです。



「このとき」とはどのときでしょう?
「ソースコードを書いたとき」であれば当然インスタンスは生成されませんね
実行したときでしょうか?
少なくとも
MainClass b = new MainClass();
とすればフィールドabcにはClassAのインスタンスが格納されますね。

引用:

未記入さんの書き込み (2006-09-04 08:29) より:
だとしたらMainClassのフィールドでインスタンス変数である基本データ型
(たとえばint a = 100;) とした場合でも、MainClassのインスタンスが作られるまで
aは100で初期化されないのでしょうか。



では問題です。
「作られていないMainClassのフィールドが初期化されている状態」
とはどんな状態でしょうか?
作られていないインスタンスのフィールドは
まだ生まれてもいないのだから初期化されていないのが当然ではないですか?

インスタンスを作成する際、初期化がどのように行われるかは
「プログラミング言語Java」
http://www.amazon.co.jp/exec/obidos/ASIN/4894713438
が詳しいですね。

もしも
コード:
public class MainClass {
    /** フィールド */
    ClassA abc = new ClassA("英語");
    /** main */
    public static void main(String args) {
         // ここ
    }
}


上記コードの位置でフィールドabcが初期化されない、
ということをおっしゃっているのであれば、
staticとそうではないフィールド・メソッドの意味を調べてみてください。
未記入
会議室デビュー日: 2006/05/16
投稿数: 6
投稿日時: 2006-09-04 10:31
分かりづらい質問ですいませんでした。
staticとそれ以外の変数の使い方など、基本的なことで誤解していたことが
分かりやすい解説で分かりました。
いろいろありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)