1. ホーム
  2. Java

javaの非静的メソッドを静的に参照することができない

2022-02-09 14:34:41


原文のままです。  https://blog.csdn.net/q610376681/article/details/49359819

今日、コードを打ち込んでいてこの問題にぶつかったのですが、一般的な問題は次のように単純化することができます。

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 bookに目を通すことで判明しました。

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

説明 クラスの静的メソッドまたはプロパティは、本質的に、クラスのメンバーではなく、Java仮想マシンがクラスをロードするとき、これらの静的なものはすでにオブジェクトを持って、それだけで"居住"クラスで、クラスのコンストラクタ(コンストラクタ)によってインスタンス化する必要はありません。非静的プロパティまたはメソッドは、クラスのロードでは存在しない、クラスのインスタンスオブジェクトの存在に依存できるコンストラクタ後に実行する必要がありながら。だから、コンパイラは、静的なメソッドの非静的なメソッドを呼び出すときにエラーが報告されます(型から非静的なメソッドfunc()への静的な参照を行うことはできません)。

javaでは、メソッド内のローカル変数をstaticとして宣言することはできません。
main() 関数は静的で、戻り値はなく、形式的な参照は配列です。
非静的メンバが静的メンバを任意に呼び出せる
スタティックは反人間的であることがわかった。 
おそらく、複数のクラスが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);
    }
}