1. ホーム
  2. java

javaで非静的な解を静的な参照にすることができない

2022-02-09 05:10:56
<パス

今日、コードを書き出すときにこの問題に遭遇しました。一般的な問題は次のように単純化できます。

public class Test1 {
    public String get()
    {
        return "123";
    }
    public static void main(String[] args)
    {
        String string = get();
    }
}

表示する
Test1型から非静的メソッドget()への静的な参照を作成できません。

さて、私はこれを次のように変更することにしました。

public class Test1 {
    public String get()
    {
        return "123";
    }
    public static void main(String[] args)
    {
         static String string = get();
    }
}

でも、まだ間違っている。

ということに気づくには、javaの本を少しめくってみる必要がありました。

1. javaの静的メソッドは、非静的メソッドやメンバーを直接呼び出すことはできませんし、thisキーワードも使えません(これが今回の問題の原因です、静的なmainメソッドで非静的なgetメソッドを呼び出したのです)。

説明 クラス内の静的メソッドやプロパティは、本質的にはクラスのメンバーではなく、java仮想マシンがクラスにインストールされたときにすでにオブジェクトを持っており、それは単にクラスの中に"resides"するだけで、クラスのコンストラクタ(構成子)によってインスタンス化する必要がありません;一方 非静的なプロパティまたはメソッドは、クラスの負荷が存在しない、クラスのコンストラクタは、クラスのインスタンスオブジェクトの存在に依存することができます後に実行する必要があります。だから、静的なメソッドで非静的なメソッドを呼び出すとき というエラーが表示されます(Cannot make a static reference to the non-static method func() from the type A)。

  1. javaでは、メソッド内のローカル変数をstaticとして宣言することはできません。
  2. main() 関数は静的で、戻り値はなく、正式なパラメータの配列を持っています。
  3. 非静的メンバは静的メンバを任意に呼び出すことができる

では、スタティックは反人間的なもので、これは何のために必要なのでしょうか?
おそらく、複数のクラスが1つのデータを共有できるようにするためでしょう。

おそらく、関数を静的にし、変数をグローバルに静的に宣言するように修正したのでしょう

方法1

public class Test1 {
    static String string;
    public static String get()
    {
        return "123";
    }
    public static void main(String[] args)
    {
         string = get();
         System.out.print(string);
    }
}

方法2

public class Test1 {
    public String get() {
        return "123";
    }
    public static void main(String[] args) {
        Test1 c = new Test1();
        String string = c.get();
        System.out.print(string);
    }
}