English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Javaのクラスには、静的(クラス)、インスタンス、ローカル変数の3種類の変数があります。
ローカル変数-これらの変数はメソッドに属しています/ブロック/コンストラクタ/定義。これらの変数の範囲はメソッド(またはブロックまたはコンストラクタ)内にあり、実行後に破棄されます。
インスタンス変数-これらの変数はクラスのインスタンス(オブジェクト)に属しており、クラス内のメソッドの外で宣言されています。これらはクラスをインスタンス化すると初期化されます。これらは特定のクラスのあらゆるメソッド、コンストラクタ、またはブロックからアクセスできます。
インスタンス変数にアクセスするには、そのクラスのオブジェクトを作成する必要があります。これらの変数は、そのオブジェクトを使ってアクセスする必要があります。
クラス/静的変数-クラス/静的変数はクラスに属しており、インスタンス変数と同様に、クラス内のメソッドの外で宣言されていますが、staticキーワードを使って宣言されています。
それらはコンパイル時にアクセスできます。インスタンス化する前にアクセスできます。/クラスをインスタンス化しないでアクセスすると、そのクラスにはメモリ上に一つの静的字段のコピーしかありません。つまり、静的字段の値はすべてのオブジェクトで同じです。staticキーワードを使って静的字段を定義できます。
上記のように、クラス名を使って(アクセスして)静的変数を使用します。
System.out.println(MyClass.data);
静的参照で変数を参照することは、クラス名を使って参照することを意味します。
インスタンス変数にアクセスするには、オブジェクトを作成する必要があります。これらのオブジェクトは、インスタンス化される前にメモリでは利用できません。
したがって、Javaでは静的参照で非静的字段(変数)を参照することはできません。それでもこのようにする場合は、コンパイル時エラー「静的コンテキストから非静的字段数学を参照できません」が発生します。
Javaプログラムに従って、ユーザーのマークを受け取り、彼が昇進するかどうかを決定します。
ここでは、静的方法wasPromroted()から、私のインスタンス変数に直接アクセスしています(名前を指定するだけで、静的変数のように)。このようにすることは許可されていないため、コンパイル時エラーが発生します。
import java.util.Scanner; public class StudentMarks { Scanner scan1 = new Scanner(System.in); private double math; private double science; private double english; public StudentMarks(double math, double science, double english) { this.math = math; this.science = science; this.english = english; } public static boolean wasPromroted(StudentMarks marks) { if(math >=85 && science >=75 && english >=65) { return true; } return false; } public static void main(String args[]) { Scanner sc = new Scanner(System.in); System.out.println("Enter your math score:"); double math = sc.nextDouble(); System.out.println("Enter your science score:"); double science = sc.nextDouble(); System.out.println("Enter your english score:"); double english = sc.nextDouble(); StudentMarks marks = new StudentMarks(math, science, english); boolean bool = wasPromroted(marks); if(bool) { System.out.println("Congratulations, you've got promoted"); } else { System.out.println("Sorry try again"); } } }
输出結果
StudentMarks.java:16: error: non-static variable math cannot be referenced from a static context if(math >=85 && science >=75 && english >=65) ^ StudentMarks.java:16: error: non-static variable science cannot be referenced from a static context if(math >=85 && science >=75 && english >=65) ^ StudentMarks.java:16: error: non-static variable english cannot be referenced from a static context if(math >=85 && science >=75 && english >=65) ^ 3 errors
ためには、このプログラムが正常に動作するためには、インスタンス変数を静的として宣言するか、メソッド内でそのオブジェクトを参照する必要があります。
import java.util.Scanner; public class StudentMarks { Scanner scan1 = new Scanner(System.in); private double math; private double science; private double english; public StudentMarks(double math, double science, double english) { this.math = math; this.science = science; this.english = english; } public static boolean wasPromroted(StudentMarks marks) { if(marks.math >=85 && marks.science >=75 && marks.english >=65) return true; return false; } public static void main(String args[]) { Scanner sc = new Scanner(System.in); System.out.println("Enter your math score:"); double math = sc.nextDouble(); System.out.println("Enter your science score:"); double science = sc.nextDouble(); System.out.println("Enter your english score:"); double english = sc.nextDouble(); StudentMarks marks = new StudentMarks(math, science, english); boolean bool = wasPromroted(marks); if(bool) { System.out.println("Congratulations, you've got promoted"); } else { System.out.println("Sorry try again"); } } }
输出結果
Enter your math score: 89 Enter your science score: 85 Enter your english score: 86 Congratulations, you've got promoted