12

重複の可能性:
内部クラスに静的メソッドを含めることができないのはなぜですか?

非静的内部クラスオブジェクトの作成には外部クラスオブジェクトが必要であり、作成された非静的内部クラスオブジェクトには、外部クラスのオブジェクトへの非表示の参照が自動的に含まれることを知っています。しかし、なぜ非静的内部クラスに静的メンバーを含めることができないのでしょうか。Javaデザイナは、内部クラスの静的メソッド内の非静的外部クラスフィールドへのアクセスを禁止する必要があります。

内部クラスに静的メンバーを含めることが意味をなさない場合、なぜ内部クラスは静的メンバーを持つクラスを継承することによって静的メンバーを継承できるのでしょうか。

私もこの投稿を読みました。言及されているように:

内部クラスは、宣言していなくても、コンパイル時の定数ではない静的メンバーを継承する場合があります。内部クラスではないネストされたクラスは、Javaプログラミング言語の通常の規則に従って、静的メンバーを自由に宣言できます。

コンベンションですか?

これが私のコードです:

public class OuterClass {

    private int outerClassField;

    public void doSomethingOuterClass() {
        outerClassField = 1;
    }

    public static void doSomethingStaticOuterClass() {
        // outerClassField = 2; // Error: Because static method cannot access an specific object's field
    }

    public class InnerClass extends ClassWithStaticField {

        // Error: Why a non-static inner class cannot have static fields ?
        // public static int innerClassStaticField = 1;

        public void doSomethingInnerClass() {
            outerClassField = 3;
            staticField = 1;
        }

        // Error: Why a non-static inner class cannot have static methods ?
        // public static void doSomethingStaticInnerClass() {
        // outerClassField = 4;
        // }
    }

    public static void main(final String[] args) {
        // If it does not make sense to have static members in an inner class, why inner class can inherit statis members by inheriting a class who has static
        // members?
        OuterClass.InnerClass.staticField = 1;
        OuterClass.InnerClass.staticMethod();
    }
}

class ClassWithStaticField {
    public static int staticField;

    public static void staticMethod() {
    };
}
4

3 に答える 3

17

1. an objectof aは、そのof (つまり、囲んでいるクラス)にNon-static inner class関連付けられています。instance/objectOuter Class

2. aの本体全体 Non-static inner class静的スコープ内にないため、静的メンバーをそこに含めることはできません。

3. Instance variablesおよびmethods、囲んでいるクラスのインスタンスに相対的であるnon-static inner classため、オブジェクトに関連しているため、静的はそれら(つまり内部クラス)には当てはまりません。

4.非静的Instanceの を作成する場合、が必要です。内部には、それへの暗黙の参照があります。 inner classObject of Outer enclosing classnon-static classouter enclosing class

例えば:

Outer o = new Outer();
Outer.Inner i = o.new Inner();
于 2012-07-27T09:57:42.947 に答える
9

技術的には、言語が内部クラスの静的要素の使用を制限している理由はわかりません。非静的内部クラスは、(以前の)囲んでいるインスタンスをコンストラクターへの引数として受け取る通常のクラスを使用してエミュレートできます。もちろん、可視性ルール、可視性スコープに関しては、多くの小さな違いがあります。

これは言語設計の決定だったと思います。これは主に、非静的内部クラスの静的クラスが混乱し、アクセスするのが直感的でないためです(Outer.Inner.StaticMember)。

于 2012-07-27T11:11:35.240 に答える
0

非静的内部クラス内に静的メソッドを提供する意味はありません。代わりに、外部クラス内で非静的メソッドを使用できますか?

于 2012-07-27T09:24:56.293 に答える