1. ホーム
  2. java

[解決済み] JAVAは非静的なフィールドを静的に参照することはできません。

2022-02-15 09:51:23

質問

JAVAで初めてのプログラムなのですが、このエラーを理解するのに苦労しています。

Cannot make a static reference to the non-static field *

そして

非静的メソッドへの静的参照はできません *。

public class Cerchio{

   float r;
   float area;
   float cfr;
   final double pi = 3.14;

   public static void main(String[] args){
      System.out.println("CIRCLE PROGRAM\n");
      r = 5;
      c_cfr();
      c_area();
      System.out.ptintln("The cir is: " + cfr);
      System.out.println("The area is: " + area);
   }

   float c_cfr(){
      cfr =(float)(2 * pi * r); //casting
      return cfr;
   }

   float c_area(){
      area = (float)(pi * (r*r));
      return area;
   }

}

<イグ 何かご指摘はありますか? 私はAndroidのSandIDEでコーディングしています。

どのように解決するのですか?

インスタンスのフィールドやメソッドはオブジェクトがなければ存在しないため、静的メソッドの中からインスタンスのメソッドやフィールドを呼び出していることになりますし、mainメソッドの中には this オブジェクトを作成します。代わりにクラスのインスタンスを作成し、そのインスタンス上でメソッドを呼び出す必要があります。

public class Cerchio{

  float r;
  float area;
  float cfr;
  final double pi = 3.14;

  public static void main(String[] args){
    System.out.println("CIRCLE PROGRAM\n");

    Cerchio cerchio = new Cerchio();
    cerchio.r = 5;
    cerchio.c_cfr();
    cerchio.c_area();
    System.out.ptintln("The cir is: " + cerchio.cfr);
    System.out.println("The area is: " + cerchio.area);
  }

  float c_cfr(){
    cfr =(float)(2 * pi * r); //casting
    return cfr;
  }

  float c_area(){
    area = (float)(pi * (r*r));
    return area;
  }

}

他にも問題山積み、、、。

  • クラスのフィールドに直接アクセスしていますが、これはやってはいけないことです。代わりに、フィールドはプライベートであるべきで、フィールドの取得、設定、セットにはゲッター/セッター/コンストラクタパラメータを使用すべきです。
  • あなたのコードはインデントされていないため、非常に読みにくく、理解しにくいです。

同じ質問が何度もされており、私よりずっと良い答えがある可能性が高いので、このサイトを検索してください。もし見つかったら、この質問は重複として閉じられるはずです。


編集
と述べていますね。

私は "代わりに、フィールドはプライベートであるべきで、フィールドの取得、設定、セットにはゲッター/セッター/コントラクターパラメーターを使用すべきです。 " 私は private float c_cfr() と書くべきでしょうか。

あなたのフィールドは

float r;
float area;
float cfr;

これは本当にフィールドではなく、定数です。 最終的に2倍のπ=3.14となる。

であり、Math.PIを使うだけで置き換え/改良が可能です。

あなたのフィールドを変更する必要があります。

private float r;
private float area;
private float cfr;

そして、絶対に必要な場合のみ、パブリックなゲッターとセッターのメソッドを介してアクセスする必要があります。