2011-12-18 5 views
21

Javaチュートリアルでは、内部クラスは囲むクラスのインスタンスに関連付けられているため、内部クラスは静的メンバー自体を定義することはできません。内部クラスが静的メンバーを宣言できないのはなぜですか?

内部クラスが静的メンバーを宣言することができないのはなぜですか?いくつかのprivate staticフィールドは、この内部クラスのインスタンスが同じ内部クラスの他のインスタンスと共有できる可能性がありますか?これは単なるJavaのものの実装です。これは当然のことなのでしょうか?

+1

私は内部クラスが外部クラスの_instance_に関連付けられていることは私には驚きです –

+0

@Armen:非静的な内部クラスは実際には "外部クラスインスタンスへの暗黙のポインタ –

+0

@ArmenTsirunyan数時間前、それは私にとっても驚きでした=)今、私はJavaの概念を理解する上でのギャップを埋めるためにここにいくつかの質問をしています... –

答えて

6

基本的には任意の決定です。理由はありませんをサポートできませんでしたが、実際には何の理由もありません。をサポートしています。外部クラスのstaticフィールドを宣言するだけです。

また、その引用符は完全に正しいとは限りません。内部クラスに静的なserialVersionUIDを宣言できると思います。

+2

これはコンパイラの制限であり、JVMに固有のものではありません。内部クラスは大きな問題であり、JVMレベルでは内部と外部の区別がありません。 –

+0

より具体的には、コンパイル時定数であるstaticVersionUIDが必要な静的フィールドを宣言することができます。 –

+2

"論理的にそれを所有するクラスにあなたの変数を置く"ことは、それをサポートする正当な理由ですか? –

2

Java Language Specification says soため:

内部クラスは、明示的または暗黙的に 静的宣言されていないネストされたクラスです。内部クラスは、静的初期化子 (§8.7)またはメンバインタフェースを宣言することはできません。内部クラスは、コンパイル時定数フィールド(15.28)でない限り、静的な メンバを宣言することはできません。

については、なぜと指定されましたが、わかりません。私の推測では、内部クラスは非常に複雑であるはずの小さなヘルパークラスとして設計されています。

+0

*静的*内部クラスに対してこの制限が適用されますか? –

+1

@pst:静的な内部クラスのようなものはありません。私が引用した最初の文章を見てください。 –

+0

Err、静的なネストされたクラス*。 –

-1

これは、内部クラスの内部に静的メンバー変数を持たせることに矛盾します。一般に、内部クラスはインスタンス化される前に、外部クラスまたは包含クラスのオブジェクトインスタンスを持つ必要があります。静的メンバー変数は、その特定のクラス(この場合は内部クラス)のオブジェクトインスタンスは必要ありませんが、その内部クラスが依存するクラスで、外部クラスインスタンスとともにのみ共存できることを示しています。議論の中で利害の対立がどこで発生するかを見ていますか?しかし、内部クラスをstaticとして宣言することで、内部クラスの内部で静的メンバ変数を作ることができます。これは、内部クラスが外部クラスオブジェクトと共存する必要がなくなったことを意味します。

public class A { 

    public static class B { 

     private static JPanel myJPanel; 

    } 

} 
+2

静的メンバーを宣言しているBはなぜか、Aの囲むインスタンスに依存しないという意味ですか?これらは直交しているようです。 –

+0

@ EVAC-Q8R私はあなたが何を意味していると思いますか。内部クラスの静的メンバーにアクセスするには、OuterClass ** InstanceName **。InnerClass ** TypeName **。innerClassStaticMemberNameのようなものになります。これは間違いなく不快なミックスになります。一方、Javaのインスタンスを介して静的メンバーにアクセスすることは可能です(これは通常は不要です)。 OuterClass ** InstanceName **。新しいInnerClass()。innerClassStaticMemberName –

+0

@ Sean - "public class B"とは対照的に、内部クラスBは "static"と宣言しました。それをインスタンス化するために囲むオブジェクト...静的なJPanelのmyJPanelインスタンスのためではありません。 –

0

インナー彼らはコンパイル時定数でない限りclassstaticフィールドを宣言しない場合があります。したがって、staticフィールドをfinalと宣言すると、それが機能します。

class Foo { 
    class Test { 
     final static int i = 10; 
    } 
} 

は完全に

staticフィールドのみstaticまたはトップレベルの型で宣言することができますコンパイルして実行します。したがって、(純粋な)static変数は、staticclassでのみ宣言できます。

関連する問題