- - PR -
クラスファイルの初期化
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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のインスタンスが生成されると思っていますが間違いないでしょうか?基本的な質問ですが、よろしくお願いします。 | ||||||||
|
投稿日時: 2006-07-05 09:19
>クラスが読み込まれるタイミングはmethodがコールされたタイミングだと思いますが、
>その際、フィールドも初期化されると思います。 はい? | ||||||||
|
投稿日時: 2006-07-05 09:39
デバッガで、追いかけてみればいいんじゃないの?
| ||||||||
|
投稿日時: 2006-07-05 10:07
staticじゃないmethodなら、
インスタンスを生成せずに呼び出す、なんてことはできないよね。 | ||||||||
|
投稿日時: 2006-07-05 11:02
「static イニシャライザ」 と 「コンストラクタ」 を混同していませんか?
例のコードですと、新しいインスタンスが作られる度に、B は初期化されます。 1 度、初期化されたインスタンスについては、(2) は実行されません。 微妙な書き方ですが、こう書けばご納得頂けるのでしょうか... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-07-05 11:34
new Sample();が実行される度にBは初期化されるのですね。最初の質問にもありますが、@のようにnullで初期化しておきmethod内でインスタンスを生成するのとAのように初期化でインスタンスを生成するのはどのように違うのでしょうか?何か使いわけをする必要がありますか? | ||||||||
|
投稿日時: 2006-07-05 12:09
インスタンスの初期化の順番ですが、
1.コンストラクタの起動 2.スーパーコンストラクタへの委譲 3.フィールドの初期化もしくはインスタンスイニシャライザの実行(定義順?) 4.コンストラクタのコードの実行 という順番になります。 これは、コンパイル時にsuper(...)を記述しない場合、 自動的にコンストラクタの先頭に埋め込まれます。 そして、3のコードが次に埋め込まれ、4のコードが埋め込まれます。 フィールドの定義を行って初期化を行わない場合は、特に何も行われません。 明示的にnullを代入する場合や、その他の値を代入するときは、 superの次に実行されます。 フィールドの初期化でnull代入を行うのは、バイトコードレベルでは無駄です。 | ||||||||
|
投稿日時: 2006-07-05 16:34
ありがとうございます。 |
1