27

非静的メソッドが静的変数をどのように変更できるのか疑問に思っています。静的メソッドは他の静的メソッドと静的変数にしかアクセスできないことを知っています。しかし、反対側は本当ですか?非静的メソッドは非静的変数のみにアクセスできますか? 例えば:

public class SampleClass {
  private static int currentCount = 0;

  public SampleClass() {
    currentCount++;
  }

  public void increaseCount() {
    currentCount++;
  }
}

このコードはコンパイルされますが、静的アクセス権限に関して理由を知りたいです。

4

9 に答える 9

17

いいえ、非静的メソッドは静的メンバーにアクセスできます。これが false になる唯一の方法は、非静的コンテキストが静的メンバーにアクセスできない場合です (たとえば、静的メンバーはクラスに対してプライベートであり、非静的コードはそのクラスにありません)。静的変数は、インスタンス フリーの変数/メソッドを提供するために存在します。たとえば、Game クラスとハイスコア変数がある場合、ハイスコアは静的 (インスタンスなしでアクセス可能) であり、すべてのゲームの後 (Game クラスのインスタンス) になります。スコアがハイスコアよりも大きい場合、非静的コンテキストからハイスコアを変更できます。

于 2013-06-21T19:14:59.543 に答える
1

非静的メソッドは、クラスのメンバーとして静的変数と静的メソッドの両方にアクセスできます

デモコード

public class Static_Class {
    protected static String str;
    private static int runningLoop;

    static{
        str = "Static Block";
    }

    /**
     * Non-Static Method Accessing Static Member  
     */
    public void modifyStaticMember(){
        str = "Non-Static Method";      
    }

    /**
     * Non-Static Method invoking Static Method
     */
    public void invokeStaticMethod(){
        String[] args = {};
        if(runningLoop == 0){
            runningLoop++;
            main(args); 
        }
        //Exiting as it will lead to java.lang.StackOverflowError
        System.exit(0);
    }

    public static void main(String[] args) {
        Static_Class instance = new Static_Class();
        System.out.println(str);
        instance.modifyStaticMember();

        // Changed Value persists 
        System.out.println(str);

        //Invoking Static Method
        instance.invokeStaticMethod();

    }
}
于 2016-06-17T07:23:52.243 に答える
0

静的メソッドは非静的フィールドを変更できません。非静的フィールド (クラス外) を使用するには、クラス オブジェクトをインスタンス化する必要がありますが、静的メソッドを使用する場合、オブジェクトのインスタンス化はまったく必要ありません。これが、非静的メソッド (オブジェクトのインスタンス化を必要としない) がインスタンス化する必要があるフィールドを変更するのが合理的でない理由です。

このため - 静的メソッドは静的フィールドのみにアクセスできます (または他の静的メソッドを呼び出すことができます)。

しかし、あなたが別の方法で可能だと述べたように、非静的メソッドは、そのクラスのすべてのオブジェクトに対して静的である静的フィールドを変更できます。

于 2014-07-05T13:01:22.247 に答える
0

静的変数はクラス変数であり、インスタンス変数やローカル変数ではありません。そのため、非静的メソッドでも静的変数を使用できます。静的変数はオブジェクトごとではありません。静的変数には、プログラム全体で使用される 1 つのコピーがあります。

于 2015-05-18T09:41:24.893 に答える