2009-04-22 9 views
0

は、クラス定義の二つの方法を参照してください。クラス変数はいつロードされますか?

//definition: 1 
public class MyClass{ 

    private MyObject obj = new MyObject(); 
    private String str = "hello world"; 

    // constructor 
    public MyClass(){ 

    } 
} 

// definition: 2 
public class MyClass{ 

    private MyObject obj = null; 
    private String str = null; 

    // constructor 
    public MyClass(){ 
     obj = new MyClass(); 
     str = "HelloWorld"; 
    }  
} 

私の質問は:クラス変数がロードされたとき。それらはどのように読み込まれますか?

どのように初期化されますか?初期化が定義1のように行われる場合、コンストラクタの目的は何ですか?

クラスを定義する好ましい方法は何ですか?その理由は何ですか? C++/C#/ Javaでの動作は同じですか?あるいは、この動作はそれらの動作が異なりますか?

上記の説明を歓迎します。

+0

このISNそれは言語に依存するかもしれないし、言葉の特定の実装にも依存するかもしれないので、本当に言語に無関係ではない。 – Avi

答えて

1

これは言語によって異なりますが、ほとんどの言語はコンストラクタを呼び出す前にフィールドを初期化します。一般的に私は文脈でやることを主張しますが、初期化は通常、フィールドが宣言されている場所でのみ関連します。しかし、ジョンが指摘したように、時には、あなたは一本の行では意味がない/可能なことをする必要があります。

また、いつものように、初期化のために他のフィールドに依存するフィールドがある場合は、順序が重要です。

作品:一部の言語では、ActionScriptのように、これは宣言の順序は、初期化の順序を決定する意味

public class Foo 
{ 
    private var bar:Array = [1, 2, 3]; 
    private var baz:Array = bar.concat([4, 5, 6]); 
} 

は動作しません:

public class Foo 
{ 
    private var baz:Array = bar.concat([4, 5, 6]); 
    private var bar:Array = [1, 2, 3]; 
} 
0

コンストラクタは、クラスがオブジェクトにインスタンス化されるときに実行される最初の関数です。

クラス変数はインスタンス化の間に初期化され、コンストラクタはすぐにそれに続いて実行されます。

0

ほとんどの言語では、(私が知っているどの言語でもクラス変数と呼ばれていない)インスタンスフィールドは、インスタンスの構築中に初期化されます。それらは実質的にコンストラクタの一部であり、実際のコンストラクタコードの前に実行されます。

あなたは確かに明示的なコンストラクタコードでそれらを初期化することができます(ただし、それらを別のものに設定する場合は、設定をnullに保存します)。

あなたはコンストラクタが何であるか尋ねました。イニシャライザですべてを行うことはできません。もしあなたがループする必要があれば何か?

+0

返事とコンストラクターに関する素晴らしい点についてJohnに感謝します。 – pankajt