2012-04-24 17 views
12

私は別のクラスのサブクラスとして使用したい非常に単純なクラスを持っています。私は親のクラスでそのコードを入れたときにしかし、私は得る:私はGenTestのクラスsublassを入れたときに、このなぜ「静的でない変数から静的なコンテキストから参照できないのですか?」

非静的変数は、一方の静的コンテキスト

から参照することはできません"親の"クラスコードの外側にあるコード - 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(); 
    } 
} 

どうしてですか?

+2

GenTestはJavaApp1のサブクラスではありません。これはネストされたクラスです。違いは、サブクラスが親クラスのpublicプロパティとprotectedプロパティを継承する点です。 – ccoakley

+0

GenTestを独自のファイルに配置するだけです。 JavaApp1にネストする必要はありません。 –

+1

http://stackoverflow.com/questions/5272957/problem-creating-object-of-inner-class-in-java –

答えて

16

あなたのネストされたクラスは、静的なものとしてマークされていない、したがってそれがために、符号化クラス(JavaApp1)のインスタンスを必要内側クラスのそれを構築する。

オプション:

  • は「親インスタンス」としてJavaApp1のインスタンスを作成します
  • (すなわちないJavaApp1全く以内)それはない内部クラスを作成し、静的な入れ子になったクラス

  • を行います。

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

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

詳細については、section 8.1.3 of the JLSを参照してください。

2

静的メソッドからインスタンスを作成するときは、static class GenTestにする必要があります。

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

1

クラスGenTestは非静的クラスであるため、JavaApp1のインスタンス内でインスタンス化する必要があります。 static class GenTestする場合は、JavaApp1のインスタンスを作成し、非スタティックな方法でGenTestを作成する必要があります。 (を介して、サブクラスない)

1

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

static class GenTest...

1

あなたが呼び出している方法はそれを行うための正しい方法ではありません

static class GenTest()...... 
0

を使用してください。内部クラスGenTestを呼び出すための正しい方法JavaApp1のメンバーであるので、それはあなたのクラスが正しくコンパイルだろう、それを使用して

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

だろう。

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(); 
} 
関連する問題