English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Javaで非静的字段に静的リファレンスをできますか?

Javaのクラスには、静的(クラス)、インスタンス、ローカル変数の3種類の変数があります。

  • ローカル変数-これらの変数はメソッドに属しています/ブロック/コンストラクタ/定義。これらの変数の範囲はメソッド(またはブロックまたはコンストラクタ)内にあり、実行後に破棄されます。

  • インスタンス変数-これらの変数はクラスのインスタンス(オブジェクト)に属しており、クラス内のメソッドの外で宣言されています。これらはクラスをインスタンス化すると初期化されます。これらは特定のクラスのあらゆるメソッド、コンストラクタ、またはブロックからアクセスできます。

    インスタンス変数にアクセスするには、そのクラスのオブジェクトを作成する必要があります。これらの変数は、そのオブジェクトを使ってアクセスする必要があります。

  • クラス/静的変数-クラス/静的変数はクラスに属しており、インスタンス変数と同様に、クラス内のメソッドの外で宣言されていますが、staticキーワードを使って宣言されています。

    それらはコンパイル時にアクセスできます。インスタンス化する前にアクセスできます。/クラスをインスタンス化しないでアクセスすると、そのクラスにはメモリ上に一つの静的字段のコピーしかありません。つまり、静的字段の値はすべてのオブジェクトで同じです。staticキーワードを使って静的字段を定義できます。

非静的字段への静的参照e

上記のように、クラス名を使って(アクセスして)静的変数を使用します。

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
おすすめ