2016-12-07 12 views
3

私はjavaを初めて使用しています。私は現在、静的変数に関するいくつかの記事を読んでいます。学習を実装しようとすると、静的変数に関する問題が発生しました。ここに最初のコードサンプルがあります。Javaの非静的クラスで静的変数を宣言する

public class Human { 
    // in Human.java 
    public static int population = 0; 
    public static void main(String[] argv) { 
     System.out.println(population); 
    } 
} 

このコードは正常に動作し、結果は0 ですが、次のコードのために、私はそれをコンパイルすることができませんでした。

public class Human { 
    // in Human.java 
    public class Charlie extends Human { 
     public static int number = 0; 
    } 

    public static void main(String[] argv) { 
     System.out.println(new Human().new Charlie().number); 
    } 
} 

エラーが発生しました:定数式

で初期化しない限り、フィールドの数は、私がこのような状況で混乱しています、非静的インナータイプで静的に宣言することはできません。最初のコードサンプルでは、​​私のHumanクラスは静的ではなく、内部に静的変数を宣言することができました。 2番目のコードサンプルではどうして私は同じことをすることができません。

ご協力いただければ幸いです。ありがとう。 :)

答えて

4

お試しくださいpublic static final int number = 0; Javaでは、関数ローカルの内部クラス内に最終的ではない静的フィールドを定義することはできません。トップレベルのクラスと静的なネストされたクラスのみが、最終的ではない静的フィールドを持つことができます。

JLS section 8.1.3から:彼らは一定の変数(§4.12.4)でない限り、

内部クラスは、静的メンバを宣言しないことがあり、コンパイル時エラーが発生します。

内部クラスがstaticにすると

public class Human { 
    // in Human.java 
    public static class Charlie extends Human { 
     public static int number = 0; 
    } 

    public static void main(String[] argv) { 
     System.out.println(new Human.Charlie().number); 
    } 
} 
+0

他の方法は、チャーリー・クラスは、静的作ることになり、それへのその他のアクセス方法。言及する価値があるかもしれない – Aelop

+0

を参照してください。 Javaにこのような制限がある理由はありますか?これは、Java VMが外部クラスと異なる内部クラスを扱うことを意味しますか? – FunnyFunkyBuggy

+0

@Aelop Right..私はちょうど私の答えを更新しました。 – iMBMT

関連する問題