1

私には矛盾しているように思われるものの背後にある理由について、いくつかの混乱があります。

例えば

public class Test
{
    static int a;
    public static void main(String[] args)
    {
        System.out.println(a);
    }
}

したがって、予想どおり、0が出力されます。しかし、代わりにこれがあったとしましょう。

public class Test
{

    public static void main(String[] args)
    {
        int a;
        System.out.println(a);
    }
}

これはコンパイルされず、 a が初期化されていないと不平を言います。私はそれが0を出力することを期待していました...

それは私にいくつかの質問を導きます:

1) 関数スコープの変数にデフォルト値がないのはなぜですか?

2) static キーワードが原因でしょうか? なぜ?

4

3 に答える 3

4

Java 言語仕様では、変数のデフォルトの初期値について説明しています

各クラス変数、インスタンス変数、または配列コンポーネントは、作成時にデフォルト値で初期化されます (§15.9、§15.10):

タイプ byte の場合、デフォルト値はゼロ、つまり (byte)0 の値です。

short 型の場合、デフォルト値はゼロ、つまり (short)0 の値です。

int 型の場合、デフォルト値はゼロ、つまり 0 です。

long 型の場合、デフォルト値はゼロ、つまり 0L です。

float 型の場合、デフォルト値は正のゼロ、つまり 0.0f です。

double 型の場合、既定値は正のゼロ、つまり 0.0d です。

char 型の場合、デフォルト値はヌル文字、つまり '\u0000' です。

ブール型の場合、デフォルト値は false です。

すべての参照型 (§4.3) のデフォルト値は null です。

また、次のようにも述べています

ローカル変数 (§14.4、§14.14) は、初期化 (§14.4) または割り当て (§15.26) のいずれかによって、使用前に明示的に値を指定する必要があります。 16)。

どちらの質問にも、「JLS がそう言っているので」と答えることができます。

より完全な答えは次のようになります。

クラスは、状態と動作の説明です。オブジェクトは実際のデータです。オブジェクトを作成する場合は、確定状態にする必要があり、初期化されていない状態にすることはできません。

于 2013-09-27T01:09:07.890 に答える
0

1) 関数スコープの変数にデフォルト値がないのはなぜですか?

メソッド変数がデフォルト値に初期化されないのは、 JLSによって定義された規則です。使用する前に初期化する必要があります

2) static キーワードが原因でしょうか? なぜ?

再びJLSルールから、クラス インスタンス変数はコンパイラによってデフォルト値に初期化されます。それらを初期化する場合としない場合があります。

于 2013-09-27T01:09:23.757 に答える
0

リンクhttp://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.htmlに記載されているように、Javaコンパイラはローカル変数にデフォルト値を割り当てません

それらを明示的に初期化する必要があります。

于 2013-09-27T01:11:02.300 に答える