1

重複の可能性:
非静的変数を静的コンテキストから参照することはできません(java)

public class DemoJava {

    public class Hello {

        void fun()
        {
            System.out.println("This is static fun man!!");    
        }
    }

    public static void main(String[] args) {

        Hello hello = new Hello();
        hello.fun();
    }
}

この例では、静的メソッドから非静的クラスにアクセスしようとしているため、エラーが発生します。罰金。たとえばHello、別のファイルに同じクラスがあり、同じことを行ってもエラーは発生しません。

その場合でも、静的メソッドから非静的クラスにアクセスしようとしています。しかし、それはエラーにはなりません。なんで?

4

5 に答える 5

6

この例では、静的メソッドから非静的クラスにアクセスしようとしているため、エラーが発生します。

いいえ、囲んでいるクラスのインスタンスがないときに、内部クラスのインスタンス(囲んでいるクラスのインスタンスへの参照を暗黙的に持っている)を作成しようとしているため、エラーが発生します。

問題はへの呼び出しではなくfun()、コンストラクターの呼び出しです。

たとえば、次を使用してこれを修正できます。

DemoJava demo = new DemoJava();
Hello hello = demo.new Hello();

または、クラス宣言を次のように変更することで、ネストされているが内部クラスではないようにすることもできます。

public static class Hello

内部クラスの詳細についてはJLSのセクション8.1.3を、クラスインスタンス作成式の包含インスタンスを決定する方法についてはセクション15.9.2をお読みください。

それ以外の場合、Cは内部メンバークラス(§8.5)であり、次のようになります。

  • クラスインスタンス作成式が非修飾クラスインスタンス作成式である場合、次のようになります。

    • クラスインスタンス作成式が静的コンテキストで発生する場合、コンパイル時エラーが発生します。
于 2013-01-30T09:55:46.360 に答える
6

はい、それはあなたにエラーを与えるでしょう、それをする正しい方法は

public class DemoJava {

    public class Hello {

        void fun()
        {
            System.out.println("This is static fun man!!");    
        }
    }

    public static void main(String[] args) {

        DemoJava demoJava = new DemoJava();
        Hello  hello = demoJava.new Hello(); //you need to access your inner class through instance object
        hello.fun();
    }
}
于 2013-01-30T10:04:08.490 に答える
3

のインスタンスを作成するには、Outer classinのインスタンスを作成する必要がありますinner class

ドキュメントから:

内部クラスをインスタンス化するには、最初に外部クラスをインスタンス化する必要があります。

構文:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

DemoJava demoInst=new DemoJava();
Hello hello = demoInst.new Hello();
        hello.fun();
于 2013-01-30T09:55:01.420 に答える
1

クラスをHello静的にする

public static class Hello {

    void fun()
    {
        System.out.println("This is static fun man!!");    
    }
}

内部クラスHelloは外部クラスのインスタンスにアクセスする必要がないDemoJavaため、静的にすることができます。

于 2013-01-30T09:56:52.897 に答える
0

インスタンスがなくても、クラスの静的関数をいつでも呼び出すことができます

Hello.fun();

動作するはずです!

于 2013-01-30T10:04:01.160 に答える