次のようなテストコードを書きました:
class MyProgram
{
int count = 0;
public static void main(String[] args)
{
System.out.println(count);
}
}
しかし、次のエラーが発生します。
Main.java:6: error: non-static variable count cannot be referenced from a static context
System.out.println(count);
^
メソッドにクラス変数を認識させるにはどうすればよいですか?
ベストアンサー1
クラスとそのクラスのインスタンスの違いを理解する必要があります。路上で車を見かけたら、モデルやタイプがわからなくても、それが車だとすぐにわかります。これは、見たものを「車」というクラスと比較するからです。クラスには、すべての車に類似するものが含まれています。これをテンプレートまたはアイデアとして考えてください。
同時に、あなたが見ている車は、誰かが運転していて、エンジンと車輪が付いているなど、期待されるすべての特性を備えているため、「車」クラスのインスタンスです。
したがって、クラスは「すべての車には色がある」と言い、インスタンスは「この特定の車は赤です」と言います。
OO の世界では、クラスを定義し、クラス内で 型のフィールドを定義しますColor
。クラスがインスタンス化されると (特定のインスタンスを作成すると)、色用のメモリが予約され、この特定のインスタンスに色を指定できます。これらの属性は特定のものであるため、静的ではありません。
静的フィールドとメソッドは、すべてのインスタンスと共有されます。これらは、特定のインスタンスではなく、クラスに固有の値用です。メソッドの場合、これは通常、グローバル ヘルパー メソッド ( などInteger.parseInt()
) です。フィールドの場合、これは通常、定数 (車のタイプなど、頻繁に変更されない限られたセットを持つもの) です。
問題を解決するには、クラスのインスタンスをインスタンス化 (オブジェクトを作成) して、ランタイムがインスタンスのメモリを予約できるようにする必要があります (そうしないと、異なるインスタンスが互いに上書きされてしまいます)。
あなたの場合は、開始ブロックとして次のコードを試してください:
public static void main (String[] args)
{
try
{
MyProgram7 obj = new MyProgram7 ();
obj.run (args);
}
catch (Exception e)
{
e.printStackTrace ();
}
}
// instance variables here
public void run (String[] args) throws Exception
{
// put your code here
}
新しいmain()
メソッドは、それに含まれるクラスのインスタンスを作成し (奇妙に聞こえますが、 はmain()
インスタンスではなくクラスで作成されるため、これが可能です)、次にインスタンス メソッド ( run()
) を呼び出します。