- PR -

クラスファイルの初期化

1
投稿者投稿内容
J
会議室デビュー日: 2006/06/30
投稿数: 6
投稿日時: 2006-07-05 09:16
フィールド定義した変数の初期化について質問があります。
class Sample{
A a = null;・・・@
B b = new B();・・・A
void method(){
a = new A();
}
}
クラスが読み込まれるタイミングはmethodがコールされたタイミングだと思いますが、その際、フィールドも初期化されると思います。@のようにnullで初期化しておきmethod内でインスタンスを生成するのとAのように初期化でインスタンスを生成するのはどのように違うのでしょうか?methodが呼び出される度にBのインスタンスが生成されると思っていますが間違いないでしょうか?基本的な質問ですが、よろしくお願いします。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-07-05 09:19
>クラスが読み込まれるタイミングはmethodがコールされたタイミングだと思いますが、
>その際、フィールドも初期化されると思います。
はい?
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-07-05 09:39
デバッガで、追いかけてみればいいんじゃないの?
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-07-05 10:07
staticじゃないmethodなら、
インスタンスを生成せずに呼び出す、なんてことはできないよね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-05 11:02
引用:

Jさんの書き込み (2006-07-05 09:16) より:

クラスが読み込まれるタイミングはmethodがコールされたタイミングだと思いますが、その際、フィールドも初期化されると思います。


「static イニシャライザ」 と 「コンストラクタ」 を混同していませんか?

引用:

methodが呼び出される度にBのインスタンスが生成されると思っていますが間違いないでしょうか?


例のコードですと、新しいインスタンスが作られる度に、B は初期化されます。
1 度、初期化されたインスタンスについては、(2) は実行されません。

微妙な書き方ですが、こう書けばご納得頂けるのでしょうか...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
J
会議室デビュー日: 2006/06/30
投稿数: 6
投稿日時: 2006-07-05 11:34
引用:
例のコードですと、新しいインスタンスが作られる度に、B は初期化されます。
1 度、初期化されたインスタンスについては、(2) は実行されません。


new Sample();が実行される度にBは初期化されるのですね。最初の質問にもありますが、@のようにnullで初期化しておきmethod内でインスタンスを生成するのとAのように初期化でインスタンスを生成するのはどのように違うのでしょうか?何か使いわけをする必要がありますか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-07-05 12:09
インスタンスの初期化の順番ですが、
1.コンストラクタの起動
2.スーパーコンストラクタへの委譲
3.フィールドの初期化もしくはインスタンスイニシャライザの実行(定義順?)
4.コンストラクタのコードの実行
という順番になります。

これは、コンパイル時にsuper(...)を記述しない場合、
自動的にコンストラクタの先頭に埋め込まれます。
そして、3のコードが次に埋め込まれ、4のコードが埋め込まれます。

フィールドの定義を行って初期化を行わない場合は、特に何も行われません。
明示的にnullを代入する場合や、その他の値を代入するときは、
superの次に実行されます。

フィールドの初期化でnull代入を行うのは、バイトコードレベルでは無駄です。
J
会議室デビュー日: 2006/06/30
投稿数: 6
投稿日時: 2006-07-05 16:34
引用:
フィールドの初期化でnull代入を行うのは、バイトコードレベルでは無駄です。


ありがとうございます。
1

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