修正:静的コンテキストから非静的メソッドを参照できない

多くのプログラマーは、コーディング中に非静的メソッドは静的コンテキストから参照できません 」というエラーメッセージに直面します。 このエラーメッセージは特定のものではなく、エラーの条件が当てはまる場合、どのIDEでも発生する可能性があります。

非静的メソッドは静的コンテキストから参照できません

これは、プログラマがクラスのインスタンスを作成せずに「静的に」クラスを使用しようとする初心者にとって非常によくある間違いです。 静的なクラスを使用している場合に満たす必要があるいくつかの条件があります。 この記事では、いくつかの異なるケースを検討し、静的クラスの使用方法について説明します。

静的メソッドとは何ですか?

メソッドにキーワード「static」を追加すると、そのメソッドは静的メソッドと呼ばれます。 静的メソッドは、オブジェクト(通常)に属するのではなく、クラスに属します。 静的メソッドは、クラスのインスタンスを作成する条件なしで簡単に呼び出すことができます。

静的メソッドにはいくつかの異なる用途があります。たとえば、静的メソッドを使用すると、静的データメンバーとその値を変更できます。 ただし、静的メソッドを使用する場合には、まだいくつかの制限があります。 たとえば、クラスの非静的フィールドにアクセスする場合は、非静的メソッドを使用する必要があります。 要約すると、静的メソッドは非常に控えめに使用されますが、利点があります。

すべてのオブジェクトのプロパティを変更するための静的メソッドの作成方法の簡単な例を次に示します。

 class Students {int roll_no; 文字列名; static String college = "InformationTech"; static void change(){college =“ Management”;}学生(int number、String name_self){roll_no = number; name = name_self;} void display(){System.out.println(rollno + "" + name + "" +大学);} public static void main(String args []){Students.change();学生stu_1 =新しい学生(100、 "メキシコ");学生stu_2 =新しい学生(202、 "アメリカ人");学生stu_3 =新入生(309、 "イギリス人"); stu_1.display(); stu_2.display(); stu_3.display();}} 

プログラムの出力は次のようになります。

 100メキシコ人管理202アメリカ人管理309イギリス人管理 

クラスとクラスのインスタンスの違いは何ですか?

あなたは通りを歩いていると思うし、車を見る。 これで、モデルやタイプがわからなくても、これが車であることをすぐに知ることができます。 これは、これがすでに知っている「車」のクラスに属していることを知っているからです。 ここでのクラスは、テンプレートまたはアイデアと考えてください。

近づいていくと、モデルと車の型が見えます。 ここでは、クラス「車」の「インスタンス」を認識しています。 ここでは、すべてのプロパティが詳細に表示されます。 車輪、馬力、リムなど。

プロパティの例として、クラス「car」にはすべての車に車輪が必要であると記載されていることがあります。 表示されている車(車のクラスのインスタンス)には、リムがあります。

オブジェクト指向プログラミングでは、クラスを自分で定義し、クラス内で 'color'タイプのフィールドを定義します。 クラスがインスタンス化されるたびに、メモリはバックエンドで色用に自動的に予約され、後で特定の値(赤など)を与えることができます。 このような属性は特定のものであるため、静的ではありません。

対照的に、静的なメソッドとフィールドはすべてのインスタンスで共有されます。 これらは、インスタンス自体ではなく、クラスに固有の値またはアイテムに対して作成されます。 メソッドにはグローバルメソッド(stringtoIntコンバーターなど)があり、フィールドには通常コードに応じた定数があります(たとえば、通常の車のみを製造している場合、車のタイプは静的になります)。

ここで、コーディングが失敗する可能性のあるすべての異なるケースを調べ、それらを修正するための回避策を確認します。

問題1:存在しないものを呼び出している

ユーザーが静的メソッドと非静的メソッドの両方を使用している場合がありました。 これを行うとき、どのメソッドが何を呼び出しているかに注意する必要があります(静的かどうかに関して)。 次のコードを見てください。

 private java.util.List someMethod(){/ * Some Code * / return someList; } public static void main(String [] strArgs){//次のステートメントはエラーを引き起こします。 理由はわかります。java.util.List someList = someMethod(); } 

ここで、静的メソッドはsomeMethodを呼び出しています。 オブジェクト指向プログラミングでは、操作するデータとともにデータをカプセル化します。 ここでは、オブジェクトがない場合、インスタンスデータはなく、インスタンスメソッドはクラス定義の一部として存在しますが、データを提供するオブジェクトインスタンスは常に存在する必要があります。

要約すると、存在しないものを呼び出すことはできません。 オブジェクトを作成していない可能性があるため、非静的メソッドはまだ存在しません。 ただし、一方で、静的メソッドは常に存在します(定義のため)。

問題2:メソッドが静的にならない

メソッドのインスタンスを作成せずにStatic mainメソッドからメソッドを呼び出すと、エラーメッセージが表示されます。 ここでも、同じ原則が適用されます。 存在しないものにはアクセスできません。

 public class BookStoreApp2 {//オプションの定数Scanner input = new Scanner(System.in); public static void main(String [] args){BookStoreItem [] item; //配列アイテムの宣言= new BookStoreItem [10]; //配列の初期化int itemType = -1; printMenu(); getUserChoice(); for(int i = 0; i <item.length; i ++){} // end of switch文} // end for forループfor(int i = 0; i <item.length; i ++){} // end for} // mainメソッドの終わり 

このコードでは、 printMenu()メソッドとgetUserChoice()メソッドの両方を静的メソッドに変換する必要があります。

したがって、このような状況を回避したい場合は、代わりにコンストラクターを使用できます。 たとえば、main()メソッドの内容を取得して、コンストラクター内に配置できます。

 public BookStoreApp2(){// mainメソッドの内容をここに配置}これを行った後、main()メソッド内で次の操作を実行します。public void main(String [] args){new BookStoreApp2(); } 

これらのヒントが機能しない場合、またはコードが異なる場合は、静的クラスとメソッドの基本原則を念頭に置き、基本原則に違反していないことを確認するためにコードを再確認する必要があります。

興味深い記事