2012-04-17 15 views
1

私は.NETを使用して何年もプログラミングを続けてきましたが、私はいくつかのシンプルなスタータープログラムでJavaに飛び込んでいます。Java - 静的メソッドのインスタンスクラスを使用していますか?

私はpublic void mainと私のスタートアップクラスを作成すると、コンパイラは私が書いたクラスのいずれかをインスタンス化させません...しかし

のトラブルのビットを持っていますか?

「静的でない変数_プロセッサは静的コンテキストから参照できません」ここで_processorは、私が書いたProcessorクラスからインスタンス化しようとしているオブジェクトです。

プロセッサを静的クラスに変更すると、プログラムはコンパイルされて正常に実行されますが、すべてのクラスを静的にする必要はありません。

これはなんですか?

ありがとうございます!

ここに書いたすべてがあります。これは、現在の状態でコンパイルされません。

class Lab 
{ 
    public static void main(String[] args) 
    { 
     Processor proc = new Processor(); 

     proc.Go(); 
    } 

    private class Processor 
    { 
     private Random _rand = new Random(); 

     public void Processor() {} 

     public void Go() 
     { 

     } 
    } 
} 
+3

あなたのコードを見せていただければ助かります。 –

+0

ここにコードを入力すると、問題をよりよく理解するのに役立ちます。 – Bajji

+0

これは書いたものではありません。エラーメッセージは '_processor'を参照していますが、これはあなたが示したコードでは起こりません。 –

答えて

2

は万が一LabProcessor内部クラスですか? (はい、コードを公開したので、私の疑惑は確認されています)。

Javaではnonstatic inner classes contain an implicit reference to the containing object of the outer classであるため、静的コンテキスト(mainメソッド)からインスタンス化することはできません。

ので

  • いずれかLab(例えばmyLab)のインスタンスを作成し、トップレベルにmyLab.new Processor()、または
  • 宣言Processor静的(あなたが行ったように)、または
  • ターンProcessorを呼び出しますクラス。

    public static void main(String[] args){ 
    new MyClass(); 
    } 
    

    をコンストラクタであなたのインスタンスを置く:

+0

完璧!ありがとうございました。 –

0

あなたは、メインのコンストラクタを呼び出す必要があります。

1

これは問題ではありますか?

public class DemoClass{ 

    String field; 

    public static void main(String[] args){ 
    field = "Hey"; //forbidden - can't access instance field from static context 
    DemoClass dc = new DemoClass(); 
    dc.field = "Hey"; //this is ok 
    } 

} 
0

が、私は私のクラスのすべてが静的にするために持っている必要はありません。

私の経験上、Javaのほとんどの内部クラスは静的です。インナークラスを別のファイルに書き込むことができれば(それを含むクラスのメンバーを直接使用することはできません)、静的として定義する必要があります。 Javaでは、内部の静的なクラスを他のクラスの中に書くことができます。

0

プロセスクラスはラボクラスのインナークラスです。ラボクラスのインスタンスをインスタンス化するまでは、その内部クラスが静的でないかぎり、プロセスクラスのインスタンスを作成することはできません。

メインは静的であるため、ラボクラスで実行されますが、プライベート内部クラスのインスタンスを作成しようとすると、このクラスはLabの「プライベート内部」クラスであり、ラボのインスタンスを持っていないので、直接参照することはできません。

プロセッサクラスを静的にすることもできますし、少なくともpublicにすることもできますし、最初にラボクラスのインスタンスをインスタンス化し、インスタンス化ラボクラスを介してプロセッサクラスを参照することもできます。

関連する問題