15

別のクラスのサブクラスとして使用したい非常に単純なクラスがあります。しかし、そのコードを親のクラスに入れると、次のようになります。

非静的変数これは静的コンテキストから参照できません

一方、サブラスGenTestのクラスコードを「親」のクラスコードの外に置くと、JavaApp1このエラーは発生しません。

public class JavaApp1 {

    class GenTest {  
        @Deprecated
        void oldFunction() {
            System.out.println("don't use that");
        }
        void newFunction() {
            System.out.println("That's ok.");
        }
    }

    public static void main(String[] args) {
        GenTest x = new GenTest();
        x.oldFunction();
        x.newFunction();
    }
}

なぜこうなった ?

4

8 に答える 8

20

ネストされたクラス(ちなみに、サブクラスではありません)は静的としてマークされていないため、それを構築するためにエンコーディングクラス(JavaApp1)のインスタンスを必要とする内部クラスです。

オプション:

  • ネストされたクラスを静的にする
  • それを内部クラスにしない(つまり、まったく内部JavaApp1にしない)
  • JavaApp1のインスタンスを「囲んでいるインスタンス」として作成します。

    GenTest x = new JavaApp1().new GenTest();
    

個人的には、2番目のアプローチを使用します。Javaのネストされたクラスにはいくつかの奇妙な点があるため、ネストする正当な理由がない限り、トップレベルのクラスを使用します。(最後のオプションは特に厄介です、IMO。)

内部クラスの詳細については、JLSのセクション8.1.3を参照してください。

于 2012-04-24T16:22:58.523 に答える
2

static class GenTest静的メソッドからインスタンスを作成するので、そうする必要があります。

また、一般的に、内部クラスは静的である必要があります。

于 2012-04-24T16:22:18.807 に答える
1

このクラスGenTestは非静的クラスであるため、のインスタンス内でインスタンス化する必要がありますJavaApp1。自分が行っていることを行う場合はstatic class GenTest、それ以外の場合は、のインスタンスをJavaApp1作成しGenTest、非静的メソッド内に作成する必要があります。

于 2012-04-24T16:22:58.153 に答える
1

GenTestはJavaApp1のコンテキストで定義されているためです。したがって、JavaApp1のインスタンスがない限り、それを参照できます。動作させるには、に変更してstatic classください。

static class GenTest...

于 2012-04-24T16:24:11.183 に答える
1

使ってください

static class GenTest()......
于 2012-04-24T16:25:18.780 に答える
0

あなたが呼び出している方法はそれをする正しい方法ではありません。内部クラスは正しい呼び出し方法GenTestのメンバーであるため、次のようになります。JavaApp1

GenTest x = new JavaApp1().new GenTest();

これを使用すると、クラスは正しくコンパイルされます。

于 2012-04-24T16:29:19.533 に答える
0

クラスはネストされています。つまり、ネストされたクラスは静的ではありません。つまり、メインクラスのオブジェクトを使用して、ネストされたクラスのオブジェクトを作成する必要があります。つまり、psvmは次のようになります。

public static void main(String[] args) {
    JavaApp1 a=new JavaApp1(); //create an object for the main class
    JavaApp1.GenTest x=a.new GenTest();

    x.oldFunction();
    x.newFunction();
}
于 2017-09-23T02:21:12.957 に答える
0
class Test {

    static class GenTest { // nested class with static

        static void oldFunction() { // static method
            System.out.println("don't use that");
        }
        void newFunction() { // non-static method
            System.out.println("That's ok.");
        }
    }

    public static void main (String[] args) {
        GenTest.oldFunction(); // call static method

        GenTest two = new GenTest(); // call non-static method
        two.newFunction();
    }

}

Javaオンライン java

于 2018-05-28T21:39:00.840 に答える