logo

Java の静的コンテキストから非静的変数を参照できない理由

エラー Java の静的コンテキストから非静的変数を参照することはできません Java プログラムのコンパイル時に初心者が直面することがほとんどです。このエラーが発生する理由は、main() メソッドで非静的メンバー変数が使用されているためです。 Java の main() メソッドは静的メソッドであり、自動的に呼び出されるため、呼び出すためのオブジェクトを作成する必要はありません。エラーを理解するには、まず次のことを理解する必要があります。 静的 そして 非静的 Javaのメソッド

静的メソッド

ジャワ 、パブリックメソッドはクラスのインスタンスに属しますが、それについて言えば、 静的メソッド 、それらはクラスのインスタンスではなくクラスに属します。静的メソッドを呼び出すためにクラスのインスタンスを作成する必要はありません。静的メンバーは静的データ メンバーにのみアクセスでき、その値を変更できます。

非静的メソッド

すべてのメソッドは、 静的 メソッド名の前にあるキーワードは次のように呼ばれます。 非静的 方法。静的メソッドおよび静的変数にアクセスするためにクラスのインスタンスを作成する必要はありません。非静的メソッドは、動的バインディングまたはランタイム バインディングに使用されます。とは異なり 静的 メソッドをオーバーライドできます 非静的 方法。

Java プログラムを作成して同じエラーを生成してみましょう。

1/1000.00

次の例では、プライベート変数を宣言しています。 番号 main() メソッドの前の int 型。 main() メソッドでは、数値を 1 ずつ増分しようとしています。 main() メソッドは静的メソッドであり、変数は静的ではないことに注意してください。上記のプログラムをコンパイルすると、以下に示すように、同じエラーが発生します。

静的例1.java

 public class StaticExample { private int number=0; public static void main(String args[]){ number++; System.out.println(number); } } 

出力:

隠れたアプリを明らかにする方法
Java の静的コンテキストから非静的変数を参照できない理由

それでは、変数を宣言しましょう 番号 静的としてコードをコンパイルします。変数と main() メソッドは両方とも静的であることに注意してください。

静的例2.java

 class staticExample { private static int number=0; public static void main(String args[]){ number++; System.out.println(number); } } 

出力:

Java の静的コンテキストから非静的変数を参照できない理由

プログラムはコンパイルされ、正常に実行されます。

htmlタグ

非静的変数の各インスタンスは異なる値を持ち、new() 演算子がオブジェクトのインスタンスを初期化するときに作成されます。静的変数は、クラスがロードされるときに作成または初期化されます。 JVM

非静的変数を呼び出すにはオブジェクトのインスタンスが必要です。非静的変数またはインスタンス変数にさまざまな値を与えることで、多くのオブジェクトを作成できます。

静的例3.java

 class variable { int number; public static void increment() { number++; } } class StaticExample { public static void main(String args[]) { variable var1 = new variable(); variable var2 = new variable(); variable var3 = new variable(); var1.number = 12; var2.number = 13; var3.number = 14; variable.increment(); System.out.println(var1.number); System.out.println(var2.number); System.out.println(var3.number); } } 

出力:

Java の静的コンテキストから非静的変数を参照できない理由

上記のプログラムでは、3 つのオブジェクト、 var1、var2、var3 、クラス用に作成されます 変数 そして、オブジェクトに 3 つの異なる値 12、13、14 を割り当てました。 var1、var2 、 そして var3 、 それぞれ。さて、 番号 各オブジェクトのプロパティには独自の整数値があります。 increment() メソッドを呼び出して、number プロパティの値を増分しようとすると、コンパイラは、メソッドが値を増分する必要がある number の値を認識できません。コンパイラがあいまい性エラーに直面し、コンパイル時エラーをスローする 非静的変数は静的コンテキストから参照できません

エラーの解決策

問題を解決する簡単な方法が 1 つあります 非静的変数は静的コンテキストから参照できません エラー。上記のコードでは、オブジェクト名を使用して非静的変数をアドレス指定する必要があります。簡単に言うと、静的コンテキストから非静的変数を参照するクラスのオブジェクトを作成する必要があります。変数の新しいインスタンスが作成されると、すべての非静的変数の新しいコピーが作成されます。したがって、クラスの新しいインスタンスの参照を使用して、これらの変数にアクセスできます。たとえば、次の Java プログラムについて考えてみましょう。

Javaの線形探索

静的例4.java

 class staticExample { int number = 0; public static void main(String args[]) { // using non-static variable by creating an object of the class staticExample test = new staticExample(); test.number++; System.out.println(test.number);a } } 

出力:

Java の静的コンテキストから非静的変数を参照できない理由

説明

上記のプログラムでは、クラス名を使用して数値プロパティにアクセスします。 静的な例。 StaticExample クラス名のオブジェクトを作成します。 テスト そして増加します 数値の値 テストオブジェクトを使用して。